Uso Ghostscript con las siguientes opciones tomadas de aquí.
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen \
-dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf
Puede encontrar que pdftocairo
(de Poppler) puede crear archivos PDF más pequeños, pero tenga en cuenta que eliminará algunas funciones (como los hipervínculos).
Puede obtener buenos resultados convirtiendo de PDF a Postscript y luego de vuelta a PDF usando
pdf2ps file.pdf file.ps
ps2pdf -dPDFSETTINGS=/ebook file.ps file-optimized.pdf
El valor del argumento -dPDFSETTINGS
define la calidad de las imágenes en el PDF resultante. Las opciones son, de baja a alta calidad:/screen
, /default
, /ebook
, /printer
, /prepress
, consulte http://milan.kupcevic.net/ghostscript-ps-pdf/ para obtener una referencia.
El archivo Postscript puede volverse bastante grande, pero los resultados valen la pena. Pasé de un PDF de 60 MB a un archivo Postscript de 140 MB, pero terminé con un PDF optimizado de 1,1 MB.
Si busca un software gratuito (como en 'libre'), Ghostscript es seguramente su mejor opción. Sin embargo, no siempre es fácil de usar:algunas de sus opciones de procesamiento (muy poderosas) no son fáciles de encontrar documentadas.
Eche un vistazo a esta respuesta, que explica cómo ejecutar un control más detallado sobre la reducción de resolución de la imagen que el genérico -dPDFSETTINGS=/screen
hace (que define algunos valores predeterminados generales, que es posible que desee anular):
- ¿Cómo reducir la resolución de imágenes dentro de un archivo pdf?
Básicamente, le dice cómo hacer que Ghostscript reduzca la resolución de todas las imágenes a una resolución de 72 ppp (este valor es lo que -dPDFSETTINGS=/screen
usos, es posible que desee ir aún más bajo):
-dDownsampleColorImages=true \
-dDownsampleGrayImages=true \
-dDownsampleMonoImages=true \
-dColorImageResolution=72 \
-dGrayImageResolution=72 \
-dMonoImageResolution=72 \
Si desea probar si Ghostscript también puede 'desincrustar' las fuentes utilizadas (a veces funciona, a veces no, dependiendo de la complejidad de la fuente incrustada y también del tipo de fuente utilizado ), puede intentar agregar lo siguiente a su comando gs:
gs \
-o output.pdf \
[...other options...] \
-dEmbedAllFonts=false \
-dSubsetFonts=true \
-dConvertCMYKImagesToRGB=true \
-dCompressFonts=true \
-c ".setpdfwrite <</AlwaysEmbed [ ]>> setdistillerparams" \
-c ".setpdfwrite <</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 /Arial]>> setdistillerparams" \
-f input.pdf
Actualizar
Una opción que había pasado por alto en mi respuesta original es agregar
-dDetectDuplicateImages=true
a la línea de comandos. Este parámetro hace que Ghostscript intente detectar cualquier imagen que esté incrustada en el PDF varias veces. Esto puede suceder si usa una imagen como logotipo o fondo de página, y si el software de generación de PDF no está optimizado para esta situación. Este solía ser el caso con versiones anteriores de OpenOffice/LibreOffice (probé la última versión de LibreOffice, v4.3.5.2, y ya no hace cosas tan estúpidas).
También sucede si concatenas archivos PDF con la ayuda de pdftk
. Para mostrarle el efecto y cómo puede descubrirlo, veamos un archivo PDF de muestra:
pdfinfo p1.pdf
Producer: libtiff / tiff2pdf - 20120922
CreationDate: Tue Jan 6 19:36:34 2015
ModDate: Tue Jan 6 19:36:34 2015
Tagged: no
UserProperties: no
Suspects: no
Form: none
JavaScript: no
Pages: 1
Encrypted: no
Page size: 595 x 842 pts (A4)
Page rot: 0
File size: 20983 bytes
Optimized: no
PDF version: 1.1
Versiones recientes de pdfimages
de Poppler La utilidad ha agregado soporte para un -list
parámetro, que puede listar todas las imágenes incluidas en un archivo PDF:
pdfimages -list p1.pdf
page num type width height color comp bpc enc interp objectID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------
1 0 image 423 600 rgb 3 8 jpeg no 7 0 52 52 19.2K 2.6%
Este PDF de muestra es un documento de 1 página que contiene una imagen comprimida con compresión JPEG, tiene un ancho de 423 píxeles y una altura de 600 píxeles y se muestra a una resolución de 52 PPI en la página.
Si concatenamos 3 copias de este archivo con la ayuda de pdftk
así:
pdftk p1.pdf p1.pdf p1.pdf cat output p3.pdf
entonces el resultado muestra estas propiedades de imagen a través de pdfimages -list
:
pdfimages -list p3.pdf
page num type width height color comp bpc enc interp objectID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------
1 0 image 423 600 rgb 3 8 jpeg no 4 0 52 52 19.2K 2.6%
2 1 image 423 600 rgb 3 8 jpeg no 8 0 52 52 19.2K 2.6%
3 2 image 423 600 rgb 3 8 jpeg no 12 0 52 52 19.2K 2.6%
Esto muestra que hay 3 objetos PDF idénticos (con los ID 4, 8 y 12) que están incrustados en p3.pdf
ahora. p3.pdf
consta de 3 páginas:
pdfinfo p3.pdf | grep Pages:
Pages: 3
Optimiza PDF reemplazando imágenes duplicadas con referencias
Ahora podemos aplicar la optimización mencionada anteriormente con la ayuda de Ghostscript
gs -o p3-optim.pdf -sDEVICE=pdfwrite -dDetectDuplicateImages=true p3.pdf
Comprobando:
pdfimages -list p3-optim.pdf
page num type width height color comp bpc enc interp objectID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------
1 0 image 423 600 rgb 3 8 jpeg no 10 0 52 52 19.2K 2.6%
2 1 image 423 600 rgb 3 8 jpeg no 10 0 52 52 19.2K 2.6%
3 2 image 423 600 rgb 3 8 jpeg no 10 0 52 52 19.2K 2.6%
Todavía hay una imagen en la lista por página, pero el ID del objeto PDF siempre es el mismo ahora:10.
ls -ltrh p1.pdf p3.pdf p3-optim.pdf
[email protected] 1 kp staff 20K Jan 6 19:36 p1.pdf
-rw-r--r-- 1 kp staff 60K Jan 6 19:37 p3.pdf
-rw-r--r-- 1 kp staff 16K Jan 6 19:40 p3-optim.pdf
Como puede ver, la concatenación "tonta" realizada con pdftk aumentó el tamaño del archivo original a tres veces el original. La optimización de Ghostscript lo redujo considerablemente.
Las versiones más recientes de Ghostscript pueden incluso aplicar el -dDetectDuplicateImages
por defecto. (AFAIR, v9.02, que lo introdujo por primera vez, no lo usó de forma predeterminada).