15 pontos por GN⁺ 2025-08-04 | Ainda não há comentários. | Compartilhar no WhatsApp
  • 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 obj e endobj
  • 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 startxref indica 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 %EOF deveria 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 (startref etc.) 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 (n ou f) é 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 (startref etc.)
    • 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 de startxref fica 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 /Prev recebe um valor incorreto (por exemplo, 0)

O formato da tabela xref é anormal

  • Aparecem casos variados, como xref colado 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.

Ainda não há comentários.