Uma passagem de compressão de PDF sem perdas reescreve a estrutura interna do arquivo, em vez de recodificar as imagens dentro dele. Medimos o que isso realmente economiza em oito PDFs de teste. Três deles ficaram maiores em pelo menos um modo, e a pior regressão foi de 20.8 por cento.
A economia depende de quão folgada a entrada estava. Fluxos de texto sem compressão encolheram de 84 a 90 por cento, enquanto um arquivo cujos fluxos já estavam comprimidos com Flate encolheu 31.6 por cento no modo padrão e cresceu 3.0 por cento no modo máximo. Uma segunda passagem não mudou nada em nenhuma amostra, e dois arquivos com o mesmo conteúdo mas estrutura diferente produziram uma saída idêntica byte a byte. Nada disso significa que o mecanismo está com defeito; significa que uma afirmação de tamanho precisa de uma medição por trás. O método completo, a tabela e os limites do teste estão abaixo.
Toda ferramenta de PDF tem um botão Comprimir, e quase todas relatam sucesso. Essa palavra cobre pelo menos duas operações muito diferentes, e uma delas pode te devolver um arquivo maior. Queríamos números em vez de uma promessa, então construímos oito PDFs com estruturas internas deliberadamente diferentes e executamos cada um pelo qpdf 11.7.0 usando os mesmos argumentos que a nossa própria ferramenta passa.
Comprimir PDF
A mesma passagem do qpdf descrita aqui, compilada para WebAssembly e executada dentro da aba. Escolha o nível e depois leia você mesmo os tamanhos antes e depois.
O que um botão de "comprimir PDF" realmente faz
A primeira coisa que vale saber é que isso normalmente não é recompressão de imagem. É uma reescrita estrutural. Um PDF guarda suas páginas como uma coleção de objetos e fluxos, e a passagem os desempacota, remove duplicações, comprime os fluxos que eram armazenados brutos e grava um novo arquivo.
o qpdf, o mecanismo dentro da nossa ferramenta, faz isso com esta chamada no modo padrão:
--object-streams=generate --compress-streams=y --recompress-flate --compression-level=6
e este no modo máximo, que adiciona um nível mais alto e linearização para visualização rápida na web:
--object-streams=generate --compress-streams=y --recompress-flate --compression-level=9 --linearize
Observe o que não está em nenhuma das chamadas: nada que toque nas imagens incorporadas. Uma passagem estrutural não decodifica um JPEG que já está dentro de um PDF, então ela não consegue encolher de forma significativa um documento digitalizado ou cheio de fotos. O que ela pode fazer é remover a ineficiência que se acumulou enquanto o arquivo era construído. É por isso que a economia depende da entrada, e não de quão duro a ferramenta tenta.
Como a medição foi feita
Oito amostras foram geradas para isolar uma propriedade estrutural cada: um arquivo mínimo de uma página, um arquivo de três páginas, o mesmo documento de vinte páginas com fluxos comprimidos e sem compressão, um arquivo de cem páginas com muitos objetos, um arquivo de uma página preenchido com um comentário inútil, um arquivo com um JPEG incorporado e um arquivo com um pequeno pacote XMP sem compressão. Cada arquivo foi então processado com os argumentos acima, duas vezes no caso do modo padrão, e a contagem de bytes e o hash SHA-256 foram registrados a cada vez.
- Gere as amostras por script, e não à mão. Isso torna cada amostra reproduzível e impede que o teste dependa dos documentos que por acaso estavam à mão.
- Use os argumentos reais da ferramenta. O mecanismo é chamado exatamente com os parâmetros que a ferramenta de navegador passa, então os números descrevem o produto, e não um experimento de aparência parecida.
- Registre bytes e hashes, não apenas uma porcentagem. Um hash responde a uma segunda pergunta que o tamanho não responde: se duas entradas construídas de forma diferente acabam como o mesmo arquivo.
- Execute tudo uma segunda vez. Repetir a operação testa se ela converge, o que importa se a interface te convida a clicar no botão de novo.
Os números
O modo padrão é o nível 6 sem linearização. O máximo é o nível 9 com linearização. Porcentagens negativas são arquivos menores.
| Amostra | Entrada (B) | Padrão (B) | Alterar | Máximo (B) | Alterar |
|---|---|---|---|---|---|
| 01 mínimo, 1 página | 3,392 | 872 | -74.3% | 1,637 | -51.7% |
| 02 mínimo, 3 páginas | 9,520 | 1,475 | -84.5% | 2,513 | -73.6% |
| 03 texto sem compressão, 20 páginas | 62,145 | 6,590 | -89.4% | 9,916 | -84.0% |
| 04 texto comprimido, 20 páginas | 9,629 | 6,590 | -31.6% | 9,916 | +3.0% |
| 05 muitos objetos, 100 páginas | 311,281 | 30,964 | -90.1% | 45,110 | -85.5% |
| 06 estrutura folgada, 1 página | 7,489 | 872 | -88.4% | 1,637 | -78.1% |
| 07 imagem JPEG incorporada | 67,974 | 68,124 | +0.2% | 68,863 | +1.3% |
| 08 XMP sem compressão | 4,151 | 4,235 | +2.0% | 5,013 | +20.8% |
Quatro coisas que os números dizem
O ganho vem de a entrada estar folgada, e não de a ferramenta ser esperta
Arquivos cujos fluxos de texto eram armazenados sem compressão encolheram de 84 a 90 por cento. Um arquivo cujos fluxos já estavam comprimidos com Flate encolheu 31.6 por cento no modo padrão e depois cresceu 3.0 por cento no modo máximo, porque o nível 9 mais a linearização adicionaram estrutura que o arquivo não precisava. Mais esforço não é a mesma coisa que um arquivo menor, e o limite é a estrutura da entrada, não o esforço aplicado a ela.
Três das oito amostras ficaram maiores
O pior caso foi um aumento de 20.8 por cento em um arquivo que carregava um pequeno pacote XMP sem compressão, forçado pelo modo máximo. A amostra com um JPEG incorporado cresceu nos dois modos, porque não havia nada estrutural a ganhar e a própria reescrita custa bytes. Essa é a parte que uma mensagem de sucesso esconde: um compressor que sempre relata sucesso não está medindo nada, e nessas entradas a saída honesta é um arquivo um pouco maior.
A operação é idempotente na sua própria saída
Cada amostra foi executada uma segunda vez pelo caminho padrão, e cada mudança da segunda passagem foi de 0.0 por cento. Depois que um arquivo é reescrito, reescrevê-lo de novo não encontra nada. Se uma ferramenta parece encontrar novas economias cada vez que você clica no botão, isso é um motivo para olhar o que ela realmente está fazendo, e não um sinal de rigor.
A reescrita normaliza, não apenas apara
As amostras 01 e 06 são o mesmo documento de uma página, exceto que a 06 carrega quatro kilobytes de comentário inútil. Após a reescrita, elas produzem o mesmo hash SHA-256. As amostras 03 e 04 são o mesmo documento de vinte páginas com fluxos comprimidos e sem compressão, e convergem da mesma forma. O mecanismo está reconstruindo o arquivo em uma forma canônica, em vez de apara o que encontrar por acaso, e é também por isso que uma segunda passagem não tem mais nada a fazer.
Como saber se um compressor mediu alguma coisa
Duas verificações levam cerca de um minuto cada e funcionam com qualquer ferramenta.
- Peça o número. Uma mensagem que diz Comprimido sem uma contagem de bytes antes e depois não te disse nada. Os casos que merecem atenção são arquivos pequenos e arquivos já bem feitos, onde a resposta honesta muitas vezes é que ele cresceu.
- Teste um arquivo que já está justo. Uma exportação de uma suíte de escritório moderna normalmente já está comprimida. Se uma ferramenta ainda afirma uma grande economia nela, ou está recodificando suas imagens, o que é uma decisão de qualidade, e não algo sem perdas, ou está adivinhando.
As duas verificações apontam para a mesma ideia. Um otimizador estrutural não tem um tamanho alvo a atingir, e é por isso que a nossa própria ferramenta não tem um campo para isso e por que a descrição honesta do que ela pode fazer depende do documento à sua frente.
Onde este teste tem limites
Os números acima são reais e são estreitos. Ser claro sobre as lacunas é o objetivo de publicá-los.
- As amostras são geradas, não coletadas. Elas isolam propriedades estruturais de propósito, então não são uma amostra aleatória dos PDFs que as pessoas realmente têm.
- Oito é um conjunto pequeno. Leia as porcentagens como evidência de que existe um intervalo, e não como uma média para todos os PDFs.
- As imagens são representadas por uma única amostra. Um único JPEG incorporado representa toda uma classe de documentos. Aninhamentos mais profundos de imagens, fontes e campos de formulário não foram testados.
- O mecanismo nunca recodifica imagens aqui. Isso é uma propriedade da passagem estrutural do qpdf, e não algo que este conjunto de dados comprove sobre outros compressores.
- As versões importam. Esses resultados pertencem ao qpdf 11.7.0. Se uma versão posterior mudar sua otimização, os números mudam com ela e o método tem que ser executado de novo.
Perguntas frequentes
Se você quer o panorama mais amplo do que uma ferramenta de navegador pode e não pode fazer com um documento, o guia sobre comprimir um PDF sem enviá-lo aborda o mecanismo e o caminho do arquivo, e a questão dos tamanhos alvo explica por que um otimizador sem perdas não tem um campo para isso.