Analyseur PDF avancé pour Java


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

  • Le texte visible complet
  • images
  • liens

Est-il également possible d'obtenir ce qui suit?

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

Je n'ai pas besoin de manipuler ou de rendre des fichiers PDF. Quelle bibliothèque serait la meilleure solution pour ce genre de le but?

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 OK cependant.

Le prochain extrait fonctionne bien.

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

Mais alors, je n'ai aucune idée 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
  • balises meta de document comme le titre, la description ou auteur
  • seuls les titres
  • éléments d'entrée si le document contient un formulaire
Author: Peter Mortensen, 2011-03-27

5 answers

IText est mon outil PDF de choix ces jours-ci.

  • Le texte visible complet

"Visible" est difficile. Vous pouvez analyser tout le texte parsable avec le com.itextpdf.texte.PDF.analyser les classes du paquet... mais ces classes ne connaissent pas l'ÉCRÊTAGE. 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 réellement besoin du remplacement qui prend une TextExtractionStrategy, la stratégie filtrée. Il obtient 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 package. Les écouteurs d'image 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 choisir le lien annotation.

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 la spécification PDF ici.

  • éléments d'entrée

Définitivement. Pour XFA (LiveCycle Designer) ou les formulaires "AcroForm" plus anciens, 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 Mutli-select ne seraient pas très bien gérées. Vous obtiendrez un espace vide après les deux-points pour les champs de texte vides et pour les boutons. Ce n'est pas trop instructif... mais vous aurez de commencer.

  • balises meta de document 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/etc de base, il existe un schéma XML assez impliqué auquel vous pouvez accéder via reader.getMetadata().

  • seuls les titres

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

 16
Author: Mark Storer, 2014-11-27 09:54:53

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

 1
Author: mark stephens, 2011-03-27 16:22:38

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

LECTURE DE PDF

IText n'est pas un visualiseur PDF, iText ne peut pas convertir PDF en image, ni iText être utilisé pour imprimer un PDF, mais le La classe PdfReader peut vous donner accès à les 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 rastérisé, vous pouvez convertir un page à plaine texte. Notez que iText ne fait pas d'OCR.

Utilisez la classe com.itextpdf.text.pdf.PdfReader;.

 0
Author: Suresh G, 2011-03-27 14:59:54

La plupart de cela, vous pouvez le faire avec notre bibliothèque PDF extended edition ainsi.

Quelle que soit la solution choisie, gardez à l'esprit que pour certains documents PDF, l'extraction de texte est impossible en raison de la façon dont le PDF est construit (les glyphes sur la 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 s'agit de charabia là-bas, il y a de fortes chances que ce soit le cas venez comme charabia dans tout autre extracteur PDF.

 0
Author: Mike B, 2011-12-26 12:55:43