Voglio estrarre contenuti diversi da un file PDF in Java:
È anche ansible ottenere quanto segue?
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:
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.