Como PDFs armazenam texto e imagens (nos bastidores)
Um PDF é um arquivo de texto com blobs binários dentro. A estrutura é surpreendentemente legível: um cabeçalho, uma lista de objetos numerados, uma tabela de referências cruzadas e um trailer. Esta página percorre essa estrutura e mostra onde vivem realmente o texto, as fontes e as imagens. Escrito para desenvolvedores e qualquer um que queira entender o que uma ferramenta PDF faz quando lê ou escreve um arquivo.
Visão geral
As quatro partes de um PDF
Cada arquivo PDF tem a mesma disposição em quatro partes:
- Cabeçalho — uma linha, p. ex.
%PDF-1.7, declarando a versão. - Corpo — uma sequência de objetos indiretos numerados. É onde tudo vive: páginas, fontes, imagens, metadados.
- Tabela de referências cruzadas (xref) — deslocamentos de bytes de cada objeto, para que um leitor possa encontrá-los sem percorrer todo o arquivo.
- Trailer — aponta para o objeto raiz (o catálogo do documento), o local do xref e informações de criptografia opcionais. O leitor lê o trailer primeiro, depois salta para a raiz.
A concepção trailer-primeiro é por que um PDF pode ser lido em tempo constante sem carregar todo o arquivo — importante para documentos volumosos e leitores em fluxo.
Corpo
Objetos indiretos
Cada objeto no corpo é numerado e se parece com isto:
3 0 obj
<< /Type /Page /MediaBox [0 0 612 792] /Contents 4 0 R /Resources << /Font << /F1 5 0 R >> >> >>
endobjO 3 0 obj diz «este é o objeto 3, geração 0». O corpo dentro de << ... >>é um dicionário — uma lista de pares chave/valor. Os valores podem ser números, strings, nomes (prefixados por /), arrays, outros dicionários ou referências como 4 0 R(«vá olhar o objeto 4»). É assim que uma página aponta para seu fluxo de conteúdo e suas fontes sem incorporá-los.
O número de geração é geralmente 0. Ele é incrementado quando uma atualização incremental remove e regrava um objeto — uma funcionalidade que permite editar PDFs adicionando modificações ao final do arquivo sem regravar tudo. A maioria dos escritores modernos regrava todo o arquivo, então as gerações permanecem em 0.
Conteúdo
Como o texto é armazenado
O conteúdo de uma página vive em um fluxo de conteúdo — um objeto cujo valor é um fluxo de bytes (frequentemente comprimido por Flate) contendo operadores de desenho PDF. O texto é desenhado com operadores como BT (begin text),Tf (set font e size), Td (move position), Tj (show text) e ET(end text). Um simples «Hello» se parece aproximadamente com:
BT
/F1 24 Tf
100 700 Td
(Hello) Tj
ETA string (Hello) usa a codificação da fonte. Para texto latino simples, é frequentemente WinAnsiEncoding ou a codificação incorporada da fonte. Para texto Unicode, a string é uma string de bytes codificada em 16 bits e a fonte tem um mapeamento/ToUnicode que permite aos leitores recuperar os code points reais para copiar-colar e buscar. Se um PDF tem copiar-colar corrompido mas texto visível, o mapeamento /ToUnicode está faltando ou errado — um bug de exportação comum.
O texto não é armazenado como HTML ou parágrafos. Não há objeto semântico «parágrafo». Linhas, quebras de linha e posicionamento são todos comandos de desenho explícitos. É por isso que reflow um PDF para uma largura de página diferente é difícil: o leitor teria que fazer engenharia reversa da disposição a partir dos comandos de desenho.
Fontes
Incorporação de fontes
Um objeto fonte em PDF tem duas partes: umdicionário de fonte que nomeia a fonte e aponta para seus dados, e o programa de fonteele próprio (Type 1, TrueType ou OpenType) incorporado como fluxo. A especificação PDF exige que as fontes sejam incorporadas para que o documento renderize identicamente em todo lugar — mas não a impõe, é por isso que alguns PDFs substituem fontes em máquinas que não as têm.
O subsetting incorpora apenas os glifos realmente utilizados no documento. Uma fonte de 250 Ko usada para um único título torna-se um subset de 8 Ko. A maioria dos exportadores modernos faz subsetting por padrão. Exportadores antigos ou alguns caminhos «Print to PDF» incorporam às vezes a fonte completa, o que é uma causa comum de arquivos inchados. Veja nosso guia de tamanho de arquivo para o detalhe completo.
Imagens
Como as imagens são armazenadas
As imagens são armazenadas como XObjects(objetos externos) — fluxos de dados de pixels raw ou comprimidos com um dicionário descrevendo largura, altura, espaço de cor, bits por componente e filtro. O fluxo de conteúdo da página então desenha a imagem com o operador Do.
PDF suporta vários filtros de imagem (compressão):
- DCTDecode — JPEG. Com perdas, bom para fotos. A fonte mais comum de tamanho em PDFs ricos em imagens.
- FlateDecode — zlib/deflate. Sem perdas, bom para arte vetorial e imagens com poucas cores.
- JPXDecode — JPEG2000. Melhor compressão que JPEG em alta qualidade, mas mais lento e menos universalmente suportado.
- JBIG2Decode — para texto digitalizado bitonal (1-bit). Pode reduzir drasticamente páginas digitalizadas.
- CCITTFaxDecode — compressão de fax clássica para imagens bitonais.
Um PDF rico em imagens é sobretudo uma sequência de fluxos de imagens comprimidas. Recodificar esses fluxos com uma qualidade JPEG mais agressiva é a alavanca única mais importante de tamanho para documentos digitalizados.
Índice
Tabela xref e trailer
A tabela xref lista o deslocamento de bytes de cada objeto indireto. Um leitor abre o arquivo, lê o trailer (que está em um deslocamento conhecido desde o final do arquivo), encontra o xref e o usa para saltar diretamente a qualquer objeto sem analisar todo o arquivo. É o que torna PDF de acesso direto.
O PDF 1.5 adicionou os fluxos de referências cruzadas, que comprimem a tabela xref ela própria. Combinado com fluxos de objetos (muitos pequenos objetos empacotados em um fluxo comprimido), é a compressão estrutural que torna os PDFs modernos menores que seus equivalentes 1.4. Veja nossoexplicador de compressão para o que isso faz na prática.
O trailer também aponta para/Root (o catálogo do documento, que lista a árvore de páginas), o dicionário /Info(Title, Author, CreationDate — os metadados) e opcionalmente o dicionário /Encrypt se o arquivo estiver criptografado.
Compressão
Fluxos e filtros
Todo objeto cujo valor são dados binários (um fluxo de conteúdo, uma imagem, uma fonte incorporada) é umfluxo: um dicionário seguido destream, bytes raw eendstream. A entrada /Filter do dicionário indica ao leitor como decodificar os bytes — FlateDecode para zlib, DCTDecodepara JPEG, etc. Vários filtros podem ser encadeados, p. ex. uma imagem que é decodificada e depois subamostrada.
É por isso que «comprimir um PDF» não é uma operação. Cada fluxo é comprimido independentemente com seu próprio filtro. Uma ferramenta de compressão que regrava com fluxos de objetos reduz o overhead estrutural; recodificar as imagens com uma qualidade JPEG mais agressiva reduz os fluxos de imagens. São alavancas independentes.
Na prática
Por que isso importa para ferramentas PDF
Quando uma ferramenta como IXPDF funde, divide ou gira um PDF, ela analisa o xref, percorre a árvore de páginas, copia ou reorganiza os objetos de página e regrava o xref e o trailer. Os fluxos de conteúdo (texto e imagens) são copiados byte a byte — sem recodificação, sem perda de qualidade. É por isso que operações estruturais são rápidas e sem perda: elas reorganizam referências de objetos, não rerenderizam a página.
A compressão é a exceção: ela resserializa a estrutura com fluxos de objetos. Mesmo assim, os fluxos de imagens e fontes são copiados como estão salvo se o usuário pedir explicitamente para recodificá-los.
Tudo isso acontece no seu navegador via um Web Worker — o arquivo é analisado, modificado e resserializado localmente. Seu PDF nunca sai do seu dispositivo.
Leia a seguir