オンラインビジネスの時代では、デジタル請求書と領収書の使用が大幅に増加しています。同様に、これらのデジタル請求書からの効率的なデータ抽出も要求されます。この記事では、JavaでプログラムによってPDFの請求書または領収書からデータを抽出する方法を理解します。以前、以前の投稿の1つでC#を使用した請求書データの抽出を見てきました。

PDFの請求書または領収書からデータを抽出する

ドキュメントの解析とデータ抽出のJavaAPI

GroupDocs.Parser for Javaを使用して、PDFの請求書を解析し、Javaアプリケーション内のデータ値を抽出します。このAPIを使用すると、ドキュメント、画像、プレゼンテーション、アーカイブ、電子メール、およびその他の多くのサポートされているドキュメント形式からテキスト、画像、およびメタデータを抽出することもできます。

###ダウンロードまたは構成

ダウンロードセクションから、** JAR **ファイルをダウンロードするか、mavenベースのJavaアプリケーションのpox.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での解析とデータ抽出にテンプレートを使用するの詳細なガイダンスとその他の方法については、ドキュメントの開発者ガイドにアクセスしてください。さらに問題が発生した場合は、フォーラムでいつでも無料でサポートチームに連絡してください。

関連項目

*テンプレートを使用したJavaでのPDF請求書の解析の詳細