Quer fazer parsing de PDF?
(eliot-jones.com)- O parsing de PDF deveria funcionar com base em uma ordem e estrutura bem definidas, mas os arquivos reais frequentemente não seguem essa especificação
- Vários erros e inconsistências ocorrem na busca de ponteiros de cross-reference (xref) e offsets
- Na prática, muitos problemas surgem por causa de dados desnecessários antes do cabeçalho do PDF ou por posições incorretas de ponteiros e offsets
- Também há muitos casos em que a própria tabela xref do PDF é ambígua ou mal formatada
- Por isso, os principais visualizadores implementam lógica adicional para suportar até arquivos PDF fora do padrão
Abordagem ideal para parsing de PDF
- Em teoria, o parsing de PDF segue etapas fixas
- Encontrar o comentário de cabeçalho de versão no início do arquivo
- Encontrar o ponteiro de cross-reference (xref)
- Coletar todos os offsets dos objetos
- Encontrar o dicionário trailer para acessar a estrutura completa do catálogo
Introdução aos objetos PDF
- Objetos PDF são unidades que encapsulam e armazenam vários elementos do PDF, como números, strings e dicionários
- Cada objeto existe entre os marcadores
objeendobj - Os objetos se conectam entre si por meio de referências indiretas (
indirect reference, por exemplo:16 0 R) - A forma de dividir os objetos no arquivo é livre, mas alguns tipos de objeto obrigatoriamente precisam ser referências indiretas
Encontrando offsets de cross-reference
- Estruturalmente, o PDF tem uma tabela de cross-reference (xref), que funciona como um índice das posições dos objetos
- No fim do arquivo, a expressão
startxrefindica uma posição específica em bytes como ponteiro - Esse ponteiro indica a posição da xref, mas há diferenças entre a especificação e os arquivos reais. Por exemplo, o marcador
%EOFdeveria estar na última linha, mas em PDFs reais ele pode estar em qualquer lugar dentro dos últimos 1.024 bytes - Nos arquivos reais, aparecem várias variações, como erros de formato no ponteiro (
startrefetc.) e ausência de quebra de linha
Encontrando offsets de objetos
- A tabela xref segue a ordem
xref, número inicial do objeto e quantidade de objetos, e o offset/número de geração/estado de cada objeto (nouf) é registrado em uma linha - Pode haver várias tabelas xref, ou elas podem estar ligadas entre si por meio da entrada
/Prev
Localizando o dicionário trailer
- Acima do marcador
startxref, existe o dicionário trailer, que contém os metadados essenciais para encontrar o objeto raiz - A partir do objeto raiz, é possível iniciar a interpretação de toda a estrutura
Ambiente real: problemas inesperados
-
Há muitos arquivos que não seguem a especificação do PDF, então parsers comuns têm dificuldade para processá-los
-
Casos em que a busca pelo ponteiro de cross-reference costuma falhar
- O ponteiro não está no fim do arquivo nem nos últimos 1.024 bytes
- Erros de digitação (
startrefetc.) - Formatos excepcionais
-
Em uma análise de 3.977 amostras reais de PDF, cerca de 0,5% tinham erro na declaração da xref
O conteúdo do PDF começa em um offset diferente de zero
- Se houver dados inúteis (
junk) antes do cabeçalho, todos os offsets em bytes são deslocados, e a posição destartxreffica incorreta - É preciso recalcular os offsets com base na posição do cabeçalho e verificar as duas posições
- Isso representa cerca de 50% de todos os erros
O ponteiro xref aponta para o meio da tabela xref
- O offset especificado pode acabar levando para o meio do conteúdo da tabela xref
- Isso foi encontrado em cerca de 5 dos 3.977 exemplos
O ponteiro está perto da xref
- Muitas vezes, o ponteiro não está exato, mas só deslocado pela diferença de espaços em branco ou quebras de linha logo antes ou depois da xref
O ponteiro está certo, mas os offsets da xref estão errados
- Os próprios offsets registrados na tabela xref podem estar errados
- Alguns objetos podem estar corretos, enquanto outros têm erro de offset
O primeiro ponteiro está normal, mas o offset anterior (/Prev) está estranho
- Há muitos casos em que, ao modificar um PDF, o ponteiro
/Prevrecebe um valor incorreto (por exemplo,0)
O formato da tabela xref é anormal
- Aparecem casos variados, como
xrefcolado com números sem quebra de linha, mais entradas do que objetos declarados, ou dados lixo no meio da tabela - Muitos desses casos foram relatados como issues em projetos como o PdfPig
Conclusão
- Segundo a especificação, o parsing de PDF deveria seguir uma sequência padronizada, mas muitos arquivos reais não são assim, o que causa diversos problemas de parsing
- Visualizadores de PDF usados na prática já incluem por padrão recursos para ampliar o suporte a PDFs fora da especificação
- Este resumo tratou apenas de uma pequena parte do parsing coberta pela especificação do PDF (22 páginas de um total de 1300)
Ainda não há comentários.