Cómo saber si un archivo PDF está comprimido o no y (des) comprimirlo

18

Acabo de enterarme de que los archivos PDF se pueden comprimir para reducir el tamaño de su disco.

  1. Me preguntaba cómo saber si un archivo PDF ya se ha comprimido.
  2. ¿Qué aplicaciones / comandos se pueden usar para comprimir o descomprimir un archivo PDF?

Mi entorno es Linux Ubuntu 10.10.


Algunos intentos no dan resultados satisfactorios:

  1. Aquí están los resultados de intentarlo pdftk:

    $ pdftk 3.pdf output 5.pdf uncompress 
    $ pdftk 3.pdf output 3comp.pdf compress 
    $ ls -l 3.pdf 3comp.pdf 5.pdf
    -rwxrwx--- 1 root plugdev  8652269 2011-07-30 12:27 3comp.pdf
    -rwxrwx--- 1 root plugdev  8652319 2011-07-29 22:15 3.pdf
    -rwxrwx--- 1 root plugdev 16829828 2011-07-30 12:27 5.pdf
    

    Las propiedades de los archivos muestran que no todos están optimizados.

  2. Resultados de la conversión a ps y luego de vuelta a pdf:

    $ pdf2ps 3.pdf 3.ps
    $ ps2pdf 3.ps 3c.pdf
    $ ls -l 3.pdf 3.ps 3c.pdf
    -rwxrwx--- 1 root plugdev   8808946 2011-07-30 13:14 3c.pdf
    -rwxrwx--- 1 root plugdev   8652319 2011-07-29 22:15 3.pdf
    -rwxrwx--- 1 root plugdev 122375966 2011-07-30 13:14 3.ps
    
StackExchange para todos
fuente
No puedo probarlo ahora, ya que no tengo un PDF comprimido a mano, pero inténtalo file. Debe mostrar si el archivo está comprimido o no.
polemon
1
@polemon: ¡Gracias! No lo hace. La salida $file 3.pdfes3.pdf: PDF document, version 1.4
StackExchange for All
Tenga en cuenta que las secuencias individuales en el archivo PDF se pueden comprimir. Por lo tanto, preguntar "está todo el archivo PDF comprimido" es la pregunta incorrecta (aunque en muchos casos todas, o la mayoría de las transmisiones estarán comprimidas o sin comprimir).
dirkt

Respuestas:

30

en breve:

Para saber si ya está comprimido:

strings your.pdf | grep /Filter

Para ( des ) comprimir un PDF, use QPDF

qpdf --stream-data=compress your.pdf compressed.pdf
qpdf --stream-data=uncompress compressed.pdf uncompressed.pdf  

explicación:

La palabra clave "Filtro" dentro de un archivo pdf es un indicador del método de compresión utilizado. Algunos de ellos son:

CCITT G3 / G4 - utilizado para imágenes monocromas
JPEG - un algoritmo con pérdida que se utiliza para imágenes
JPEG2000 - una alternativa más moderna a JPEG, que también se utiliza para comprimir imágenes
Flate - utilizado para comprimir texto así como imágenes
JBIG2 - una alternativa a Compresión CCITT para imágenes monocromas
LZW: se usa para comprimir texto e imágenes, pero se reemplaza por Flate
RLE: se usa para imágenes monocromáticas
ZIP: se usa para imágenes en escala de grises o en color

(copiado de aquí ).

Sin embargo, dada la compleja estructura de archivos PDF, la mayoría de las veces alguna parte (o "flujo") del PDF ya se comprimirá de alguna manera (y se mostrará cuando grepping / Filter) mientras que otra parte no lo estará, así que no hay respuesta SÍ / NO a la pregunta de si el PDF está comprimido.
Una forma de superar esto sería agregar la -copción a grep, que devuelve el número de ocurrencias, para que pueda ver relativamente qué tan bien está comprimido. por ejemplo, si devuelve menos de 10, es bastante no comprimido.strings "large.pdf" | grep -c /Filter

Otra propiedad relacionada con el tamaño de los archivos PDF es si se han optimizado para un acceso rápido, con archivos PDF "optimizados" de mayor tamaño, para citar de Wikipedia :

Hay dos diseños para los archivos PDF: no lineal (no "optimizado") y lineal ("optimizado"). Los archivos PDF no lineales consumen menos espacio en disco que sus contrapartes lineales, aunque su acceso es más lento porque partes de los datos requeridos para ensamblar páginas del documento están dispersos por todo el archivo PDF. Los archivos PDF lineales (también llamados archivos PDF "optimizados" o "optimizados para la web") se construyen de manera que se puedan leer en un complemento del navegador web sin esperar a que se descargue todo el archivo, ya que se escriben en el disco en un moda lineal (como en el orden de las páginas). Los archivos PDF pueden optimizarse con el software Adobe Acrobat o QPDF.

Puede verificar si el PDF está optimizado usando pdfinfo your.pdf.

Philomath
fuente
¡Gracias! (1) Los resultados del uso de qpdf son similares al uso de pdftk: con la compresión, el tamaño realmente se hizo un poco más grande (extraño), y con descomprimir, el tamaño se hizo mucho más grande, casi se duplicó. (2) ¿Tratan pdftk y gpdf de lograr lo mismo, usando opciones de compresión y descompresión?
StackExchange for All
@Tim: (lo siento, no estaba aquí). para (1), como expliqué, el PDF ya está parcialmente comprimido (muy probablemente), es por eso que la compresión no ahorra demasiado (y la descompresión lo hace mucho más grande, porque descomprime todas las secuencias comprimidas). (2) probablemente qpdfy pdftkhaga más o menos lo mismo con respecto a la compresión, pero también qpdfpuede optimizar (además de muchas más cosas).
Philomath
10

pdftk es una herramienta para realizar algunas operaciones en archivos PDF, como compresión / descompresión:

$ pdftk test.pdf output compressed_test.pdf compress
uloBasEI
fuente
¡Gracias! Me preguntaba cómo saber si un archivo pdf ya se ha comprimido.
StackExchange for All
1
@Tim: pdfinfo file.pdfle indica si un PDF está optimizado . Sin embargo, no estoy seguro de si eso significa comprimido o no.
nico
1
@uloBasEI: probé su comando usando pdftk para la compresión, pero el tamaño casi no cambió. Si descomprimo, el tamaño del archivo se duplica. Las propiedades del archivo original, el archivo comprimido y los archivos sin comprimir muestran que no están optimizados.
StackExchange for All
@nico: ¡Gracias! Vea mi comentario arriba y mi actualización. Parece que la compresión y la optimización no implican entre sí?
StackExchange for All
@Tim: vea también esto: pandemoniumillusion.wordpress.com/2008/05/07/…
nico
1

Encontré el método de compresión en el archivo pdf. Abra el PDF con editor de texto. Ejecute un CCITT de búsqueda o de búsqueda si no se encuentra, ingrese JPEG, luego Flate, luego JBIG2, luego LZW, luego RLE y luego ZIP.
¡Suena peor de lo que es! Muy fácil de encontrar el método de compresión del flujo de datos.

bizhubkey1
fuente
Esto es bastante dudoso. Usé su método para verificar un archivo PDF sin comprimir (descomprimido por qpdf) usando grep como en grep -E "(CCITT | JPEG | Flate | LZW | RLE | ZIP)" uncompressed.pdf y devuelve este mensaje Archivo binario sin comprimir.pdf partidos . Parece que detecta que el archivo descomprimido.pdf contiene patrones LZW y RLE.
user91822
-1

Solo verifique sus propiedades; dirá si el archivo está comprimido o no.

rosni
fuente
Creo que la pregunta de Heidi es con qué programa verificar las propiedades, en particular con los programas basados ​​en línea de comandos programables.
Caleb
> Simplemente verifique sus propiedades, ¿qué programa [de código abierto] podría usarse para hacer esto?
Maxim