Parser PDF avanzato per Java

Voglio estrarre contenuti diversi da un file PDF in Java:

  • Il testo visibile completo
  • immagini
  • link

È anche ansible ottenere quanto segue?

  • meta tag del documento come titolo, descrizione o autore
  • solo titoli
  • elementi di input se il documento contiene un modulo

Non ho bisogno di manipolare o eseguire il rendering di file PDF. Quale libreria sarebbe la soluzione migliore per quel tipo di scopo?

AGGIORNARE

OK, ho provato PDFBox:

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

Ma l’output è nullo. Il campo “riassunto” è OK però.

Il prossimo frammento funziona bene.

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

Ma poi, non ho idea di come estrarre le immagini, i collegamenti, ecc.

AGGIORNAMENTO 2

Ho trovato un esempio su come estrarre le immagini, ma non ho ancora ricevuto risposta su come estrarre:

  • link
  • meta tag del documento come titolo, descrizione o autore
  • solo titoli
  • elementi di input se il documento contiene un modulo

iText è il mio strumento PDF preferito in questi giorni.

  • Il testo visibile completo

“Visibile” è difficile. Puoi analizzare tutto il testo analizzabile con le classi del pacchetto com.itextpdf.text.pdf.parse … ma quelle classi non sanno di CLIPPING. È ansible limitare il parser alle dimensioni della pagina abbastanza facilmente.

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

In pratica, avresti bisogno dell’override che utilizza TextExtractionStrategy, la strategia filtrata. Diventa interessante abbastanza velocemente, ma penso che puoi ottenere tutto ciò che desideri qui “out of the box”.

  • immagini

Sì, tramite le stesse classi di pacchetti. Gli ascoltatori di immagini non sono supportati come ascoltatori di testo, ma esistono.

  • link

Sì. I collegamenti sono “annotazioni” a varie pagine PDF. Trovarli è una semplice questione di scorrere l'”array di annotazioni” di ogni pagina e individuare le annotazioni dei collegamenti.

 PdfDictionary pageDict = myReader.getPageN(1); PdfArray annots = pageDict.getAsArray(PdfName.ANNOTS); ArrayList dests = new ArrayList(); 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 } } } } 

Puoi trovare le specifiche PDF qui .

  • elementi di input

Decisamente. Sia per XFA (LiveCycle Designer) che per i vecchi moduli "AcroForm", iText può trovare tutti i campi e i loro valori.

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

Le liste di selezione multipla non sarebbero gestite molto bene. Otterrai uno spazio vuoto dopo i due punti per i campi di testo vuoti e per i pulsanti. Nessuno troppo informativo ... ma questo ti farà iniziare.

  • meta tag del documento come titolo, descrizione o autore

Piuttosto insignificante. Sì.

 Map info = myPdfReader.getInfo(); System.out.println( info ); 

Oltre all'autore / titolo / ecc base, c'è uno schema XML abbastanza coinvolto a cui puoi accedere tramite reader.getMetadata() .

  • solo titoli

Un TextRenderFilter può ignorare il testo in base a qualsiasi criterio tu desideri. Le dimensioni dei caratteri sembrano corrette in base al tuo commento.

Apache viene in soccorso, ancora una volta.

Puoi anche utilizzare JPedal per tutte queste attività di estrazione.

Sì Alp, iText offre le funzionalità che hai citato.

LEGGI I PDF

iText non è un visualizzatore di PDF, iText non può convertire PDF in un’immagine, né iText può essere utilizzato per stampare un PDF, ma la class PdfReader può darti accesso agli oggetti che formano un documento PDF e al stream di contenuti di ogni pagina. Questo stream di contenuti può essere analizzato e se il contenuto non è stato aggiunto come testo rasterizzato, è ansible convertire una pagina in testo normale. Si noti che iText non esegue l’OCR.

Utilizzare com.itextpdf.text.pdf.PdfReader; class.

La maggior parte di questo si può fare anche con la nostra edizione estesa della Libreria PDF .

Qualunque soluzione tu scelga, tieni presente che per alcuni documenti PDF, l’estrazione del testo è imansible a causa del modo in cui il PDF è costruito (i glifi sulla pagina a volte non hanno alcun significato semantico ad essi associato).

Il modo rapido per verificare ciò è aprire il documento in Acrobat e provare a copiare / incollare il testo. Se si presenta in modo incomprensibile, è probabile che si presenterà senza senso in qualsiasi altro estrattore di PDF.