41 votes

Existe-t-il un analyseur PDF pour PHP ?

Bonjour, je connais plusieurs PDF Générateurs pour php (fpdf, dompdf, etc.) Ce que je veux savoir c'est à propos d'un parser.

Pour des raisons indépendantes de ma volonté, certaines informations dont j'ai besoin se trouvent uniquement dans un tableau à l'intérieur d'un PDF. et je dois extraire ce tableau et le convertir en un tableau.

Des suggestions ?

29voto

ircmaxell Points 74865

J'en ai déjà écrit un (pour des besoins similaires), et je peux dire ceci : Amusez-vous bien. C'est une tâche assez complexe. Le site Spécification PDF est grande et peu maniable. Il existe plusieurs méthodes pour stocker du texte à l'intérieur. Et le comble, c'est que chaque générateur de PDF est différent dans son fonctionnement. Ainsi, alors que quelque chose comme TFPDF ou DOMPDF crée des PDF VRAIMENT faciles à lire (du point de vue de la machine), Acrobat produit des documents vraiment infernaux.

La raison est la façon dont il écrit le texte. La plupart des moteurs de rendu basés sur le DOM - que j'ai utilisés - écrivent la ligne entière comme une seule chaîne de caractères, et la positionnent une seule fois (ce qui est vraiment facile à lire). Acrobat essaie d'être plus efficace (et il l'est) en écrivant seulement un ou peut-être quelques caractères à la fois, et en les positionnant indépendamment. Si cela simplifie VRAIMENT le rendu, cela rend la lecture BEAUCOUP plus difficile.

L'avantage, c'est que le format PDF est en soi très simple. Vous avez des "objets" qui suivent une syntaxe régulière. Vous pouvez ensuite les relier entre eux pour générer le contenu. La spécification fait un bon travail de description du format de fichier. Mais la lecture dans le monde réel va nécessiter un peu de matière grise...

Quelques conseils utiles que j'ai dû apprendre à la dure si vous voulez écrire vous-même :

  1. Adobe aime remodeler les polices. Ainsi, les caractères 65 ne sera probablement pas A ... Il faut trouver un objet map et en déduire ce qu'il fait en fonction des caractères qu'il contient. Et c'est efficace puisque si un caractère n'apparaît pas dans le document pour cette police, il ne l'inclut pas (ce qui rend la vie difficile si vous essayez d'éditer un PDF par programme)...
  2. Écrivez-le aussi abstrait que possible. Ecrivez des classes pour chaque type d'objet, et chaque type natif (chaînes de caractères, nombres, etc.). Laissez ces classes analyser pour vous. Il y aura pas mal de répétitions là-dedans, mais vous vous économiserez à la fin quand vous réaliserez que vous avez besoin de modifier quelque chose pour un seul type spécifique)...
  3. Écrivez pour une ou deux versions spécifiques de la spécification PDF, et appliquez-la. Vérifiez le numéro de version, et s'il est supérieur à ce que vous attendez, renoncez... Et n'essayez pas de "faire en sorte que ça marche". Si vous voulez supporter des versions plus récentes, sortez la spécification et mettez à jour l'analyseur syntaxique à partir de là. N'essayez pas de faire des essais et des erreurs à votre façon (ce n'est pas amusant)...
  4. Bonne chance avec les flux compressés. J'ai découvert que, typiquement, vous ne pouvez pas faire confiance aux arguments de longueur pour vérifier ce que vous décompressez. Parfois (pour certains générateurs) cela fonctionne bien... D'autres fois, il y a une erreur d'un ou plusieurs octets. J'essaie juste de le déflater si le filtre correspond, et ensuite je force la longueur...
  5. Lorsque vous testez des longueurs, n'utilisez pas strlen . Utilisez mb_strlen($string, '8bit') car il compensera les différents jeux de caractères (et autorisera des caractères potentiellement invalides dans d'autres jeux de caractères).

Sinon, bonne chance...

17voto

Timo Points 2170

J'utilise PDFBox pour cela ( http://pdfbox.apache.org/ ). Ce logiciel est basé sur Java et indépendant de toute plateforme. Il fonctionne rapidement et de manière fiable. Vous pouvez l'utiliser via exec ou shell execute ou via un pont PHP/Java ( http://php-java-bridge.sourceforge.net/ )

3voto

ryanday Points 1367

Avez-vous déjà regardé xPDF ? Il existe un programme appelé pdftotext qui effectue la conversion. Vous pouvez l'appeler depuis PHP et lire la version texte du PDF. Vous devrez avoir la possibilité d'exécuter exec() ou system() à partir de PHP, ce qui peut ne pas fonctionner sur toutes les solutions hébergées.

Il existe également des exemples sur le site Site PHP qui convertit les PDF en texte, bien que ce soit assez grossier. Vous pouvez également essayer certains de ces exemples. Sur ce Page PHP cherchez luc à phpt point org.

1voto

Mark Redman Points 10816

Jetez un coup d'œil à GhostScript ou ITextSharp, il existe plusieurs versions multiplateformes de ces deux logiciels.

1voto

Bill Karwin Points 204877

Zend_Pdf fait partie de la Zend Framework . Leur manuel indique :

El Zend_Pdf est un PDF (Portable Document Format) moteur de manipulation. Il peut charger, créer, modifier et sauvegarder des documents. Ainsi, il peut aider toute application PHP à créer dynamiquement des documents PDF en modifiant des documents existants ou en générant de nouveaux documents à partir de zéro.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X