Arrêtez d'extraire les PDF au moment du rendu
La plupart des outils d'extraction de PDF côté frontend échouent.
Les développeurs tentent de deviner la structure du document à partir du rendu visuel. Ils examinent les pixels rendus pour trouver des colonnes, des tableaux ou des listes. Ils utilisent la vision par ordinateur ou la proximité des pixels pour décider de l'endroit où commence une boîte.
C'est une mauvaise approche de développement.
Un PDF contient déjà des données structurelles explicites dans son flux d'opérateurs (operator stream). Un tableau n'est pas seulement un groupe de pixels proches. Il est dessiné avec des commandes spécifiques comme moveTo, lineTo ou rectangle. Les limites que vous souhaitez trouver sont déjà encodées dans la source.
Si votre extracteur vous donne des colonnes différentes à un zoom de 100 % par rapport à un zoom de 150 %, vous n'extrayez pas la structure. Vous faites de la reconnaissance de motifs sur des artefacts visuels.
Arrêtez d'utiliser des heuristiques visuelles. Commencez à analyser le flux d'opérateurs.
Pourquoi le flux d'opérateurs est meilleur :
- Il est déterministe. Il fonctionne de la même manière, quels que soient l'échelle ou le font hinting.
- Il utilise des données réelles. Vous utilisez les chemins et les coordonnées réels définis par le créateur.
- Il évite les erreurs mathématiques. Par exemple, utiliser les points médians entre les centres de texte pour trouver des zones entraîne des bugs d'arrondi. Utiliser le bord supérieur réel d'une boîte de délimitation (bounding box) est la seule méthode correcte.
Le chemin difficile est le bon chemin.
Vous devez comprendre la pile CTM. Vous devez suivre les états de la matrice et classifier les sous-chemins. Vous devez lire la spécification PDF et le code source pour le maîtriser.
Cela demande plus d'efforts au départ. Mais cela fonctionne pour chaque PDF téléchargé par un utilisateur. Les outils basés sur les pixels ne fonctionnent que pour les quelques fichiers de votre suite de tests.
Construisez un véritable extracteur, pas une démo.