Extraction de texte à partir de PDF en C#

Assez simplement, j'ai besoin d'extraire du texte de plusieurs fichiers PDF (beaucoup en fait) afin d'analyser le contenu avant de le coller dans une base de données SQL.

J'ai trouvé des bibliothèques C # libres assez sommaires qui fonctionnent (la meilleure utilise iTextSharp), mais il y a des dizaines d'erreurs de formatage et certains caractères sont brouillés et beaucoup de temps il y a des espaces (' ') partout - à l'intérieur des mots, entre chaque lettre, d'énormes blocs d'entre eux prenant plusieurs lignes, tout semble peu aléatoire.

Y a-t-il un moyen facile de le faire que je néglige complètement (très probablement!) ou est-ce une tâche un peu ardue qui consiste à convertir les valeurs d'octets extraites en lettres de manière fiable?

21
demandé sur Bjarki Heiðar 2010-01-22 13:05:05

7 réponses

Vous pouvez jeter un oeil à Cet article . Il est basé sur l'excellente bibliothèqueiTextSharp .

9
répondu Darin Dimitrov 2010-01-22 10:10:28

Il peut être difficile de le faire de manière fiable. Le problème est que le PDF est un format de présentation qui attache de l'importance à une bonne typographie. Supposons que vous vouliez juste sortir un seul mot: Appuyez sur .

Un moteur de rendu PDF peut générer 2 appels distincts, comme indiqué dans ce pseudo-code:

moveto (x1, y); output ("T")
moveto (x2, y); output ("ap")

Cela serait fait parce que le crénage par défaut (espacement inter-lettres) entre les lettres T et a pourrait ne pas être acceptable pour le moteur de rendu, ou il pourrait ajouter ou supprimer un espace micro entre les caractères pour obtenir une ligne pleinement justifiée. Ce que cela donne finalement, c'est que les fragments de texte réels trouvés dans PDF ne sont très souvent pas des mots complets, mais des morceaux d'entre eux.

19
répondu Tarydon 2010-01-22 10:16:39

Jetez un oeil à Tika sur DotNet, disponible via Nuget: https://www.nuget.org/packages/TikaOnDotnet.TextExtractor/

Ceci est un wrapper autour de la très bonne bibliothèque Java Tika, en utilisant IKVM. Très facile à utiliser et gère une grande variété de types de fichiers autres que PDF, y compris les anciens et nouveaux formats office. Il sélectionnera automatiquement l'analyseur en fonction de l'extension de fichier, donc c'est aussi simple que:

var text = new TextExtractor().Extract(file.FullName).Text;

Update: une mise en garde avec cette solution est que le développement sur IKVM a pris fin. Je ne suis pas sûr de ce que cela signifiera à long terme. http://weblog.ikvm.net/2017/04/21/TheEndOfIKVMNET.aspx

12
répondu David Hammond 2018-04-27 14:26:24

Vous pouvez essayer Toxy, un framework d'extraction de texte/données dans. NET. dans Toxy 1.0, PDF sera pris en charge. Pour plus de détails, veuillez visiter http://toxy.codeplex.com

3
répondu Tony Qu 2014-01-14 23:28:55

Vous pouvez essayer Docotic.Bibliothèque Pdf (avertissement: je travaille pour Bit Miracle) pour extraire du texte à partir de fichiers PDF. La bibliothèque utilise des heuristiques pour extraire un texte agréable sans espaces indésirables entre les lettres dans les mots.

Veuillez jeter un oeil à un exemple qui montre Comment extraire du texte à partir de PDF .

1
répondu Bobrovsky 2011-05-22 07:25:50

Si vous cherchez une alternative "gratuite", consultez pdf Clown. Personnellement, j'ai utilisé l'approche basée sur iFilter, et cela semble fonctionner correctement au cas où vous auriez besoin de prendre en charge d'autres types de fichiers facilement. Exemple de code ici.

0
répondu Jussi Palo 2015-02-23 10:27:39

Dans le cas où vous traitez des fichiers PDF dans le but d'importer des données dans une base de données, je suggère de considérer ByteScout PDF Extractor SDK. Certaines fonctions utiles incluses sont

  • tableau de détection;
  • extraction de texte au format CSV, XML ou texte formaté (avec la restauration de mise en page facultative);
  • Recherche de texte avec prise en charge des expressions régulières;
  • API de bas niveau pour accéder aux objets texte

avertissement: je suis affilié à ByteScout

0
répondu Eugene M 2015-06-22 09:44:53