簡體   English   中英

適用於Java的高級PDF解析器

[英]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

我找到了一個如何提取圖像的例子,但我仍然沒有得到如何提取的答案:

  • 鏈接
  • 文檔元標記,如標題,描述或作者
  • 只是頭條新聞
  • 如果文檔包含表單,則輸入元素

iText是我最近選擇的PDF工具。

  • 完整的可見文字

“可見”是一個艱難的。 您可以使用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 }
    }
  }
}

您可以在此處找到PDF規范

  • 輸入元素

當然。 對於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM