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.