Pular para o conteúdo
PDFLove

como funciona a compressão de pdf

Como funciona de verdade a compressão de PDF

"Comprimir PDF" roda várias operações não relacionadas atrás de um botão só. Uma delas é sem perdas e em geral já foi feita. Uma delas é de onde vem todo o tamanho, e ela não é de graça.

01

Camada um: compressão de fluxos, que é sem perdas e já está ligada

Todo fluxo de um PDF — fluxos de conteúdo, fontes incorporadas, dados de imagem — pode carregar um filtro que diz como ele está codificado. O comum é `FlateDecode`, que é deflate, o mesmo algoritmo do ZIP. Instruções de desenho de texto são altamente repetitivas, então o deflate se sai muito bem com elas: uma página de comandos de desenho comprime rotineiramente a um quinto do tamanho.

O importante é que quase todo gravador de PDF aplica isso no momento em que salva. Quando o arquivo chega até você, essa camada já rodou. É por isso que zipar um PDF não ganha quase nada, e por que comprimir um PDF de texto já pequeno devolve um arquivo do mesmo tamanho. Não havia mais nada a tirar.

O PDF 1.5 acrescentou dois refinamentos que ainda ajudam em arquivos anteriores a eles. Os fluxos de objetos empacotam muitos dicionários pequenos num único fluxo comprimível em vez de deixá-los como texto solto não comprimido. Os fluxos de referências cruzadas fazem o mesmo com o índice. Num documento grande com dezenas de milhares de objetos, só isso já pode ser uma redução relevante, e não custa absolutamente nada.

02

Camada dois: recodificação de imagens, que é onde mora o tamanho

O deflate é inútil em fotografias. Uma digitalização não tem repetição exata que ele possa explorar — cada pixel difere ligeiramente do vizinho — então a compressão sem perdas sobre dados de imagem devolve quase nada. Em vez disso, os dados de imagem são guardados com `DCTDecode` (JPEG) ou, para digitalizações em dois níveis, `CCITTFaxDecode` ou `JBIG2Decode`.

Então comprimir um PDF pesado em imagens significa uma coisa: decodificar cada imagem, alterá-la e codificá-la de novo. Há três alavancas, e cada uma delas é uma troca real.

Reamostragem para baixo
Reduzir as dimensões em pixels. Uma digitalização a 300 DPI guarda quatro vezes os dados de uma a 150 DPI, e uma tela não mostra a diferença. É o maior ganho isolado em documentos digitalizados.
Qualidade de recodificação
Aumentar a quantização JPEG. Ir da qualidade 95 para 80 costuma reduzir os dados à metade e é difícil de ver; ir abaixo de 60 começa a mostrar halos em volta do texto.
Redução de cor
Converter cor em tons de cinza, ou uma digitalização em tons de cinza de texto limpo em dois níveis. Tipo preto sobre papel branco não carrega cor que valha a pena guardar.
O que custa
As três são de mão única. Os pixels descartados se foram, e comprimir o resultado de novo recodifica dados já degradados.

03

Camada três: jogar fora coisas que você nem estava olhando

Uma fatia surpreendente de um PDF costuma ser sobrecarga que ninguém quer. As fontes são o caso clássico: uma fonte totalmente incorporada pode chegar a centenas de kilobytes, e um documento que usa onze caracteres dela num título está carregando a família tipográfica inteira. Criar um subconjunto reescreve a fonte para conter só os glifos efetivamente desenhados.

Depois tem a duplicação. Um logotipo colocado no cabeçalho de cada página é com frequência incorporado uma vez por página em vez de guardado uma vez e referenciado oitenta vezes. Desduplicar objetos idênticos num relatório longo pode tirar um terço do arquivo sem nenhuma mudança visual.

O resto é menor mas soma: miniaturas de página armazenadas pelo gravador, blocos de metadados XMP, objetos não usados órfãos de edições anteriores, JavaScript e todo o histórico de edição deixado por salvamentos incrementais. Nada disso renderiza. Tudo isso viaja junto.

04

Por que o mesmo ajuste dá resultados tão diferentes

Porque o desfecho depende inteiramente de qual camada tem algo a fazer. Rode um compressor numa digitalização de 40 MB e ele vai recodificar 200 imagens e devolver 4 MB. Rode os ajustes idênticos num relatório de texto de 400 KB e ele não vai achar imagem nenhuma, nem fonte sem subconjunto, nem objeto duplicado, e vai devolver 390 KB.

Nenhum dos dois resultados é a ferramenta funcionando bem ou mal. É a mesma operação encontrando dois arquivos inteiramente diferentes, e é por isso que a primeira pergunta útil é sempre do que o arquivo é feito, e não com que força espremê-lo.

05

Perda de geração, e por que duas vezes não é duas vezes melhor

A quantização JPEG não é idempotente. Recodificar uma imagem já quantizada requantiza coeficientes que já tinham sido arredondados, então o erro se acumula enquanto o tamanho quase não se move. A segunda passada em geral tira alguns por cento e acrescenta artefatos visíveis em volta de toda borda dura.

Se uma passada não chegou ao seu alvo, o movimento produtivo é mudar algo estrutural — reamostrar mais, cair para tons de cinza, remover páginas — em vez de rodar a mesma compressão outra vez.

Perguntas

Perguntas relacionadas

A compressão de PDF é sem perdas ou com perdas?

As duas, no mesmo arquivo. Texto, gráficos vetoriais e fontes são comprimidos sem perdas e saem idênticos. Fotografias e digitalizações são recodificadas e perdem detalhe de verdade. É por isso que comprimir um documento de texto sai de graça e comprimir uma digitalização é uma troca.

Por que comprimir meu PDF quase não mudou nada?

Porque a camada sem perdas já tinha sido aplicada quando o arquivo foi escrito, e não havia imagens para a camada com perdas trabalhar. Um arquivo quase inteiramente de texto já está perto do menor que consegue ficar.

Comprimir um PDF reduz a qualidade de impressão?

Reduz a resolução das imagens, então para um livro de fotos destinado à impressão, sim, visivelmente. Para um documento digitalizado que vai para uma tela ou uma impressora de escritório, reamostrar de 300 DPI para 150 costuma ser indistinguível. Texto desenhado como texto fica intocado em qualquer ajuste.

Por que meu PDF juntado ficou maior que os dois arquivos somados?

Em geral são as fontes. Se os dois arquivos incorporam subconjuntos da mesma família sob nomes internos diferentes, o arquivo juntado carrega os dois subconjuntos, porque nada consegue provar com segurança que são intercambiáveis. Rodar uma passada de compressão depois costuma recuperar isso.