15 points par GN⁺ 2025-08-04 | Aucun commentaire pour le moment. | Partager sur WhatsApp
  • 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 (n ou f) 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.

Aucun commentaire pour le moment.