Qué hace realmente la compresión de PDF sin pérdida al tamaño del archivo

Una pasada de compresión de PDF sin pérdida reescribe la estructura interna del archivo en lugar de recodificar las imágenes que contiene. Medimos lo que eso ahorra realmente en ocho PDF de prueba. Tres de ellos salieron más grandes en al menos un modo, y el peor aumento fue del 20.8 por ciento.

El ahorro depende de cuán suelta estuviera la entrada. Los flujos de texto sin comprimir se redujeron entre un 84 y un 90 por ciento, mientras que un archivo cuyos flujos ya estaban comprimidos con Flate se redujo un 31.6 por ciento en modo estándar y creció un 3.0 por ciento en modo máximo. Una segunda pasada no cambió nada en ninguna muestra, y dos archivos con el mismo contenido pero estructura distinta produjeron una salida idéntica byte a byte. Nada de esto significa que el motor sea defectuoso; significa que una afirmación de tamaño necesita una medición detrás. El método completo, la tabla y los límites de la prueba están más abajo.

Toda herramienta de PDF tiene un botón Comprimir, y casi todas informan de éxito. Esa palabra cubre al menos dos operaciones muy distintas, y una de ellas puede devolverte un archivo más grande. Queríamos números en lugar de una promesa, así que creamos ocho PDF con estructuras internas deliberadamente diferentes y pasamos cada uno por qpdf 11.7.0 usando los mismos argumentos que pasa nuestra propia herramienta.

Comprimir PDF

La misma pasada de qpdf descrita aquí, compilada a WebAssembly y ejecutada dentro de la pestaña. Elige el nivel y luego lee tú mismo los tamaños antes y después.

Abrir Comprimir PDF

Qué hace realmente un botón de "comprimir PDF"

Lo primero que merece la pena saber es que esto normalmente no es recompresión de imágenes. Es una reescritura estructural. Un PDF guarda sus páginas como una colección de objetos y flujos, y la pasada los desempaqueta, elimina la duplicación, comprime los flujos que se almacenaron en bruto y escribe un archivo nuevo.

qpdf, el motor dentro de nuestra herramienta, hace eso con esta llamada en modo estándar:

--object-streams=generate --compress-streams=y --recompress-flate --compression-level=6

y esta otra en modo máximo, que añade un nivel superior y linealización para una visualización web rápida:

--object-streams=generate --compress-streams=y --recompress-flate --compression-level=9 --linearize

Fíjate en lo que no está en ninguna de las dos llamadas: nada que toque las imágenes incrustadas. Una pasada estructural no decodifica un JPEG que ya está dentro de un PDF, así que no puede encoger de forma significativa un documento escaneado o cargado de fotos. Lo que sí puede hacer es eliminar la ineficiencia que se acumuló mientras se construía el archivo. Por eso el ahorro depende de la entrada y no de cuánto se esfuerce la herramienta.

Cómo se realizó la medición

Se generaron ocho muestras para aislar una propiedad estructural cada una: un archivo mínimo de una página, un archivo de tres páginas, el mismo documento de veinte páginas con flujos comprimidos y sin comprimir, un archivo de cien páginas con muchos objetos, un archivo de una página rellenado con un comentario basura, un archivo con un JPEG incrustado y un archivo con un pequeño paquete XMP sin comprimir. Cada archivo se procesó después con los argumentos anteriores, dos veces en el caso del modo estándar, y se registraron la cuenta de bytes y el hash SHA-256 cada vez.

  1. Genera las muestras con un script, no a mano. Eso hace que cada una sea reproducible y evita que la prueba dependa de los documentos que resultara que tuvieras a mano.
  2. Usa los argumentos reales de la herramienta. Se llama al motor con exactamente los mismos indicadores que pasa la herramienta del navegador, así que los números describen el producto y no un experimento de aspecto parecido.
  3. Registra bytes y hashes, no solo un porcentaje. Un hash responde a una segunda pregunta que el tamaño no puede: si dos entradas construidas de forma distinta acaban siendo el mismo archivo.
  4. Ejecuta todo una segunda vez. Repetir la operación comprueba si converge, lo que importa si una interfaz te invita a pulsar el botón otra vez.

Los números

El modo estándar es nivel 6 sin linealización. El máximo es nivel 9 con linealización. Los porcentajes negativos son archivos más pequeños.

MuestraEntrada (B)Estándar (B)CambiarMáximo (B)Cambiar
01 mínimo, 1 página3,392872-74.3%1,637-51.7%
02 mínimo, 3 páginas9,5201,475-84.5%2,513-73.6%
03 texto sin comprimir, 20 páginas62,1456,590-89.4%9,916-84.0%
04 texto comprimido, 20 páginas9,6296,590-31.6%9,916+3.0%
05 muchos objetos, 100 páginas311,28130,964-90.1%45,110-85.5%
06 estructura suelta, 1 página7,489872-88.4%1,637-78.1%
07 imagen JPEG incrustada67,97468,124+0.2%68,863+1.3%
08 XMP sin comprimir4,1514,235+2.0%5,013+20.8%

Cuatro cosas que dicen los números

La ganancia viene de que la entrada esté suelta, no de que la herramienta sea lista

Los archivos cuyos flujos de texto estaban almacenados sin comprimir se redujeron entre un 84 y un 90 por ciento. Un archivo cuyos flujos ya estaban comprimidos con Flate se redujo un 31.6 por ciento en modo estándar y luego creció un 3.0 por ciento en modo máximo, porque el nivel 9 más la linealización añadieron una estructura que el archivo no necesitaba. Más esfuerzo no es lo mismo que un archivo más pequeño, y el límite es la estructura de la entrada, no el esfuerzo aplicado a ella.

Tres de las ocho muestras crecieron

El peor caso fue un aumento del 20.8 por ciento en un archivo que llevaba un pequeño paquete XMP sin comprimir, pasado por el modo máximo. La muestra con un JPEG incrustado creció en ambos modos, porque no había nada estructural que ganar y la reescritura en sí misma cuesta bytes. Esta es la parte que esconde un mensaje de éxito: un compresor que siempre informa de éxito no está midiendo nada, y en estas entradas la salida honesta es un archivo ligeramente más grande.

La operación es idempotente sobre su propia salida

Cada muestra se pasó una segunda vez por la ruta estándar, y cada cambio de la segunda pasada fue del 0.0 por ciento. Una vez que un archivo se ha reescrito, reescribirlo de nuevo no encuentra nada. Si una herramienta parece encontrar ahorros nuevos cada vez que pulsas el botón, eso es una razón para mirar qué está haciendo en realidad y no una señal de minuciosidad.

La reescritura normaliza, no se limita a recortar

Las muestras 01 y 06 son el mismo documento de una página, salvo que la 06 lleva cuatro kilobytes de comentario basura. Tras la reescritura producen el mismo hash SHA-256. Las muestras 03 y 04 son el mismo documento de veinte páginas con flujos comprimidos y sin comprimir, y convergen de la misma forma. El motor está reconstruyendo el archivo en una forma canónica en lugar de recortar lo que encuentre, y por eso también una segunda pasada no tiene nada que hacer.

Cómo saber si un compresor midió algo

Dos comprobaciones de aproximadamente un minuto cada una y que funcionan con cualquier herramienta.

  1. Pide el número. Un mensaje que dice Comprimido sin una cuenta de bytes antes y después no te ha dicho nada. Los casos que merecen atención son los archivos pequeños y los que ya están bien hechos, donde la respuesta honesta suele ser que creció.
  2. Prueba con un archivo que ya esté ajustado. Una exportación de una suite ofimática moderna normalmente ya está comprimida. Si una herramienta todavía afirma un gran ahorro en ella, o está recodificando tus imágenes, lo que es una decisión de calidad y no algo sin pérdida, o está adivinando.

Ambas comprobaciones apuntan a la misma idea. Un optimizador estructural no tiene un tamaño objetivo al que aspirar, y por eso nuestra propia herramienta no tiene ningún campo para uno y por eso la descripción honesta de lo que puede hacer depende del documento que tenga delante.

Dónde tiene límites esta prueba

Los números anteriores son reales y son limitados. Ser claro sobre sus lagunas es precisamente el motivo de publicarlos.

  • Las muestras se generan, no se recopilan. Aíslan propiedades estructurales a propósito, así que no son una muestra aleatoria de los PDF que la gente tiene de verdad.
  • Ocho es un conjunto pequeño. Lee los porcentajes como prueba de que existe una horquilla, no como una media para todos los PDF.
  • Las imágenes están representadas por una sola muestra. Un único JPEG incrustado representa toda una clase de documentos. No se probaron anidamientos más profundos de imágenes, fuentes y campos de formulario.
  • El motor nunca recodifica imágenes aquí. Eso es una propiedad de la pasada estructural de qpdf, no algo que este conjunto de datos demuestre sobre otros compresores.
  • Las versiones importan. Estos resultados pertenecen a qpdf 11.7.0. Si una versión posterior cambia su optimización, los números cambian con ella y hay que volver a ejecutar el método.

Preguntas frecuentes

Reescribe la estructura interna del archivo en lugar de recodificar las imágenes que contiene. Un PDF almacena sus páginas como un conjunto de objetos y flujos, y una pasada de compresión desempaqueta esos objetos, deduplica lo que se repite, comprime los flujos que se almacenaron sin comprimir y escribe un archivo nuevo. El motor que medimos, qpdf, hace exactamente eso cuando se le llama con los flujos de objetos activados, la compresión de flujos activada y la recompresión Flate en nivel 6. Nada de esa llamada toca las imágenes incrustadas, así que un JPEG que ya está dentro del documento se copia sin cambios. Eso es lo que hace que la operación sea sin pérdida: el contenido visible es el mismo tras la reescritura, y lo único que ha cambiado es cómo está organizado el archivo por dentro. También es por eso que el ahorro es tan desigual, y por lo que un documento cargado de fotos apenas se puede mover.
Sí, y le ocurrió a tres de nuestras ocho muestras. El mayor aumento fue del 20.8 por ciento, en un archivo que llevaba un pequeño paquete de metadatos XMP sin comprimir pasado por el modo máximo, que añade compresión de nivel 9 y linealización. Una segunda muestra con un JPEG incrustado creció en ambos modos, un 0.2 por ciento en modo estándar y un 1.3 por ciento en modo máximo, porque casi no había nada estructural que ganar y la reescritura sigue costando bytes. El patrón detrás de los tres casos es el mismo: cuando la entrada ya está ajustada, el coste de reconstruirla es mayor que el pequeño ahorro que encuentra la reconstrucción. Una herramienta que informa de éxito en todos los archivos sin decir cuánto ahorró no se puede comprobar, y devolverá tan contenta un archivo más grande.
No en el modo que medimos, porque las imágenes nunca se tocan. La pasada reescribe la estructura de objetos y recomprime los flujos que contienen el contenido de página, las fuentes y los metadatos. Una imagen que ya está codificada como JPEG dentro del PDF se almacena como un flujo de bytes comprimidos, y esos bytes se copian, no se decodifican ni se recodifican. Esto es una propiedad del motor y no una promesa sobre todas las herramientas. Algunos compresores ofrecen un segundo modo, con pérdida, que reduce la resolución de las imágenes incrustadas a un DPI elegido y las recodifica como JPEG, lo que sí reduce la calidad y sí encoge drásticamente los archivos cargados de fotos. Esas dos operaciones a menudo se presentan bajo un solo botón. La forma de distinguirlas es el tamaño de salida en un documento con muchas imágenes: una pasada sin pérdida apenas lo mueve, mientras que una pasada con pérdida puede reducirlo a la mitad.
Porque el resultado depende de los argumentos, la versión del motor y la entrada, y todo eso varía entre herramientas. Medimos un motor en una versión con dos conjuntos de argumentos y obtuvimos una horquilla que va de un 90 por ciento menos a un 20.8 por ciento más en entradas distintas. Cambia el nivel de compresión, añade linealización o activa la reducción de resolución de imágenes y los números vuelven a moverse. La entrada importa igual de mucho: en nuestro conjunto, los archivos cuyos flujos de texto estaban almacenados sin comprimir se redujeron entre un 84 y un 90 por ciento, mientras que un archivo cuyos flujos ya estaban comprimidos con Flate se redujo un 31.6 por ciento en modo estándar y creció en modo máximo. Dos herramientas pueden ser ambas honestas y aun así informar de números distintos para el mismo documento, y por eso un resultado citado sin los argumentos ni la entrada de la que proviene no es realmente una medición.
Compara la cuenta de bytes antes y después, y trata un número que falta como la respuesta. Una herramienta que imprime un mensaje de éxito sin mostrar ambos tamaños no te ha dicho nada, y los casos interesantes son exactamente aquellos en los que tendría que admitir un archivo más grande. En un ordenador, las propiedades del archivo o un listado de directorio te dan el tamaño exacto en bytes. Luego lee la dirección, no solo el porcentaje: un cambio del dos por ciento en cualquier sentido está dentro del rango en el que una reescritura puede ir en tu contra. Si la herramienta ofrece un ajuste de calidad o de nivel, ejecuta el mismo archivo dos veces con ajustes distintos para que puedas ver si los números se mueven. Nuestras propias pruebas van en la misma línea, y los argumentos exactos de qpdf se indican en este artículo para que la misma ejecución pueda repetirse con el mismo motor.

Si quieres el panorama más amplio de lo que una herramienta del navegador puede y no puede hacer con un documento, la guía sobre comprimir un PDF sin subirlo cubre el motor y la ruta del archivo, y la cuestión de los tamaños objetivo explica por qué un optimizador sin pérdida no tiene un campo para uno.

Comprueba los números en tu propio archivo

Gratis, privado e ilimitado. No necesitas cuenta.

Abrir Comprimir PDF