Vous voulez parser des PDF ?
(eliot-jones.com)- Le parsing de PDF devrait fonctionner sur la base d’un ordre et d’une structure clairement définis, mais les fichiers réels ne respectent souvent pas cette spécification
- Diverses erreurs et incohérences apparaissent lors de la recherche des pointeurs de cross-reference (xref) et des offsets
- En pratique, de nombreux problèmes viennent de données inutiles avant l’en-tête PDF, ou d’un mauvais positionnement des pointeurs et des offsets
- Il existe aussi de nombreux cas où la table xref du PDF elle-même est ambiguë ou mal formatée
- C’est pourquoi les principaux lecteurs implémentent en plus une logique prenant en charge même les fichiers PDF non standard
Approche idéale du parsing de PDF
- En théorie, le parsing de PDF suit des étapes fixes
- Rechercher le commentaire d’en-tête de version au début du fichier
- Rechercher le pointeur de cross-reference (xref)
- Collecter tous les offsets d’objets
- Trouver le dictionnaire trailer pour accéder à la structure globale du catalogue
Présentation des objets PDF
- Les objets PDF sont des unités qui encapsulent et stockent différents éléments PDF comme des nombres, des chaînes ou des dictionnaires
- Chaque objet se trouve entre les marqueurs "
obj/endobj" - Les objets sont reliés entre eux par des références indirectes (indirect reference, par exemple : "16 0 R")
- La manière de répartir les objets dans le fichier est libre, mais certains types d’objets doivent obligatoirement être en référence indirecte
Recherche des offsets de cross-reference
- Dans sa structure, un PDF contient une table de cross-reference (xref) qui sert d’index des positions des objets
- À la fin du fichier, la syntaxe "startxref" indique une position en octets précise comme pointeur
- Ce pointeur désigne l’emplacement de la xref, mais il existe des écarts entre la spécification et les fichiers réels. Par exemple, le marqueur "%EOF" est censé être la dernière ligne, alors qu’en pratique il peut se trouver n’importe où dans les 1 024 derniers octets
- Dans les fichiers réels, on observe diverses variantes : erreurs de format du pointeur (
startref, etc.), absence de saut de ligne, etc.
Recherche des offsets d’objets
- La table xref enchaîne "xref", le numéro de début des objets et le nombre d’objets, puis enregistre sur chaque ligne l’offset / le numéro de génération / l’état (
nouf) de chaque objet - Il peut exister plusieurs tables xref, ou elles peuvent être reliées entre elles via l’entrée /Prev
Recherche de l’emplacement du dictionnaire trailer
- Un dictionnaire trailer se trouve au-dessus du marqueur startxref et contient les métadonnées indispensables pour trouver l’objet racine
- À partir de l’objet racine, on peut commencer à interpréter toute la structure
En conditions réelles : des problèmes inattendus
-
De nombreux fichiers ne respectent pas la spécification PDF, ce qui les rend difficiles à traiter avec un parseur générique
-
Cas fréquents d’échec lors de la recherche du pointeur de cross-reference
- Le pointeur n’est pas à la fin du fichier ni dans les 1 024 derniers octets
- Faute de frappe (
startref, etc.) - Format exceptionnel
-
Sur une étude de 3 977 échantillons PDF réels, environ 0,5 % présentaient une erreur dans la déclaration xref
Le contenu PDF ne commence pas à un offset nul
- S’il y a des données parasites (junk) avant l’en-tête, tous les offsets en octets sont décalés et la position de startxref devient incorrecte
- Il faut recalculer les offsets à partir de la position de l’en-tête et vérifier les deux emplacements
- Cela représente environ 50 % des erreurs
Le pointeur xref vise le milieu de la table xref
- L’offset indiqué peut parfois pointer en plein milieu du contenu de la table xref
- Cas observé dans environ 5 fichiers sur 3 977 échantillons
Le pointeur se trouve près de la xref
- Souvent, le pointeur n’est pas exact, mais l’écart correspond seulement à des espaces ou retours à la ligne juste avant ou après la xref
Le pointeur est correct, mais les offsets xref sont faux
- Les offsets enregistrés dans la table xref peuvent eux-mêmes être erronés
- Certains objets peuvent être corrects tandis que d’autres ont des erreurs d’offset
Le premier pointeur est correct, mais l’offset précédent (/Prev) est anormal
- De nombreux cas montrent que le pointeur /Prev, généré lors de la modification d’un PDF, contient une valeur incorrecte (par exemple : 0)
Le format de la table xref est anormal
- Les cas sont variés :
"xref"collé aux nombres sans saut de ligne, plus d’entrées que d’objets déclarés, ou données parasites au milieu de la table - De nombreux signalements de ce type ont été remontés sous forme d’issues dans PdfPig et ailleurs
Conclusion
- Selon la spécification, le parsing de PDF devrait suivre un ordre structuré, mais de nombreux fichiers réels ne s’y conforment pas, ce qui entraîne divers problèmes de parsing
- Les lecteurs PDF utilisés en pratique incluent par défaut des fonctions élargissant la prise en charge des PDF non conformes
- Ce résumé ne traite que d’une partie du parsing correspondant à 22 pages sur les 1 300 pages de la spécification PDF
Aucun commentaire pour le moment.