온라인 비즈니스 시대에 디지털 인보이스 및 영수증의 사용이 크게 증가했습니다. 마찬가지로 이러한 디지털 송장에서 효율적인 데이터 추출도 요구됩니다. 이 기사에서는 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 Repository에서 사용할 수 있는 다른 많은 오픈 소스 예제가 있습니다. 코드를 다운로드하고 예제를 빠르게 실행할 수 있습니다. Java에서 구문 분석 및 데이터 추출을 위한 템플릿 사용에 대한 추가 지침 및 기타 방법은 문서의 개발자 가이드를 참조하십시오. 더 어려운 문제가 있는 경우 포럼에서 언제든지 무료로 지원 팀에 문의하세요.

또한보십시오