在在線業務時代,數字發票和收據的使用已大大增加。同樣,從這些數字發票中高效提取數據也要求很高。在本文中,您將了解如何使用 Java 以編程方式從 PDF 發票或收據中提取數據。之前我們已經在較早的一篇博文中看到了使用 C# 提取發票數據

從 PDF 發票或收據中提取數據

文檔解析和數據提取 Java API

我將使用 GroupDocs.Parser for Java 來解析 PDF 發票並在 Java 應用程序中提取數據值。此 API 還允許從文檔、圖像、演示文稿、檔案、電子郵件和許多其他支持的文檔格式 中提取文本、圖像和元數據。

下載或配置

下載部分,您可以下載 JAR 文件或只獲取基於 maven 的 Java 應用程序的 pom.xml 的存儲庫和依賴項配置。

如何在 Java 中提取 PDF 發票數據

以下步驟將允許您使用 Java 輕鬆地從 PDF 發票中提取數據。

  • 創建模板。
  • 根據創建的模板解析 PDF 發票。
  • 從已解析的 PDF 中提取信息。

為發票創建模板

下面是根據發票創建的模板。您還可以從 GitHub 存儲庫中提供的 示例文件 下載使用過的發票。

// 創建模板以使用 Java 從發票解析數據
// 首先創建模板項
TemplateItem[] templateItems = new TemplateItem[]
{
    new TemplateField(new TemplateFixedPosition(new Rectangle(new Point(35, 135), new Size(100, 10))), "FromCompany"),
    new TemplateField(new TemplateFixedPosition(new Rectangle(new Point(35, 150), new Size(100, 35))), "FromAddress"),
    new TemplateField(new TemplateFixedPosition(new Rectangle(new Point(35, 190), new Size(150, 2))), "FromEmail"),
    new TemplateField(new TemplateFixedPosition(new Rectangle(new Point(35, 250), new Size(100, 2))), "ToCompany"),
    new TemplateField(new TemplateFixedPosition(new Rectangle(new Point(35, 260), new Size(100, 15))), "ToAddress"),
    new TemplateField(new TemplateFixedPosition(new Rectangle(new Point(35, 290), new Size(150, 2))), "ToEmail"),
    new TemplateField(new TemplateRegexPosition("Invoice Number"), "InvoiceNumber"),
    new TemplateField(new TemplateLinkedPosition(
            "InvoiceNumber",
            new Size(200, 15),
            new TemplateLinkedPositionEdges(false, false, true, false)),
            "InvoiceNumberValue"),
    new TemplateField(new TemplateRegexPosition("Order Number"), "InvoiceOrder"),
    new TemplateField(new TemplateLinkedPosition(
            "InvoiceOrder",
            new Size(200, 15),
            new TemplateLinkedPositionEdges(false, false, true, false)),
            "InvoiceOrderValue"),
    new TemplateField(new TemplateRegexPosition("Invoice Date"), "InvoiceDate"),
    new TemplateField(new TemplateLinkedPosition(
            "InvoiceDate",
            new Size(200, 15),
            new TemplateLinkedPositionEdges(false, false, true, false)),
            "InvoiceDateValue"),
    new TemplateField(new TemplateRegexPosition("Due Date"), "DueDate"),
    new TemplateField(new TemplateLinkedPosition(
            "DueDate",
            new Size(200, 15),
            new TemplateLinkedPositionEdges(false, false, true, false)),
            "DueDateValue"),
    new TemplateField(new TemplateRegexPosition("Total Due"), "TotalDue"),
    new TemplateField(new TemplateLinkedPosition(
            "TotalDue",
            new Size(200, 15),
            new TemplateLinkedPositionEdges(false, false, true, false)),
            "TotalDueValue")
};
// 轉換成模板
Template template = new Template(Arrays.asList(templateItems));

解析 PDF 發票/收據以提取數據

以下行將根據創建的模板解析 PDF 發票,並使用簡單的 Java 代碼提取發票數據。

// 使用 Java 中定義的模板解析 PDF 發票
Parser parser = new Parser("filePath/invoice.pdf");
DocumentData data = parser.parseByTemplate(template);
// 打印提取的數據
for (int i = 0; i < data.getCount(); i++) {
    // 打印字段名稱
    System.out.print(data.get(i).getName() + ": ");
    // 將 PageArea 屬性值轉換為 PageTextArea
    // 因為我們在模板中只定義了文本字段
    PageTextArea area = data.get(i).getPageArea() instanceof PageTextArea
            ? (PageTextArea) data.get(i).getPageArea()
            : null;
    System.out.println(area == null ? "Not a template field" : area.getText());
}

輸出

以下是從發票中提取數據後上述代碼的輸出。

**FROMCOMPANY:**    DEMO - Sliced Invoices
**FROMADDRESS:**    Suite 5A-1204
123 Somewhere Street
Your City AZ 12345
**FROMEMAIL:**     admin@slicedinvoices.com
**TOCOMPANY:**    Test Business
**TOADDRESS:**    123 Somewhere St
Melbourne, VIC 3000
**INVOICENUMBER:**             Invoice Number
**INVOICENUMBERVALUE:** NV-3337
**INVOICEORDER:**                Order Number
**INVOICEORDERVALUE:**    12345
**INVOICEDATE:**                    Invoice Date
**INVOICEDATEVALUE:**        January 25, 2016
**DUEDATE:**                           Due Date
**DUEDATEVALUE:**               January 31, 2016
**TOTALDUE:**                         Total Due
**TOTALDUEVALUE:**             $93.50

GitHub 存儲庫 中還有許多其他開源示例。您可以下載代碼并快速運行示例。有關使用 Java 中的模板進行解析和數據提取 的更多指導和一些其他方法,請訪問 文檔 中的開發人員指南。如果遇到任何進一步的困難,請隨時在 論壇 上免費聯繫支持團隊。

也可以看看