𝗣𝗮𝗿𝗲 𝗱𝗲 𝗳𝗮𝘇𝗲𝗿 𝗽𝗮𝗿𝘀𝗶𝗻𝗴 𝗱𝗲 𝗣𝗗𝗙𝘀 𝗻𝗼 𝗺𝗼𝗺𝗲𝗻𝘁𝗼 𝗱𝗮 𝗿𝗲𝗻𝗱𝗲𝗿𝗶𝘇𝗮𝗰̧𝗮̃𝗼
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:
- Ler o fluxo de operadores em vez de apenas o conteúdo de texto.
- Construir uma pilha CTM para rastrear o estado da matriz.
- Classificar subcaminhos geometricamente.
- Emitir segmentos com procedência.
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.