web-dev-qa-db-fra.com

Avancé PDF analyseur pour Java

Je souhaite extraire un contenu différent d'un fichier PDF en Java:

  • Le texte visible complet
  • images
  • liens

Est-il également possible d'obtenir les éléments suivants?

  • documenter les balises META comme le titre, la description ou l'auteur
  • seulement les titres
  • éléments d'entrée si le document contient un formulaire

Je n'ai pas besoin de manipuler ou de restituer des fichiers PDF. Quelle bibliothèque serait la mieux adaptée à ce type d’objectif?

MISE À JOUR

OK, j'ai essayé PDFBox:

Document luceneDocument = LucenePDFDocument.getDocument(new File(path));
Field contents = luceneDocument.getField("contents");
System.out.println(contents.stringValue());

Mais la sortie est nulle. Le champ "résumé" est cependant correct.

L'extrait suivant fonctionne correctement.

PDDocument doc = PDDocument.load(path);
PDFTextStripper stripper = new PDFTextStripper();
String text = stripper.getText(doc);
System.out.println(text);
doc.close();

Mais alors, je ne sais pas comment extraire les images, les liens, etc.

MISE À JOUR 2

J'ai trouvé un exemple comment extraire les images, mais je n'ai toujours pas eu de réponse sur la façon d'extraire:

  • liens
  • documenter les balises META comme le titre, la description ou l'auteur
  • seulement les titres
  • éléments d'entrée si le document contient un formulaire
17
Alp

iText est mon PDF outil de choix de nos jours.

  • Le texte visible complet

"Visible" est difficile. Vous pouvez analyser tout le texte analysable avec les classes du package com.itextpdf.text.pdf.parse ... mais ces classes ne connaissent pas CLIPPING. Vous pouvez contraindre l'analyseur à la taille de la page assez facilement.

// all text on the page, regardless of position
PdfTextExtractor.getTextFromPage(reader, pageNum);

Vous auriez en fait besoin du remplacement qui prend une TextExtractionStrategy, la stratégie filtrée. Cela devient intéressant assez rapidement, mais je pense que vous pouvez obtenir tout ce que vous voulez ici "hors de la boîte".

  • images

Oui, via les mêmes classes de packages. Les écouteurs d'images ne sont pas aussi bien pris en charge que les écouteurs de texte, mais existent.

  • liens

Oui. Les liens sont des "annotations" vers diverses pages PDF. Pour les trouver, il suffit de parcourir le "tableau d'annotations" de chaque page et de sélectionner les annotations des liens.

PdfDictionary pageDict = myReader.getPageN(1);
PdfArray annots = pageDict.getAsArray(PdfName.ANNOTS);
ArrayList<String> dests = new ArrayList<String>();
if (annots != null) {
  for (int i = 0; i < annots.size(); ++i) {
    PdfDictionary annotDict = annots.getAsDict(i);
    PdfName subType = annotDict.getAsName(PdfName.SUBTYPE);
    if (subType != null && PdfName.LINK.equals(subType)) {
      PdfDictionary action = annotDict.getAsDict(PdfName.A);
      if (action != null && PdfName.URI.equals(action.getAsName(PdfName.S)) {
        dests.add(action.getAsString(PdfName.URI).toString());
      } // else { its an internal link, meh }
    }
  }
}

Vous pouvez trouver le PDF Spec ici .

  • éléments d'entrée

Absolument. Pour XFA (LiveCycle Designer) ou les formulaires "AcroForm" de technologie plus ancienne, iText peut trouver tous les champs et leurs valeurs.

AcroFields fields = myReader.getAcroFields();

Set<String> fieldNames = fields.getFields().keySet();
for (String fldName : fieldNames) {
  System.out.println( fldName + ": " + fields.getField( fldName ) );
}

Les listes de sélection multiple ne seraient pas si bien gérées. Vous obtiendrez un espace vide après les deux points pour les champs de texte vides et pour les boutons. Pas trop informatif ... mais cela vous aidera à démarrer.

  • documenter les balises META comme le titre, la description ou l'auteur

Assez trivial. Oui.

Map<String, String> info = myPdfReader.getInfo();
System.out.println( info );

En plus de l'auteur/titre de base/etc, il existe un schéma XML assez complexe auquel vous pouvez accéder via reader.getMetadata().

  • seulement les titres

Un TextRenderFilter peut ignorer le texte en fonction des critères que vous souhaitez. La taille de la police semble à peu près correcte en fonction de votre commentaire.

19
Mark Storer
6
Dhaivat Pandya

Vous pouvez également utiliser JPedal pour toutes ces tâches d'extraction.

1
mark stephens

Oui Alp, iText offre la fonctionnalité que vous avez mentionnée.

LECTURE DE PDF

iText n'est pas une visionneuse PDF, iText ne peut pas convertir PDF en image, ni iText ne peut être utilisé pour imprimer un PDF, mais la classe PdfReader peut vous donner accès aux objets qui forment un document PDF et au flux de contenu de chaque page. Ce flux de contenu peut être analysé et si le contenu n'a pas été ajouté en tant que texte tramé, vous peut convertir une page en texte brut. Notez que iText ne fait pas d'OCR.

Utilisation com.itextpdf.text.pdf.PdfReader; classe.

0
Suresh

La plupart de cela, vous pouvez le faire avec notre PDF Library Extended Edition également).

Quelle que soit la solution choisie, gardez à l'esprit que pour certains PDF documents, l'extraction de texte est impossible en raison de la façon dont le PDF est construit (les glyphes sur le page n'ont parfois aucune signification sémantique qui leur est associée).

Le moyen rapide de vérifier cela est d'ouvrir le document dans Acrobat et d'essayer de copier/coller le texte. S'il apparaît comme du charabia, il y a de fortes chances qu'il apparaisse comme du charabia dans tout autre extracteur PDF.

0
Mike B