בעידן העסקים המקוונים, השימוש בחשבוניות וקבלות דיגיטליות גדל במידה רבה. באופן דומה, חילוץ הנתונים היעיל מחשבוניות דיגיטליות אלה הוא גם תובעני. במאמר זה, תדע כיצד לחלץ נתונים מחשבוניות 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, בקר במדריך למפתחים בתיעוד. בכל מקרה של קושי נוסף, פנה לצוות התמיכה בחינם, בכל עת בפורום.

ראה גם