Trong thời đại kinh doanh trực tuyến, việc sử dụng hóa đơn và biên lai kỹ thuật số đã tăng lên phần lớn. Tương tự, việc trích xuất dữ liệu hiệu quả từ các hóa đơn kỹ thuật số này cũng đòi hỏi khắt khe. Trong bài viết này, bạn sẽ biết cách trích xuất dữ liệu từ hóa đơn PDF hoặc biên lai bằng lập trình trong Java. Trước đây chúng ta đã thấy trích xuất dữ liệu hóa đơn bằng C# trong một trong các bài đăng trước đó.

Trích xuất dữ liệu từ hóa đơn hoặc biên lai PDF

Phân tích tài liệu và trích xuất dữ liệu Java API

Tôi sẽ sử dụng GroupDocs.Parser for Java để phân tích cú pháp hóa đơn PDF và trích xuất các giá trị dữ liệu trong ứng dụng Java. API này cũng cho phép trích xuất văn bản, hình ảnh và siêu dữ liệu từ tài liệu, hình ảnh, bản trình bày, lưu trữ, email và nhiều định dạng tài liệu được hỗ trợ khác.

Tải xuống hoặc định cấu hình

Từ phần tải xuống, bạn có thể tải xuống tệp JAR hoặc chỉ lấy cấu hình kho lưu trữ và phần phụ thuộc cho tệp pom.xml của các ứng dụng Java dựa trên maven của bạn.

Cách trích xuất dữ liệu hóa đơn PDF trong Java

Các bước sau đây sẽ cho phép bạn dễ dàng trích xuất dữ liệu từ hóa đơn PDF bằng Java.

  • Tạo một mẫu.
  • Phân tích hóa đơn PDF theo mẫu đã tạo.
  • Trích xuất thông tin từ tệp PDF được phân tích cú pháp.

Tạo mẫu cho hóa đơn

Dưới đây là mẫu được tạo theo hóa đơn. Bạn cũng có thể tải xuống hóa đơn đã sử dụng từ tệp mẫu có sẵn tại kho lưu trữ GitHub.

// Tạo mẫu để phân tích dữ liệu từ hóa đơn bằng Java
// Đầu tiên tạo Mục mẫu
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")
};
// Chuyển đổi thành mẫu
Template template = new Template(Arrays.asList(templateItems));

Phân tích hóa đơn / biên lai PDF để trích xuất dữ liệu

Các dòng sau sẽ phân tích hóa đơn PDF theo mẫu đã tạo và trích xuất dữ liệu hóa đơn bằng mã Java đơn giản.

// Phân tích Hóa đơn PDF bằng Mẫu được xác định trong Java
Parser parser = new Parser("filePath/invoice.pdf");
DocumentData data = parser.parseByTemplate(template);
// In dữ liệu được trích xuất
for (int i = 0; i < data.getCount(); i++) {
    // Tên trường in
    System.out.print(data.get(i).getName() + ": ");
    // Truyền giá trị thuộc tính PageArea cho PageTextArea
    // vì chúng tôi đã xác định chỉ các trường văn bản trong mẫu
    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());
}

Đầu ra

Sau đây là đầu ra của đoạn mã trên sau khi trích xuất dữ liệu từ hóa đơn.

**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

Có nhiều ví dụ mã nguồn mở khác có sẵn tại Kho lưu trữ GitHub. Bạn có thể tải xuống mã và nhanh chóng chạy các ví dụ. Để biết thêm hướng dẫn và một số cách khác để sử dụng các mẫu để phân tích cú pháp và trích xuất dữ liệu trong Java, hãy truy cập hướng dẫn dành cho nhà phát triển trong tài liệu. Trong trường hợp gặp thêm bất kỳ khó khăn nào, hãy liên hệ với nhóm hỗ trợ miễn phí, bất kỳ lúc nào trên diễn đàn.

Xem thêm