Optimizador de compresión de imágenes PDF de línea de comandos

No necesariamente tiene que ser CMD pero lo prefiero. Aunque tiene que ser gratis.

He probado muchos, pero todos parecen optimizar algunos datos de bit dentro de los PDF y ni siquiera tocan la compresión de imagen, que es lo que busco, ya que este es el principal culpable del tamaño de mis PDF generados desde Google Docs.

"He probado muchos diferentes". ¿Cuáles?

Respuestas (1)

No estoy seguro de lo que quiere decir exactamente con "optimizador de compresión":

  1. Es posible que desee dejar cada objeto PDF que pueda ser relevante para las páginas procesadas "tal cual" e imponer la compresión sin pérdidas más alta posible a los flujos de objetos que aún no están comprimidos, o que están comprimidos/codificados con un no- método de compresión tan eficiente.

  2. Es posible que esté dispuesto a aceptar, además de las opciones enumeradas en "1", algunos otros cambios en el archivo PDF:

    • Reducción de resolución de imagen.
    • Fuentes de subconjunto que están completamente incrustadas.
    • Desincrustar fuentes totalmente incrustadas si pertenecen a las fuentes PDF Base 14 .
    • Convierte colores CMYK a colores RGB.
    • Convierte imágenes en color a imágenes en escala de grises.
    • Elimina la mayoría de los metadatos del PDF.
    • Deseche los objetos no utilizados.
    • Si la versión final del documento PDF es el resultado de actualizaciones incrementales , redúzcalo a esta versión final (desechando todas las versiones anteriores "conservadas en el interior").
    • Deseche cualquier perfil ICC potencialmente incrustado.

Una línea de comandos de Ghostscript lo suficientemente sofisticada y larga puede ayudar con eso. Hará una conversión de PDF a PDF:

gs                                         \
  -o smaller-downsampled+gray.pdf          \
  -sDEVICE=pdfwrite                        \
  -dCompressPages=true                     \
  -dCompressFonts=true                     \
  -dDownsampleColorImages=true             \
  -dDownsampleGrayImages=true              \
  -dDownsampleMonoImages=true              \
  -dColorImageResolution=72                \
  -dGrayImageResolution=72                 \
  -dMonoImageResolution=72                 \
  -dColorImageDownsampleThreshold=1.0      \
  -dGrayImageDownsampleThreshold=1.0       \
  -dMonoImageDownsampleThreshold=1.0       \
  -dProcessColorModel=/DeviceGray          \
  -dColorConversionStrategy=/Gray          \
  -dColorConversionStrategyForImages=/Gray \
  -dCompatibilityLevel=1.4                 \
  -dEmbedAllFonts=false                    \
  -c ".setpdfwrite <</AlwaysEmbed [ ] /NeverEmbed [/Courier /Courier-Bold /Courier-Oblique /Courier-BoldOblique /Helvetica /Helvetica-Bold /Helvetica-Oblique /Helvetica-BoldOblique /Times-Roman /Times-Bold /Times-Italic /Times-BoldItalic /Symbol /ZapfDingbats] /ColorImageFilter /DCTEncode /GrayImageFilter /DCTEncode /MonoImageFilter /CCITTFaxEncode /OutputICCProfile (None)>> setdistillerparams" \
  -f big.pdf

(Para Windows, cambie gsa gswin32c.exeo gswin64c.exey cambie todos los marcadores de continuación de línea \a ^...) El comando anterior cambiará lo siguiente:

  1. Convierta todas las imágenes a un espacio de color en escala de grises.
  2. Desincruste todas las fuentes Helvetica, Courier, Times, Symbol y ZapfDingbats (la "Base 14" para PDF).
  3. Reduzca la resolución de todas las imágenes a 72 PPI si la resolución actual de la imagen respectiva es superior a 72 PPI.
  4. Cambie toda la compresión de imágenes a compresión JPEG ( /DCTEncode) si es posible.
  5. Deseche los perfiles de salida ICC incrustados, si es posible.

Actualización/Corrección

Mi comando de ejemplo original tenía un error tipográfico. Había contenido estas líneas, que son incorrectas :

 -sProcessColorModel=/DeviceGray          \
 -sColorConversionStrategy=/Gray          \
 -sColorConversionStrategyForImages=/Gray \

Hay dos maneras diferentes de expresar estas opciones correctamente :

  1. Uso -d para estos parámetros. En ese caso, debe haber barras diagonales/para los valores de los parámetros:

    -dProcessColorModel=/DeviceGray          \
    -dColorConversionStrategy=/Gray          \
    -dColorConversionStrategyForImages=/Gray \
    
  2. Uso -s para estos parámetros. /En ese caso , se deben omitirlas barras diagonales

    -sProcessColorModel=DeviceGray          \
    -sColorConversionStrategy=Gray          \
    -sColorConversionStrategyForImages=Gray \
    

(Sin embargo, no existe una regla general que se pueda derivar para todas las opciones de Ghostscript a partir de este ejemplo, solo se aplica a un cierto subconjunto de parámetros donde -s...o -d...se puede usar alternativamente de esta manera).

Así que lo entendí exactamente al revés. ¡Perdón por la confusión que esto causó!

En cualquier caso, el comando modificado funciona para los OP vinculados big.pdfahora. derriba

  • el tamaño original de 2,5 MByte para un PDF de 1 página que contiene una imagen en color para
  • el nuevo tamaño de 53 kByte para un PDF que contenga una imagen en escala de grises.

Datos de la imagen original en el interior big.pdf:

$ pdfimages -list big.pdf

  page num  type width height color comp bpc  enc interp objID x-ppi y-ppi size ratio
  -----------------------------------------------------------------------------------
     1   0 image  1600  1071  rgb     3   8  image  no     7 0   142   142 2502K  50%  

Datos para la nueva imagen dentro smaller-downsampled+gray.pdf:

$ pdfimages -list smaller-downsampled+gray.pdf

  page num  type width height color comp bpc  enc interp objID x-ppi y-ppi size ratio
  -----------------------------------------------------------------------------------
     1   0 image   800   535  gray    1   8  jpeg   no    12 0    71    71 48.5K  12%
Perdón por la ignorancia, pero solo necesito un poco de explicación ya que nunca antes había usado ghostscript. Lo descargué y lo puse en una carpeta en el disco, también puse un pdf llamado gray.pdf en el mismo directorio e hice un lote donde copié todo lo anterior pero cambié gs a gswin64.exe y muestra algunos errores, así que Eliminé todos los "\" pero aún nada.
@FateTrader: en un archivo de Windows * .bat, también debe cambiar los finales de línea a ^. Y posiblemente elimine los espacios del comienzo de las líneas. (Pensé que alguien que pedía explícitamente una herramienta de línea de comandos lo sabía).
Ah, y "big.pdf" obviamente es la entrada , más pequeño-downsampled+gray.pdf es el archivo de salida.
Cambié todos los "/" a "^" y eliminé los espacios delante de las líneas y entre los comandos de fin de línea y "^" y todavía nada. Ver la captura de pantalla oi60.tinypic.com/20r0l09.jpg
@FateTrader: NO hablé de reemplazar /, ¡hablé de reemplazar \ como marcadores de continuación de línea! Tampoco hice publicidad para eliminar los espacios al final de las líneas antes de los (nuevos) ^letreros (¡debe quedar al menos 1 espacio!).
Suspiro ... @FateTrader: Además, no recomendé usargswin64.exepara Windows, pero recomendégswin64c.exe(observe elcantes del.exe?!?)
@FateTrader: debe proporcionar un (enlace a una) muestra 'big.pdf' para probar con...
Lo siento, quise decir "\", de todos modos lo intenté con "gswin64c.exe" y todavía no tuve suerte. He subido todos los archivos aquí mediafire.com/?37yjemt3eo28obq y el bate que estaba usando es run2.bat
@FateTrader: ¡Mi error! Cometí un error al escribir el comando original. Ver mi respuesta corregida arriba. Perdón por haber causado confusión con eso.
Hmm.. @KenS dice que simplemente no hay *ColorConversionStrategyForImagesinterruptor ( 1 , 2 , 3 , 4 ). (Y no hay tal cadena en el código).