인보이스 및 영수증은 서비스 또는 상품의 구매 또는 판매가 관련될 때 특정 형식으로 거래를 기록하는 데 사용되는 문서입니다. 모든 것이 디지털화되고 온라인 쇼핑의 인기로 인해 디지털 인보이스가 널리 사용됩니다. 많은 디지털 송장을 처리하고 수동으로 정보를 추출하는 것은 복잡하고 시간이 걸리는 과정입니다. 따라서 이러한 경우에는 더 빠르고 효율적인 방법이 필요합니다. 그래서 이 기사에서는 PDF 인보이스 또는 영수증에서 데이터를 추출하는 방법을 보여 드리겠습니다. .NET용 파서**](https://products.groupdocs.com/parser/net) API.
PDF 송장에서 데이터 추출 워크플로
다음은 GroupDocs.Parser for .NET를 사용하여 PDF 송장에서 데이터를 추출하는 방법의 워크플로입니다.
- 테이블에서 데이터를 추출하기 위한 테이블 매개변수를 만듭니다.
- 필드에서 데이터를 추출하기 위한 템플릿 항목을 만듭니다.
- 주어진 템플릿에 따라 송장을 구문 분석합니다.
- 데이터를 추출합니다.
송장
다음은 데이터 추출에 사용할 샘플 PDF 송장의 스크린샷입니다. 이 청구서는 GitHub 저장소에서 다운로드할 수 있습니다.
![](images/invoice.jpg#center)
코드
- 주어진 인보이스에 대한 템플릿을 생성합니다(템플릿에 대한 더 읽기).
// '세부정보' 테이블에 대한 감지기 매개변수 생성
TemplateTableParameters detailsTableParameters = new TemplateTableParameters(new Rectangle(new Point(35, 320), new Size(530, 55)), null);
// "요약" 테이블에 대한 감지기 매개변수 생성
TemplateTableParameters summaryTableParameters = new TemplateTableParameters(new Rectangle(new Point(330, 385), new Size(220, 65)), null);
// 템플릿 항목 모음 만들기
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"),
new TemplateTable(detailsTableParameters, "details", null),
new TemplateTable(summaryTableParameters, "summary", null)
};
// 문서 템플릿 만들기
Template template = new Template(templateItems);
- 송장을 구문 분석하고 데이터를 추출합니다.
// Parser 클래스의 인스턴스 생성
using (Parser parser = new Parser("invoice.pdf"))
{
// 템플릿으로 문서 구문 분석
DocumentData data = parser.ParseByTemplate(template);
// 추출된 모든 데이터 인쇄
for (int i = 0; i < data.Count; i++)
{
Console.Write(data[i].Name + ": ");
// 필드가 테이블인지 확인
PageTableArea area = data[i].PageArea as PageTableArea;
if (area == null)
{
PageArea pageArea = data[i].PageArea;
Console.WriteLine(pageArea.ToString());
}
else
{
// 테이블 행을 통해 반복
for (int row = 0; row < area.RowCount; row++)
{
// 테이블 열을 통해 반복
for (int column = 0; column < area.ColumnCount; column++)
{
// 셀 값 가져오기
PageTextArea cellValue = area[row, column].PageArea as PageTextArea;
// 열 사이의 공백 인쇄
if (column > 0)
{
Console.Write("\t");
}
// 셀 값 인쇄
Console.Write(cellValue == null ? "" : cellValue.Text);
}
// 새 줄 인쇄
Console.WriteLine();
}
}
}
}
출력
![](images/Output-1.png#center)
GroupDocs.Parser for .NET API에 대해 자세히 알아보려면 문서를 방문하세요. 질문이나 질문이 있는 경우 포럼에 문의하세요.