2011-09-16 100 views
32

Estoy intentando escalar un PDF que, por ejemplo, es pequeño, de tamaño A4 hasta A4.Cambiar el tamaño de un PDF usando Ghostscript

Esto funciona bien con 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 no se agrega el relleno. 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 yo utilizo para tener que trabajar para documentos A4 vertical:

gs \ 
-sOutputFile=output.pdf \ 
-sDEVICE=pdfwrite \ 
-sPAPERSIZE=a4 \ 
-dCompatibilityLevel=1.4 \ 
-dNOPAUSE \ 
-dBATCH \ 
-dPDFFitPage \ 
    input.pdf 

Respuesta

7

Su comando no hace ningún ajuste en absoluto, sólo se necesita un archivo PDF y la convierte en un archivo PDF.

Le sugiero que intente agregar -dPDFFitPage, que escalará la página en el archivo PDF para que coincida con el tamaño de página actual (según lo especificado por -sPAPERSIZE en este caso).

Por lo general, está diseñado para trabajar con impresoras que tienen un tamaño de papel definido, por lo que puede no funcionar bien con el dispositivo pdfwrite que no tiene un tamaño de página fijo, pero es posible.

+0

Gracias por la respuesta, ya he usado el argumento -dPDFFITPAGE y esto no funciona. – Matt

+0

Hay formas (feas) para escalar la entrada de PDF, pero por lo general no es necesario. ¿Puedes compartir un archivo de ejemplo para mirar? – KenS

+0

@Matt: Creo que funcionará si agrega el modificador '-dFIXEDMEDIA' ... –

42

debe agregar el interruptor -dFIXEDMEDIA:

gs \ 
-o output.pdf \ 
-sDEVICE=pdfwrite \ 
-sPAPERSIZE=a4 \ 
-dFIXEDMEDIA \ 
-dPDFFitPage \ 
-dCompatibilityLevel=1.4 \ 
    input.pdf 

-dFIXEDMEDIA siempre es necesario si necesita forzar un documento/página de tamaño específico/media e ignorar la página/tamaño de papel/soportes 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 salva de la adición de -dBATCH -dNOPAUSE -., Pero sólo funciona para las versiones más recientes de Ghostscript)

+3

Gracias, para A5 y una línea: 'gs -sDEVICE = pdfwrite -sPAPERSIZE = a5 -dFIXEDMEDIA -dPDFFitPage -dCompatibilityLevel = 1.4 -o out.pdf in.pdf' – Dorian

+1

Gracias , ¡funciona! Utilicé con A3: 'gs -o outputA3.pdf -sDEVICE = pdfwrite -sPAPERSIZE = a3 -dFIXEDMEDIA -dPDFFitPage -dCompatibilityLevel = 1.4 input.pdf' – Tenaciousd93

+0

¿Cómo prevenir la reducción de calidad masiva que ocurre con este comando? – JohnnyFromBF

-1

Es una pena que las características de pstops, un paquete muy útil para de escala y la combinación de páginas de PostScript, no parece estar disponible para pdfs. Hay un programa llamado pdftopdf, pero lo hace (en la medida en que I puede ver) hacer las mismas cosas que pstops. Puede crear un archivo ps (I print to file in evince), usar pstops, y y luego ps2pdf, pero eso es bastante torpe.

5

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, encontraron que el uso de PDFshuffler I fue capaz de exportar las páginas individuales, y luego con PDFInfo yo era capaz de obtener el tamaño preciso de esas páginas. Esto confirmó que el uso de parámetros del dispositivo ayudó explícitamente.

3

Primero, gracias a 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í es mi conclusión parcial sobre los métodos publicados aquí:

establecer tamaño de papel por Nombre con -sPAPERSIZE

  • fácil simplemente pasar el nombre de papel (Ej. a4)
  • puede no producir el 100% del tamaño exacto puntos
  • invertirlo paisaje <> Retrato

establecer tamaño de papel en el PS-puntos -dDEVICEWIDTHPOINTS, -dDEVICEHEIGHTPOINTS

  • asegura que tenga el tamaño que desee en puntos
  • se puede voltear ANCHO <> ALTURA mismo
  • You need to know the sizes in Points
  • No es tan fácil para guiar a su alrededor, ya que necesitará el nuevo tamaño de página en puntos y también necesitaría 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 realmente desee).
  • Estaba usando -dDEVICEWIDTH, -dDEVICEHEIGHT en 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 página en puntos. También había incluido el GS Paper Sizes 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 esta es la forma en que mi enfoque fue (de una manera con guión) tamaños

  1. Obtener página Fuente PDF (para la detección FLIP)
  2. Obtener el tamaño de página del objetivo en puntos (Ej. A4> 595x842)
  3. Comprobar que tienen la misma orientación o voltear destino si es necesario
  4. Run GS con puntos o volteado puntos

Cuando estaba tratando de solucionar el problema de auto rotación, I found this other Kurt response. Esto 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 - gira automáticamente las páginas de forma individual.

Mi secuencia de comandos tiene como valor predeterminado PageByPage pero 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 pidiendo para cambiar el tamaño, cambiando las variables a valores reales. Esto es para tamaño A4 retrato con PageByPage auto-rotación:

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 yo también estoy usando -dFIXEDMEDIA Y -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).

Acerca de 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 lo difícil es encontrar una solución que funcione en todos los ámbitos 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 he reconstruido la mayor parte del código en el proceso y es bastante fácil de leer ahora. Puede ser útil verificarlo si quiere automatizar dicha tarea usted mismo. También es útil para la escala solo/cambiar el tamaño de archivos PDF así, por supuesto:

https://github.com/tavinus/pdfScale

PS: pdfScale tiene sus orígenes on this StackOverflow thread.

Cuestiones relacionadas