Comment extraire du texte d'un PDF? [fermé]


152

Quelqu'un peut-il recommander une bibliothèque / API pour extraire le texte et les images d'un PDF? Nous devons être en mesure d'obtenir du texte contenu dans des régions pré-connues du document, l'API devra donc nous donner des informations de position de chaque élément de la page.

Nous aimerions que ces données soient sorties au format xmlou json. Nous examinons actuellement PdfTextStream qui semble assez bon, mais nous aimerions entendre les expériences et les suggestions d'autres personnes.

Existe-t-il des alternatives (commerciales ou gratuites) pour extraire du texte d'un pdf par programme?



1
Pour ceux quelque chose très simple besoin (pas d' info de position), ce regex perl peut suffire: /^\s*\[?\((.*?)\)\]?\s*T[Jj]/mg. Il recherche simplement l'opérateur Tj / TJ, qui désigne tout le texte normal d'un PDF.
Alex R

1
utiliser la bibliothèque TomRoush PdfBox cela fonctionne bien sur Android
FaisalAhmed

Réponses:


113

On m'a donné un fichier pdf de 400 pages avec un tableau de données que je devais importer - heureusement pas d'images. Ghostscript a fonctionné pour moi:

gswin64c -sDEVICE=txtwrite -o output.txt input.pdf

Le fichier de sortie était divisé en pages avec des en-têtes, etc., mais il était alors facile d'écrire une application pour supprimer les lignes vierges, etc., et aspirer les 30 000 enregistrements. -dSIMPLEet -dCOMPLEXn'a fait aucune différence dans ce cas.


37
Sous Linux et cygwin, la commande est à la gsplace de gswin64c. Fonctionne parfaitement. Aucune merde payante brevetée. Cela fonctionne juste.
Jannes

4
Ouais, fonctionne très bien! Maintenant, je peux utiliser "grep" en toute impunité sur mes fichiers pdf. Puisque je peux grep mieux que je ne peux lire, c'est une victoire! (:-) Vote positif.
David Elson

1
Le seul problème que j'ai eu avec cela était de l'utiliser sur des fichiers PDF avec des polices «anciennes» intégrées. Fonctionne parfaitement pour les fichiers PDF générés localement, mais plus difficile avec des sources obscures. Sinon, un excellent scriptlet.
Jon M

que fait -sDEVICE=txtwrite-on? Je ne comprends pas grand-chose après avoir lu Comment utiliser Ghostscript | Sélection d'un périphérique de sortie
Ooker

Pour la sortie stdout au lieu d'enregistrer sous forme de fichier texte, utilisez gswin64c -sDEVICE=txtwrite -o- input.pdf. Source (légèrement modifiée par moi): gist.github.com/drmohundro/560d72ed06baaf16f191ee8be34526ac
LuH

33

Depuis aujourd'hui, je le sais: la meilleure chose pour l'extraction de texte à partir de PDF est TET, la boîte à outils d'extraction de texte . TET fait partie de la famille de produits PDFlib.com.

PDFlib.com est la société de Thomas Merz. Au cas où vous ne reconnaissez pas son nom: Thomas Merz est l'auteur de la "Bible PostScript et PDF".

La première incarnation de TET est une bibliothèque . Celui-ci peut probablement faire tout ce que Budda006 voulait, y compris des informations de position sur chaque élément de la page. Oh, et il peut également extraire des images. Il recombine des images qui sont fragmentées en morceaux.

pdflib.com propose également une autre incarnation de cette technologie, le plugin TET pour Acrobat . Et la troisième incarnation est le PDFlib TET iFilter . Il s'agit d'un outil autonome pour les postes de travail des utilisateurs. Les deux sont gratuits (comme dans la bière) à des fins privées et non commerciales.

Et c'est vraiment puissant. Bien mieux que l'extraction de texte d'Adobe. Il a extrait du texte pour moi là où d'autres outils (y compris Adobe) ne crachent que des ordures.

Je viens de tester l'outil autonome de bureau, et ce qu'ils disent sur leur page Web est vrai. Il a une très bonne ligne de commande. Certains de mes fichiers de test PDF "problématiques" ont été traités avec mon entière satisfaction.

Cette chose sera désormais ma recommandation pour toutes les exigences d'extraction de texte PDF sophistiquées et difficiles.

TET est tout simplement génial. Il détecte les tables. À l'intérieur des tableaux, il identifie les cellules couvrant plusieurs colonnes. Il identifie les lignes du tableau et le contenu de chaque cellule du tableau séparément. Il gère très bien les césures: il supprime les tirets et restaure les mots complets. Il prend en charge les langues non ASCII (y compris CJK, l'arabe et l'hébreu). Lors de la rencontre de ligatures, il restaure les caractères d'origine ...

Essaie.


32
Il n'y a pas de version d'essai et 440 $, c'est un peu trop pour «essayer».
Rok Strniša


Ce service est-il disponible via une API?
bart

1
je l'ai testé, il ne reconnaît pas les colonnes. J'ai scanné une première page de tabloïd anglais. Le texte était divisé en 3 colonnes sur le papier, mais ce plugin mélangeait complètement les phrases, ce qui lui donnait un aspect bizarre. Ghostscript qui est gratuit avait exactement la même sortie.
NoWhereToBeSeen

1
@RedHotScalability:, le TET aussi BTW ne reconnaît colums si elle est utilisée avec les paramètres corrects. Mais je laisse cela comme un exercice à l'ambitieux scripteur JS pour lire la documentation et découvrir comment ...
Kurt Pfeifle

29

Un outil de ligne de commande efficace, open source, gratuit, disponible à la fois sous Linux et Windows: simplement nommé pdftotext. Cet outil fait partie de la bibliothèque xpdf.

http://en.wikipedia.org/wiki/Pdftotext


4
Sur une note latérale: utilisez le -layoutcommutateur pour conserver les tables, fonctionne plutôt bien.
sebastian


12

Voici ma suggestion. Si vous souhaitez extraire du texte d'un PDF, vous pouvez importer le fichier PDF dans Google Docs, puis l'exporter dans un format plus convivial tel que .html, .odf, .rtf, .txt, etc. Tout cela à l'aide de l'API Drive . C'est gratuit * et robuste. Jeter un coup d'œil à:

https://developers.google.com/drive/v2/reference/files/insert https://developers.google.com/drive/v2/reference/files/get

Comme il s'agit d'une API de repos, elle est compatible avec TOUS les langages de programmation. Les liens que j'ai postés ci-dessus ont des exemples fonctionnels pour de nombreux langages, notamment: Java, .NET, Python, PHP, Ruby et autres.

J'espère que cela aide.


2
J'ai utilisé cette option et je ne la recommanderais pas. L'extraction de texte PDF de Google n'est pas aussi bonne que de nombreuses alternatives (en particulier pour les non-anglais) et elle est également très lente.
Björn Lindqvist

10

PdfTextStream (que vous avez dit avoir examiné) est maintenant gratuit pour les applications à thread unique. À mon avis, sa qualité est bien meilleure que celle des autres bibliothèques (en particulier pour des choses comme les polices intégrées géniales, etc.).

Sinon, vous devriez jeter un œil à Apache PDFBox , open source.


PdfTextStream n'est pas pris en charge dans Android. Existe-t-il de bonnes bibliothèques comme celle-ci disponibles pour Android?
FaisalAhmed

@FaisalAhmed et PDFBox?
Renaud

Oui, PdfBox n'est pas non plus pris en charge dans Android .... PdfTextStream et PdfBox utilisent tous deux une partie awt qui n'est pas prise en charge dans Android
FaisalAhmed



6

Un des commentaires ici utilisait gs sous Windows. J'ai eu un certain succès avec cela sur Linux / OSX aussi, avec la syntaxe suivante:

gs \
 -q \
 -dNODISPLAY \
 -dSAFER \
 -dDELAYBIND \
 -dWRITESYSTEMDICT \
 -dSIMPLE \
 -f ps2ascii.ps \
 "${input}" \
 -dQUIET \
 -c quit

J'ai utilisé à la dSIMPLEplace de dCOMPLEXparce que ce dernier produit 1 caractère par ligne.


5

Comme la question concerne spécifiquement les outils alternatifs pour obtenir des données de PDF au format XML , vous pourriez être intéressé de jeter un coup d'œil à l'outil commercial "ByteScout PDF Extractor SDK" qui est capable de faire exactement cela: extraire du texte de PDF au format XML avec les données de positionnement (x, y) et les informations de police:

Texte dans le PDF source:

Products | Units | Price 

XML de sortie:

 <row>
 <column>
  <text fontName="Arial" fontSize="11.0" fontStyle="Bold" x="212" y="126" width="47" height="11">Products</text> 
  </column>
 <column>
  <text fontName="Arial" fontSize="11.0" fontStyle="Bold" x="428" y="126" width="27" height="11">Units</text> 
  </column>
 <column>
  <text fontName="Arial" fontSize="11.0" fontStyle="Bold" x="503" y="126" width="26" height="11">Price</text> 
  </column>
</row>

PS: en outre, il divise également le texte en une structure basée sur un tableau.

Divulgation: je travaille pour ByteScout


3

La meilleure chose à laquelle je puisse penser actuellement (dans la liste des outils "simples") est Ghostscript (la version actuelle est v.8.71) et le programme utilitaire PostScript ps2ascii.ps. Ghostscript l'envoie dans son libsous-répertoire. Essayez ceci (sous Windows):

gswin32c.exe ^
   -q ^
   -sFONTPATH=c:/windows/fonts ^
   -dNODISPLAY ^
   -dSAFER ^
   -dDELAYBIND ^
   -dWRITESYSTEMDICT ^
   -dCOMPLEX ^
   -f ps2ascii.ps ^
   -dFirstPage=3 ^
   -dLastPage=7 ^
   input.pdf ^
   -dQUIET ^
   -c quit

Cette commande traite les pages 3 à 7 de input.pdf. Lisez les commentaires dans le ps2ascii.psfichier lui-même pour voir ce que signifient les nombres "bizarres" et les informations supplémentaires ( ils indiquent des chaînes, des positions, des largeurs, des couleurs, des images, des rectangles, des polices et des sauts de page ... ). Pour obtenir une sortie texte "simple", remplacez la -dCOMPLEXpièce par -dSIMPLE.


2
Comme vous pouvez le deviner, cela ne produit que le test ASCII. Bien que gratuit, ce n'est pas une excellente option pour les logiciels que vous prévoyez d'utiliser avec des langues autres que l'anglais.
userx

3
@userx: Comme vous pouvez le deviner, il s'agit d'un logiciel libre: donc du code source disponible. Possibilité d'extension pour le support de non-ASCII ...
Kurt Pfeifle

@userx: aujourd'hui, j'ai découvert 'TET', la boîte à outils d'extraction de texte de pdflib.com. Voir mon autre réponse.
Kurt Pfeifle

ps2ascii de Ghostscript 9.07 fonctionnait à merveille sur mon système OpenBSD. Je viens de convertir un PDF de 526 pages en texte brut. Maintenant, je peux facilement grep et extraire du texte pour les notes. J'ai utilisé la commande simple ps2ascii book.pdf notes.txt. Si votre document est principalement ASCII, vous avez de la chance.
Clint Pachl le

3

Je sais que ce sujet est assez ancien, mais ce besoin est toujours vivant. J'ai lu de nombreux documents, forums et scripts et en ai construit un nouveau avancé qui prend en charge les pdf compressés et non compressés:

https://gist.github.com/smalot/6183152

Dans certains cas, la ligne de commande est interdite pour des raisons de sécurité. Ainsi, une classe PHP native peut répondre à de nombreux besoins.

J'espère que ça aide tout le monde





0

Sur mes systèmes Macintosh, je trouve que "Adobe Reader" fait un assez bon travail. J'ai créé un alias sur mon bureau qui pointe vers "Adobe Reader.app", et tout ce que je fais est de déposer un fichier pdf sur l'alias, ce qui en fait le document actif dans Adobe Reader, puis à partir du menu Fichier, Je choisis "Enregistrer sous forme de texte ...", je lui donne un nom et où l'enregistrer, je clique sur "Enregistrer" et j'ai terminé.


5
Le PO a recherché une solution pour extraire du texte d'un pdf par programme . Votre réponse propose plutôt une routine manuelle.
mkl
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.