9
votes

Extraire des colonnes de texte à partir d'un fichier PDF en utilisant iText

J'ai besoin d'extraire du texte des fichiers PDF à l'aide d'ITEXT.

Le problème est que: Certains fichiers PDF contiennent 2 colonnes et lorsque j'extraire du texte, je reçois un fichier texte où les colonnes sont fusionnées comme résultat (texte des deux colonnes Dans la même ligne)

Ceci est le code: xxx

Pourriez-vous m'aider avec la tâche?


0 commentaires

6 Réponses :


0
votes

Le fichier que vous extrayez est assez complexe à des fins d'extraction des données. Il y a des tables, des images, plusieurs colonnes. Vous aurez besoin d'algorithmes spéciaux pour déterminer l'ordre de lecture et traiter également les données de la table.

Qu'essayez-vous d'atteindre ici? Vous pouvez utiliser un moteur OCR commercial à la place et le laisser faire tout le travail acharné, puis traiter les données de là.


0 commentaires

29
votes

Je suis l'auteur du sous-système d'extraction de texte iText. Ce que vous devez faire est de développer votre propre stratégie d'extraction de texte (si vous regardez comment pdftextextractor.gettextFrompage est implémenté, vous verrez que vous pouvez fournir une stratégie enfichable).

Comment vous allez déterminer où les colonnes commencent et que l'arrêt est entièrement à vous - c'est un problème difficile - PDF n'a aucun concept de colonnes (Heck, il n'a même pas de concept de mots - juste Mettre en place l'extraction de texte selon laquelle la stratégie par défaut fournit est assez délicate). Si vous connaissez à l'avance dans l'endroit où les colonnes sont, vous pouvez utiliser un filtre régional sur le rappel du texte du rendu de texte (il existe un code dans la bibliothèque IText pour le faire, et la dernière version du livre IText in Action donne un exemple détaillé) .

Si vous devez obtenir des colonnes à partir de données arbitraires, vous avez des travaux d'algorithme devant vous (si vous obtenez quelque chose de travail, j'aimerais jeter un oeil). Quelques idées sur la façon d'approcher ceci:

  1. Utilisez un algorithme similaire à celui utilisé dans la stratégie d'extraction de texte par défaut (emplacement de localisation ...) pour obtenir une liste des mots et des emplacements X / y (Assurez-vous de prendre en compte l'angle de rotation)
  2. Pour chaque mot, dessinez une ligne imaginaire exécutant la hauteur totale de la page. Numérisez pour tous les autres mots qui commencent à la même position x.
  3. Lors de la numérisation, recherchez également des mots qui intersectez la position X (mais ne démarrez pas la position X). Cela vous donnera un emplacement potentiel pour les positions de la colonne Démarrer / STOP Y sur la page.
  4. Une fois que vous avez une colonne X et Y, vous pouvez recourir à une approche filtrée de la région

    Une autre approche pouvant être faiblement réalisable serait d'analyser les opérations de dessin et de rechercher de longues lignes horizontales et verticales (en supposant que les colonnes soient délimitées dans un format de type type). En ce moment, l'analyseur de contenu ITEXT n'a pas de rappel pour ces opérations, mais il serait possible de les ajouter sans difficulté majeure.


3 commentaires

Merci@kevin Comment Les lecteurs PDF font-le si bien?


@ David004 Je doute beaucoup que les lecteurs PDF font un travail incroyable sur tous les fichiers PDF. Il [I> serait possible d'être plus intelligent avec le caractère de séparateur que nous insérons entre les mots (ce que je soupçonne que les applications de lecteur PDF font). Fondamentalement, si la distance entre un caractère et la suivante est supérieure à un seuil (peut-être deux fois la largeur d'un caractère d'espace?) Utilisez un caractère à tabulation au lieu de l'espace. Cela peut être suffisant pour beaucoup de scénarios - mais certainement pas assez bon pour une analyse générale. Si cela vous aiderait, je pouvais envisager d'ajouter un comportement d'insertion de tabulation ...


Existe-t-il des algorithmes avec un exemple C pour compter et restreindre les mots (extrayez sur dB) de la ligne spécifique de la table en .pdf?



1
votes

Les tables n'existent pas comme des structures en PDF à moins que le fichier utilise du contenu structuré. Comprenez-vous ce qu'est un fichier PDF? J'ai écrit un article de blog expliquant les problèmes d'extraction de texte à http://www.jpeal.org/ Pdfblog /? P = 228


0 commentaires

1
votes

Vous pouvez également essayer PDFBox, mais tout retourne au manque de structure dans le PDF - c'est principalement un format de sortie de fichier d'extrémité pour l'affichage.


0 commentaires

0
votes

Je sais que ma réponse est un peu en retard. Mais j'utilise le code suivant pour lire certaines pages de fichiers PDF. Je n'ai pas eu de problème de lecture de colonnes, aucun texte fusionné, chaque colonne est imprimée de l'autre. XXX

Si vous cherchez à extraire une partie d'une page, disons 1 colonne Seulement, alors vous devez obtenir les dimensions de la colonne. Il est toujours un peu délicat, mais vous pourrez peut-être comprendre cela si vous connaissiez déjà le texte de départ de la colonne (d'une manière d'estimer la largeur et la hauteur). Cela peut être fait en utilisant une zone rectangulaire. Voir le code ci-dessous et désolé si j'ai eu la mauvaise mesure du point. Dans le code ci-dessous, j'essaie d'obtenir la dimension de la page entière. xxx

}


0 commentaires

1
votes

pdftextstream est celui! Au moins, je suis capable d'identifier les valeurs de colonne. Plus tôt, j'utilisais ITEXT et je suis resté coincé dans la définition de la stratégie. C'est dur.

Cette API sépare les cellules de colonne en mettant plus d'espaces. C'est réparé. Vous pouvez mettre la logique. (Cela manquait dans ITEXT). xxx

question a été posée liée à cela sur Stackoverflow!


2 commentaires

L'OP a écrit "J'ai besoin d'extraire du texte des fichiers PDF en utilisant ITEXT." Alors, comment votre réponse l'aide-t-elle à faire cela? (Dire pdftextstream est construit sur IText ne compte pas.)


C'est une promotion d'un produit payant