ในยุคของธุรกิจออนไลน์ การใช้ใบแจ้งหนี้และใบเสร็จรับเงินดิจิทัลได้เพิ่มขึ้นอย่างมาก ในทำนองเดียวกัน การสกัดข้อมูลที่มีประสิทธิภาพจากใบแจ้งหนี้ดิจิทัลเหล่านี้ก็ต้องการเช่นกัน ในบทความนี้ คุณจะได้รู้วิธีดึงข้อมูลจากใบแจ้งหนี้หรือใบเสร็จ PDF โดยทางโปรแกรมใน Java ก่อนหน้านี้ เราได้เห็น การแยกข้อมูลใบแจ้งหนี้โดยใช้ C# ในโพสต์ก่อนหน้านี้

แยกข้อมูลจากใบแจ้งหนี้หรือใบเสร็จรับเงิน PDF

การแยกวิเคราะห์เอกสารและการสกัดข้อมูล Java API

ฉันจะใช้ GroupDocs.Parser for Java เพื่อแยกวิเคราะห์ใบแจ้งหนี้ PDF และแยกค่าข้อมูลภายในแอปพลิเคชัน Java API นี้ยังอนุญาตให้แยกข้อความ รูปภาพ และข้อมูลเมตาจากเอกสาร รูปภาพ งานนำเสนอ เอกสารสำคัญ อีเมล และอื่นๆ อีกมากมาย รูปแบบเอกสารที่รองรับ

ดาวน์โหลดหรือกำหนดค่า

จาก ส่วนการดาวน์โหลด คุณสามารถดาวน์โหลดไฟล์ JAR หรือเพียงแค่รับการกำหนดค่าพื้นที่เก็บข้อมูลและการพึ่งพาสำหรับ pom.xml ของแอปพลิเคชัน Java ที่ใช้ maven

วิธีแยกข้อมูลใบแจ้งหนี้ PDF ใน Java

ขั้นตอนต่อไปนี้จะช่วยให้คุณสามารถดึงข้อมูลจากใบแจ้งหนี้ PDF โดยใช้ Java ได้อย่างง่ายดาย

  • สร้างเทมเพลต
  • แยกวิเคราะห์ใบแจ้งหนี้ 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 อย่างง่าย

// แยกวิเคราะห์ใบแจ้งหนี้ PDF โดยใช้เทมเพลตที่กำหนดใน Java
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 Repository คุณสามารถดาวน์โหลดโค้ดและเรียกใช้ตัวอย่างได้อย่างรวดเร็ว สำหรับคำแนะนำเพิ่มเติมและวิธีอื่นๆ ในการ ใช้เทมเพลตสำหรับการแยกวิเคราะห์และการดึงข้อมูลใน Java โปรดไปที่คู่มือสำหรับนักพัฒนาใน เอกสารประกอบ ในกรณีที่มีปัญหาใดๆ เพิ่มเติม คุณสามารถติดต่อทีมสนับสนุนได้ฟรีทุกเมื่อบน ฟอรัม

ดูสิ่งนี้ด้วย