Quelle est la meilleure façon d’importer/lire des données à partir de fichiers PDF ?

StackOverflow https://stackoverflow.com/questions/25550

  •  09-06-2019
  •  | 
  •  

Question

Nous recevons une grande quantité de données de nos clients dans des fichiers PDF dans différents formats [en termes de mise en page], ces fichiers sont généralement des sorties de rapports et sont généralement correctement annotés [ils n'ont généralement pas besoin d'OCR], mais pas suffisamment bien formatés pour que copier simplement plusieurs centaines de pages de texte avec Acrobat ne fonctionnera pas.

La meilleure approche que j'ai trouvée jusqu'à présent est d'écrire un script pour analyser la sortie XML presque valide (les commentaires ne sont pas valides et de nombreux caractères sont échappés de différentes manières, é devient [[[e9]]]é, $ devient \ $, % devient \%...) de l'utilitaire pdftoipe en ligne de commande (pour convertir des fichiers pdf pour un programme appelé ipé), qui me donne des éléments de texte avec leurs positions sur chaque page [voir exemple ci-dessous], ce qui fonctionne assez bien pour les rapports dans lesquels les mêmes valeurs sont au même endroit sur chaque page qui m'intéresse, mais nécessiterait un effort de script supplémentaire pour importer la matrice [onglet croisé] fichiers pdf.pdftoipe n'est pas du tout destiné à cela et peut au mieux être compilé manuellement à l'aide de cygwin pour Windows.

Existe-t-il des bibliothèques qui facilitent cela à partir d'un langage de script que je peux tolérer ?Un outil graphique serait également génial.Et un poney.

sortie pdftopie de cet échantillon ressemble à ça:

<ipe creator="pdftoipe 2006/10/09"><info media="0 0 612 792"/>
<-- Page: 1 1 -->
<page gridsize="8">
<path fill="1 1 1" fillrule="wind">
64.8 144 m
486 144 l
486 727.2 l
64.8 727.2 l
64.8 144 l
h
</path>
<path fill="1 1 1" fillrule="wind">
64.8 144 m
486 144 l
486 727.2 l
64.8 727.2 l
64.8 144 l
h
</path>
<path fill="1 1 1" fillrule="wind">
64.8 144 m
486 144 l
486 727.2 l
64.8 727.2 l
64.8 144 l
h
</path>
<text stroke="1 0 0" pos="0 0" size="18" transformable="yes" matrix="1 0 0 1 181.8 707.88">This is a sample PDF fil</text>
<text stroke="1 0 0" pos="0 0" size="18" transformable="yes" matrix="1 0 0 1 356.28 707.88">e.</text>
<text stroke="1 0 0" pos="0 0" size="18" transformable="yes" matrix="1 0 0 1 368.76 707.88"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 692.4"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 677.88"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 663.36"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 648.84"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 634.32"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 619.8"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 605.28"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 590.76"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 576.24"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 561.72"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 547.2"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 532.68"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 518.16"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 503.64"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 489.12"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 474.6"> </text>
<text stroke="0 0 1" pos="0 0" size="16.2" transformable="yes" matrix="1 0 0 1 67.32 456.24">If you can read this</text>
<text stroke="0 0 1" pos="0 0" size="16.2" transformable="yes" matrix="1 0 0 1 214.92 456.24">,</text>
<text stroke="0 0 1" pos="0 0" size="16.2" transformable="yes" matrix="1 0 0 1 219.48 456.24"> you already have A</text>
<text stroke="0 0 1" pos="0 0" size="16.2" transformable="yes" matrix="1 0 0 1 370.8 456.24">dobe Acrobat </text>
<text stroke="0 0 1" pos="0 0" size="16.2" transformable="yes" matrix="1 0 0 1 67.32 437.64">Reader i</text>
<text stroke="0 0 1" pos="0 0" size="16.2" transformable="yes" matrix="1 0 0 1 131.28 437.64">n</text>
<text stroke="0 0 1" pos="0 0" size="16.2" transformable="yes" matrix="1 0 0 1 141.12 437.64">stalled on your computer.</text>
<text stroke="0 0 0" pos="0 0" size="16.2" transformable="yes" matrix="1 0 0 1 337.92 437.64"> </text>
<text stroke="0 0.502 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 342.48 437.64"> </text>
<image width="800" height="600" rect="-92.04 800.64 374.4 449.76" ColorSpace="DeviceRGB" BitsPerComponent="8" Filter="DCTDecode" length="369925">
feedcafebabe...
</image>
</page>
</ipe>
Était-ce utile?

La solution

Nous utilisons Xpdf dans l'une de nos applications.C'est une bibliothèque C++ qui est principalement utilisée pour le rendu PDF, bien qu'elle dispose d'un extracteur de texte qui pourrait être utile pour ce projet.

Autres conseils

Si vous acceptez d'appeler quelque chose d'externe, vous pouvez utiliser script fantôme - regardez le script ps2ascii inclus avec la distribution.Je ne suis pas sûr de ce que vous attendez d'un outil graphique : un gros bouton sur lequel vous appuyez pour choisir les fichiers d'entrée et de sortie ?Un aperçu ?Vous pourrez peut-être utiliser GSView, selon ce que vous souhaitez.

pdftohtml -xml

bien que pdftoipe semble plus détaillé !!

Avez-vous regardé Aspose?Nous l'utilisons pour une application ASP.net et j'ai également vu quelques exemples de vbscript l'utilisant.Ce n'est pas particulièrement cher non plus.

http://www.aspose.com/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top