𝗣𝗮𝗿𝗲 𝗱𝗲 𝗳𝗮𝘇𝗲𝗿 𝗽𝗮𝗿𝘀𝗶𝗻𝗴 𝗱𝗲 𝗣𝗗𝗙𝘀 𝗻𝗼 𝗺𝗼𝗺𝗲𝗻𝘁𝗼 𝗱𝗮 𝗿𝗲𝗻𝗱𝗲𝗿𝗶𝘇𝗮𝗰̧𝗮̃𝗼

A maioria dos desenvolvedores constrói ferramentas de extração de PDF da maneira errada.

Eles tentam adivinhar a estrutura do documento a partir da saída visual. Eles renderizam uma página em um canvas e observam as posições dos pixels. Eles usam visão computacional para encontrar colunas ou tabelas.

Essa abordagem é invertida.

Um PDF já contém a estrutura de que você precisa no fluxo de operadores (operator stream).

Uma tabela não é apenas um conjunto de pixels. É um conjunto de operadores de caminho (path operators) como moveTo, lineTo e rectangle. Os limites das zonas são codificados na pilha CTM (CTM stack). Você não precisa reconstruir o que já está lá.

Pare de usar heurísticas visuais. Use os dados de origem.

Anteriormente, tentei usar a subdivisão de De Casteljau para caixas delimitadoras (bounding boxes). Eu a rejeitei durante os testes.

De Casteljau é um algoritmo de subdivisão. Você divide as curvas até que os segmentos sejam pequenos o suficiente. Isso funciona para renderização, mas é ruim para caixas delimitadoras.

Você tem que escolher uma tolerância. Se a tolerância for muito ampla, a caixa estará errada. Se for muito estreita, você desperdiçará recursos com recursão. Existe um jeito melhor. Uma solução analítica usando a fórmula quadrática é exata. Ela não faz recursão. Ela não aloca segmentos.

A mesma lógica se aplica à detecção de zonas.

Muitas ferramentas calculam os limites das zonas encontrando o ponto médio entre dois grupos de texto. Isso é um palpite visual. Não é estrutural.

Se você usar pontos médios, o arredondamento de subpixels colocará as regiões nas zonas erradas.

A correção é simples. Use a borda superior da caixa delimitadora. Uma região pertence a uma zona com base em onde ela começa. Use a coordenada Y real da borda superior.

Construir um extrator de PDF real é mais difícil. Você deve:

Isso dá mais trabalho do que adivinhar com base em pixels. Mas produz resultados determinísticos.

Uma ferramenta baseada em pixels fornece resultados diferentes com 100% de zoom do que com 150% de zoom. Ela está fazendo correspondência de padrões em artefatos visuais, não extraindo a estrutura.

Se você não fizer o parsing do fluxo de operadores, você está construindo apenas uma demonstração. Pode funcionar nos seus arquivos de teste, mas falhará nos uploads reais dos usuários.

O caminho pelo fluxo de operadores é difícil. Você deve entender as máquinas de estado de preenchimento (fill) e traçado (stroke) e a especificação do PDF. Mas você só precisa aprender uma vez. Depois, funciona para todos os PDFs.

Source: https://dev.to/bonzai2carn/stop-parsing-pdfs-at-render-time-a-better-architecture-for-structured-extraction-5fb8