tamaño - metadata pdf
Cambiar el tamaño de un PDF usando Ghostscript (5)
Debería agregar el -dFIXEDMEDIA
:
gs /
-o output.pdf /
-sDEVICE=pdfwrite /
-sPAPERSIZE=a4 /
-dFIXEDMEDIA /
-dPDFFitPage /
-dCompatibilityLevel=1.4 /
input.pdf
-dFIXEDMEDIA
siempre se requiere si necesita forzar un papel / página / tamaño de papel específico e ignorar el papel / página / tamaño de medio especificado en el documento. Porque PDF siempre tiene un tamaño de papel / página / medio definido (PostScript podría tener, o no podría haber ...).
(Mi -o ...
es más corto y evita que uno agregue -dBATCH -dNOPAUSE
- pero funciona solo para versiones más recientes de Ghostscript).
Estoy tratando de escalar un PDF que, por ejemplo, es pequeño, de tamaño A4 hasta A4.
Esto funciona bien con los documentos de retrato. El documento se amplía correctamente y luego se agrega relleno a la parte superior.
Sin embargo, en los documentos de paisaje, el relleno no se agrega. Por lo tanto, el documento terminará siendo la altura correcta para A4, pero luego no lo suficientemente ancho, ya que el relleno no se agrega en el lado del documento (como esperaba).
Esto es lo que uso para que funcione en documentos de retrato A4:
gs /
-sOutputFile=output.pdf /
-sDEVICE=pdfwrite /
-sPAPERSIZE=a4 /
-dCompatibilityLevel=1.4 /
-dNOPAUSE /
-dBATCH /
-dPDFFitPage /
input.pdf
Es una pena que las características de pstops, un paquete muy útil para escalar y combinar páginas de postscript, no parezcan estar disponibles para pdfs. Hay un programa llamado pdftopdf, pero lo hace (por lo que puedo ver) hacer las mismas cosas que pstops. Puedes hacer un archivo ps (I print to file in evince), usar pstops, y luego ps2pdf, pero eso es bastante torpe.
Parece que el tamaño de la salida se puede (mejor) forzar especificando el tamaño en puntos y no utilizando -dPDFFitPage. Estaba obteniendo tamaños de puntos fraccionarios, lo cual era malo. Lo siguiente es para la impresión A5 utilizando un servicio de impresión bajo demanda. "Real" A5 tiene 420x595 puntos. Encontré que el uso de -sPAPERSIZE = a5 daba tamaños de página de punto fraccionario, pero eso podría deberse a que el original era poco consistente.
gs /
-o output.pdf /
-sDEVICE=pdfwrite /
-dDEVICEWIDTHPOINTS=419 -dDEVICEHEIGHTPOINTS=595 /
-dFIXEDMEDIA /
-dCompatibilityLevel=1.4 /
input.pdf
Para probar esto, descubrí que al usar PDFshuffler pude exportar páginas individuales, y luego con pdfinfo pude obtener el tamaño preciso de esas páginas. Esto confirmó que el uso de parámetros del dispositivo ayudó explícitamente.
Primero, gracias por todos los que publicaron aquí.
Tengo este pequeño script llamado pdfScale que absorbió partes de las respuestas publicadas aquí. Así que decidí publicar mis 2 centavos. Estoy usando un poco de una mezcla de las respuestas de Kurt y Tim. Sin embargo, más parecido a Tim. He jugado con esto durante unos días y aquí está mi conclusión parcial sobre los métodos publicados aquí:
Establecer tamaño de papel por nombre con -sPAPERSIZE
- Fácil de pasar el nombre del papel (Ej. A4)
- Puede que no produzca un 100% de puntos precisos
- May Flip Landscape <> Portrait
Establezca el tamaño del papel en puntos-PS -dDEVICEWIDTHPOINTS
, -dDEVICEHEIGHTPOINTS
- Asegúrate de obtener el tamaño que deseas en puntos
- Puede voltear WIDTH <> HEIGHT usted mismo
- Necesitas saber los tamaños en Puntos
- No es tan fácil guiarlo, ya que necesitará el nuevo tamaño de página en puntos y también necesitará los tamaños de página de la fuente si desea detectar paisaje / retrato.
- También puede establecer papeles definidos personalizados (de cualquier tamaño que desee realmente).
- Estaba usando
-dDEVICEWIDTH
,-dDEVICEHEIGHT
lugar de la versión de puntos más larga, pero ambos parecen hacer lo mismo (ambos obtienen puntos).
Como mi script bash ya es capaz de obtener tamaños de página de origen y me gustó la idea de poder establecer tamaños de página personalizados, decidí centrarme en establecer el tamaño de la página en puntos. También había incluido los tamaños de papel GS en mi script (con nombres y tamaños). Entonces, obtener esa información también fue fácil.
El uso de -dFIXEDMEDIA
parece ser una necesidad en ambos casos, como se señaló anteriormente.
Así que así es como fue mi enfoque (de forma guionizada)
- Obtener tamaños de página PDF de origen (para detección de volcado)
- Obtener el tamaño de página del objetivo en puntos (por ejemplo, A4> 595x842)
- Comprueba que tengan la misma orientación o voltea el objetivo si es necesario
- Ejecutar GS con puntos o puntos volteados
Cuando estaba tratando de arreglar el problema de auto rotación, encontré esta otra respuesta de Kurt . Se trata de usar -dAutoRotatePages
. Solo copiando una parte de su respuesta aquí:
-
-dAutoRotatePages=/None
- conserva la orientación de cada página; -
-dAutoRotatePages=/All
- rota todas las páginas (o ninguna) dependiendo de un tipo de "decisión de la mayoría"; -
-dAutoRotatePages=/PageByPage
- auto rota páginas individualmente.
Mi script está predeterminado en PageByPage
pero eso es ajustable. Funcionó bien en mis pruebas. El uso de -dAutoRotatePages
también parece reducir la necesidad de voltear previamente el tamaño de página, aunque no es lo mismo. Mantuve ambas opciones.
Mi pequeña aplicación fue creada originalmente para escalar archivos PDF (sin cambiar el tamaño de la página). Luego agregué ahora la funcionalidad para hacer una, la otra o ambas. Sin embargo, todavía no podía hacerlo todo en una sola llamada GS.
Esto es lo que estoy llamando para cambiar el tamaño, cambiando las variables a valores reales. Esto es para tamaño de retrato A4 con auto rotación de PageByPage
:
gs /
-q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dSAFER /
-dCompatibilityLevel="1.5" -dPDFSETTINGS="/printer" /
-dColorConversionStrategy=/LeaveColorUnchanged /
-dSubsetFonts=true -dEmbedAllFonts=true /
-dDEVICEWIDTHPOINTS=595 -dDEVICEHEIGHTPOINTS=842 /
-dAutoRotatePages=''/PageByPage'' /
-dFIXEDMEDIA -dPDFFitPage /
-sOutputFile=''../myOutputFile.pdf'' /
-f ''../input.pdf''
Tenga en cuenta que también estoy usando -dFIXEDMEDIA
AND -dPDFFitPage
. Debido a que esto se ajusta a la página, la otra parte de mi script puede ser útil para escalar los contenidos dentro del PDF después del cambio de tamaño (especialmente si la proporción del PDF cambió mucho). Y esa es una de las razones por las que siempre ejecuto la escala después de cambiar el tamaño en mi script (en modo mixto).
Sobre los problemas de fracciones al usar el Nombre del papel, tuve que pasarme eso antes de redondear las conversiones de mm / pulgadas a puntos. Después de que comencé a redondearlos, parecen ser siempre los necesarios. Parece extraño que GS arrinconase esos valores.
Por lo tanto, mi conclusión es que la parte más difícil es encontrar una solución que funcione en general en diferentes documentos con diferentes tamaños y orientaciones. Todavía no estoy seguro de estar usando la solución adecuada. Pero al permitir que el usuario cambie Flip Detection y GS Auto-Rotation, espero tener una solución para al menos la mayoría de los casos.
También reconstruí la mayor parte del código en el proceso y ahora es bastante fácil de leer. Puede ser útil verificarlo si quiere automatizar dicha tarea usted mismo. También es útil para escalar / cambiar el tamaño de archivos PDF también, por supuesto:
PD: pdfScale tiene sus orígenes en este hilo de .
Su comando no hace ninguna escala en absoluto, solo toma un archivo PDF y lo convierte en un archivo PDF.
Sugeriría que intentes agregar -dPDFFitPage, que escalará la página en el archivo PDF para que coincida con el tamaño de página actual (tal como especifica -sPAPERSIZE en este caso).
Por lo general, esto está pensado para trabajar con impresoras que tienen un tamaño de papel definido, por lo que puede que no funcionen bien con el dispositivo pdfwrite, que no tiene un tamaño de página fijo, pero sí lo puede intentar.