- PDFSyntax est une bibliothèque Python centrée sur le chapitre 7, « Syntax », de la spécification PDF, utilisée pour inspecter et transformer la structure documentaire interne des fichiers PDF jusqu’au niveau de l’octet
- Écrite en pur Python depuis zéro, c’est une bibliothèque légère sans dépendances qui met l’accent sur la simplicité et l’immuabilité
- Son mode d’édition par défaut est la mise à jour incrémentale non destructive autorisée par la spécification PDF, qui ajoute des sections de modification à la fin du fichier d’origine, avec possibilité de revenir en arrière ou de fusionner en une seule révision
- La CLI propose notamment
overview, disasm, text, fonts, browse, etc. ; browse génère un HTML statique lisible avec hyperliens pour explorer la structure interne
- Le projet est actuellement en bêta, l’API peut changer à tout moment et, bien qu’il soit sous licence MIT, il n’accepte pas encore de contributions externes
Inspection et transformation de la structure interne des PDF
- PDFSyntax est une bibliothèque Python destinée à inspecter et transformer la structure interne des fichiers PDF
- Elle se concentre sur le chapitre 7 de la spécification Portable Document Format (PDF), « Syntax »
- La gestion de la structure documentaire est implémentée jusqu’au niveau de l’octet, ce qui permet des usages tels que :
- accès aux métadonnées
- rotation des pages
- opérations de lecture/écriture de PDF
- accès et manipulation des objets internes
Orientations de conception
- Les fonctions internes sont exposées comme une boîte à outils API pour les opérations de lecture/écriture de PDF
- Une partie des fonctionnalités est aussi fournie via une CLI pour une utilisation dans le terminal ou le navigateur
- La bibliothèque est écrite en pur Python et n’a aucune dépendance externe
- Elle met l’accent sur la simplicité et l’immuabilité
- Son mode d’édition par défaut repose sur des mises à jour incrémentales qui n’écrasent pas directement l’original, mais ajoutent les modifications à la fin du fichier source
- il est possible de revenir à une révision précédente si nécessaire
- il est également possible de fusionner toutes les révisions en une seule
Installation et utilisation de la CLI
- Installation possible depuis PyPI
pip install pdfsyntax
- Le format d’utilisation de base de la CLI est le suivant
pdfsyntax COMMAND FILE
- En cas d’installation depuis les sources, on peut l’exécuter avec une forme plus longue
python3 -m pdfsyntax COMMAND FILE
- Les principales commandes pour une analyse rapide des PDF sont les suivantes
overview : affiche des informations textuelles sur la structure et les métadonnées
disasm : affiche un dump de la structure du fichier dans le terminal
text : affiche le texte extrait en conservant la disposition spatiale, comme dans un scan
fonts : affiche la liste des polices utilisées
browse : produit un rendu lisible des sources PDF et génère un HTML statique enrichi d’hyperliens pour explorer la structure interne
Utilisation de l’API
- PDFSyntax est majoritairement composé de fonctions simples
- Avec
readfile, on peut lire un PDF, puis récupérer les métadonnées sous forme de dict Python avec metadata
>>> from pdfsyntax import readfile, metadata
>>> doc = readfile("samples/simple_text_string.pdf")
>>> metadata(doc)
- L’objet
Doc est pratiquement la seule classe dédiée, utilisée pour stocker l’état interne du document
- contenu mis en cache ou mémoïsé depuis le fichier d’origine
- modifications d’ajout, de mise à jour ou de suppression de contenu
- historique des modifications suivi via les mises à jour incrémentales
- La même fonction
metadata peut aussi être utilisée comme méthode de l’objet Doc
>>> doc.metadata()
- Des fonctions bas niveau comme
get_object et update_object permettent d’accéder directement aux objets internes du document et de les manipuler
- Des fonctions de plus haut niveau comme
rotate sont également proposées
>>> from pdfsyntax import rotate, writefile
>>> doc180 = rotate(doc, 180)
- Dans l’exemple de rotation, l’objet d’origine n’est pas modifié ; un nouvel objet contenant la rotation en cours est créé
- Le PDF modifié peut être écrit sur disque avec
writefile
>>> writefile(doc180, "rotated_doc.pdf")
- Le fichier résultant ajoute une nouvelle section après le contenu d’origine ; en supprimant cette section, on peut annuler les modifications
État actuel et politique de contribution
- Le projet est en cours de développement et constitue un logiciel de qualité bêta
- L’API peut changer à tout moment
- La liste des travaux à venir comprend notamment :
- découpage et assemblage de pages
- compression sans perte
- davantage de filtres
- amélioration de l’extraction de texte
- amélioration de l’extraction de texte grâce à la détection de mise en page
- PDFSyntax est sous licence MIT
- Il n’accepte actuellement pas de contributions externes
- c’est un projet personnel et le temps disponible est limité
- l’objectif est d’abord de se concentrer sur les nouvelles fonctionnalités et la feuille de route de refactorisation, puis d’ouvrir aux contributions une fois le projet stabilisé
1 commentaires
Commentaires sur Hacker News
Il y a longtemps, on m’a confié une tâche consistant à extraire des données de plusieurs PDF, et j’ai créé un outil pour visualiser le placement des caractères sur la page ainsi que les boîtes englobantes de tous les éléments
Au final, le projet a été un échec total, et certaines personnes se sont fâchées parce que les résultats attendus n’étaient pas au rendez-vous
Aujourd’hui, je m’orienterais à 100 % vers l’exploitation des capacités des LLM pour extraire des données de PDF. À l’époque, cette option n’existait pas
Selon les attentes, on peut aller assez loin avec l’OCR, mais d’après mon expérience, cela reste toujours juste en dessous de ce qu’il faudrait
J’ai vu plusieurs fois des cas où les caractères du texte étaient des glyphes de police personnalisés sans correspondance de type ASCII, ou bien, comme c’est particulièrement courant dans les exports CAD, où la forme des lettres était dessinée avec des lignes
Dans ce cas, il n’y a pas de texte identifiable à extraire, et il faut finalement repasser la page à l’OCR
Chez https://runtrellis.com/, nous construisons de zéro un pipeline de traitement PDF basé sur des LLM et des modèles vision-langage, et nous avons constaté une précision proche de 100 % même sur des PDF difficiles
La clé est d’utiliser ensemble des moteurs à base de règles et des données de référence pour valider les résultats par recoupement
Plutôt chouette. Si j’avais eu ça dans mon ancien boulot, je pense que je l’aurais beaucoup utilisé
Idéalement, ce serait bien que, comme https://lapo.it/asn1js/, on puisse déposer un fichier et que tout le traitement se fasse en local
Grâce au « privilège » de maintenir du code qui extrait des données de PDF, j’utilise depuis un moment la version gratuite de iText RUPS pour déboguer des PDF
Les fonctions d’inspection interne ici ont l’air plus puissantes, donc ça pourrait être très bien. Je compte l’essayer
Il me semble qu’il existait un projet similaire sur GitHub. Il permettait de visualiser des données binaires arbitraires à partir d’un schéma donné, et il me semble qu’il y avait un exemple TCP/IP
Ça avait l’air très bien pour ce rôle, mais dans mon dernier projet nous avions aussi besoin de sérialisation, donc nous ne l’avons pas utilisé
https://github.com/HexFiend/HexFiend/blob/master/templates/T...
Fait intéressant, quand je teste ce genre de descripteur de format de fichier, j’utilise PDF comme « Hello World », parce que la spécification PDF est particulièrement bizarre
Si le langage de description peut représenter correctement la structure d’un PDF, on peut dire qu’il est vraiment bien conçu
Jusqu’ici, je n’ai pas eu beaucoup de chance avec autre chose que des systèmes permettant de sortir du mode déclaratif pour dire « puis exécute ce code »
Ça pourrait être pratique aussi pour la forensique et la recherche de filigranes
Ça a l’air bien
Ce serait encore mieux si tous les octets du PDF étaient affichés.
endobjetxrefne semblent pas visiblesCe serait vraiment super si ça sortait sous forme de bibliothèque pour navigateur. Il suffirait de glisser-déposer un fichier pour voir ce qu’il contient. C’est impressionnant malgré tout
Beau travail. C’est un outil de prévisualisation de sécurité très utile. Les PDF sont une plaie
Je me demande si l’outil d’UI qui fait la visualisation est une bibliothèque
J’aime beaucoup le format de l’interface, et j’aimerais aussi l’utiliser pour décortiquer et déboguer des flux d’octets vidéo
Modification : en fait, c’est assez simple. Bon usage du CSS ! https://github.com/desgeeko/pdfsyntax/blob/main/docs/simple_...
Dans le même ordre d’idées, pourquoi PDF n’a-t-il toujours pas été remplacé ? Il y a XPS, DjVu, XHTML (EPUB), mais ils semblent tous viser des cas d’usage différents, par exemple plutôt des fichiers HTML empaquetés
Ce que je voudrais, c’est un format de document simple qui permette d’intégrer d’autres fichiers et des métadonnées sans la lourdeur d’Adobe
Il faudrait pouvoir créer des liens hypertexte dans une page, éviter que le texte déborde quand on change la taille des caractères, et imprimer de façon cohérente
PDF n’est pas un format de données, mais un format de description de page ; toutes ses décisions découlent du besoin de pouvoir imprimer la même « page » malgré des systèmes d’exploitation, logiciels, imprimantes et formats de papier exacts différents
La principale raison pour laquelle PDF dure, c’est probablement qu’une grande partie du monde repose sur le paradigme du document, c’est-à-dire l’idée qu’un « document » est un « paquet de feuilles de papier »
Du résumé après une consultation à l’hôpital aux documents d’immatriculation d’une voiture, tout cela possède déjà une représentation visuelle précise et choisie pour bien tenir sur papier
HTML, par exemple sous une forme autonome avec images et CSS en data URL, ou ePub, pourrait être meilleur à la plupart des égards
Mais l’objectif est si différent que, si l’on allait aujourd’hui convaincre les gens qui produisent des PDF de faire cette transition, on les entendrait se plaindre que le contenu apparaît légèrement différemment selon l’appareil et que même les sauts de page changent selon les réglages
Un point intéressant à ce sujet est que même Google Docs utilise par défaut le mode paginé plutôt que le mode « sans page », alors qu’il me semble que bien moins de la moitié des documents sont imprimés ou convertis en PDF
Le mode « sans page » est pourtant beaucoup plus utile : comme une page web ordinaire, il s’adapte à la fenêtre et permet de faire défiler indéfiniment une surface continue
L’exigence « que le texte ne déborde pas » implique beaucoup de détails
Dans un PDF, chaque lettre, caractère ou glyphe du texte peut avoir une position x,y exacte sur la page, parfois même en dehors de la page
Cela permet de positionner précisément le contenu, peu importe ce qui l’entoure. L’application qui produit le PDF doit placer les éléments correctement et implémenter les retours à la ligne par caractère ou par mot
XPS a été ce qui s’est le plus rapproché d’une réimplémentation de PDF, mais Microsoft n’a pas obtenu suffisamment de soutien d’autres acteurs, et il a discrètement disparu
PostScript, même s’il est particulier, est un langage de programmation complet ; PDF ne l’est pas. Autrement dit, il n’est pas Turing-complet
PDF ne prend pas en charge les flux de contrôle, donc ce qui pourrait être exprimé dans PostScript par une simple boucle doit, en PDF, être déroulé et stocké comme une série de déclarations ou expressions simples
L’avantage est qu’il n’est pas nécessaire d’avoir un interpréteur de programme complet pour rendre un PDF