[英]Advanced PDF parser for Java
我想從Java中提取PDF文件中的不同內容:
是否也可以獲得以下內容?
我不需要操縱或渲染PDF文件。 哪個庫最適合這種目的?
UPDATE
好的,我試過PDFBox:
Document luceneDocument = LucenePDFDocument.getDocument(new File(path));
Field contents = luceneDocument.getField("contents");
System.out.println(contents.stringValue());
但輸出為空。 雖然字段“摘要”是可以的。
下一個片段工作正常。
PDDocument doc = PDDocument.load(path);
PDFTextStripper stripper = new PDFTextStripper();
String text = stripper.getText(doc);
System.out.println(text);
doc.close();
但是,我不知道如何提取圖像,鏈接等。
更新2
我找到了一個如何提取圖像的例子,但我仍然沒有得到如何提取的答案:
- 完整的可見文字
“可見”是一個艱難的。 您可以使用com.itextpdf.text.pdf.parse包的類解析所有可解析的文本...但這些類不了解CLIPPING。 您可以輕松地將解析器限制為頁面大小。
// all text on the page, regardless of position
PdfTextExtractor.getTextFromPage(reader, pageNum);
您實際上需要采用TextExtractionStrategy的過濾,即過濾策略。 它很快就會變得有趣,但我認為你可以“開箱即用”獲得你想要的一切。
- 圖片
是的,通過相同的包類。 圖像偵聽器不像文本偵聽器那樣受支持,但確實存在。
- 鏈接
是。 鏈接是各種PDF頁面的“注釋”。 找到它們只需循環遍歷每個頁面的“注釋數組”並選擇鏈接注釋即可。
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 }
}
}
}
- 輸入元素
當然。 對於XFA(LiveCycle Designer)或舊技術“AcroForm”表單,iText可以找到所有字段及其值。
AcroFields fields = myReader.getAcroFields();
Set<String> fieldNames = fields.getFields().keySet();
for (String fldName : fieldNames) {
System.out.println( fldName + ": " + fields.getField( fldName ) );
}
Mutli-select列表不能很好地處理。 對於空文本字段和按鈕,冒號后面會有一個空格。 沒有太多信息......但那會讓你開始。
- 文檔元標記,如標題,描述或作者
非常瑣碎。 是。
Map<String, String> info = myPdfReader.getInfo();
System.out.println( info );
除了基本作者/標題/等之外,您還可以通過reader.getMetadata()
訪問相當復雜的XML模式。
- 只是頭條新聞
TextRenderFilter
可以根據您希望的任何條件忽略文本。 字體大小根據您的評論發出正確的聲音。
您還可以將JPedal用於所有這些提取任務。
是的Alp, iText確實提供了您提到的功能。
閱讀PDF
iText不是PDF查看器,iText無法將PDF轉換為圖像,iText也不能用於打印PDF,但PdfReader類可以讓您訪問構成PDF文檔和內容流的對象每頁。 可以解析此內容流,如果內容未添加為光柵化文本,則可以將頁面轉換為純文本。 請注意,iText不執行OCR。
使用com.itextpdf.text.pdf.PdfReader;
類。
大多數情況下,您也可以使用我們的PDF庫擴展版 。
無論您采用哪種解決方案,請記住,對於某些PDF文檔,由於構建PDF的方式,文本提取是不可能的(頁面上的字形有時不具有與之相關的任何語義含義)。
檢查此問題的快速方法是在Acrobat中打開文檔並嘗試復制/粘貼文本。 如果在那里出現亂碼,那么在任何其他PDF提取器中都可能出現亂碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.