Je souhaite extraire un contenu différent d'un fichier PDF en Java:
Est-il également possible d'obtenir les éléments suivants?
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:
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.
Vous pouvez également utiliser JPedal pour toutes ces tâches d'extraction.
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.
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.