發票和收據是在涉及買賣服務或商品時以特定格式記錄交易的文件。事物已經數字化,隨著在線購物的普及,數字發票被廣泛使用。處理大量數字發票並手動提取信息是一個複雜且耗時的過程。因此,對於這種情況,您需要一種更快而有效的方法。因此,在本文中,我將向您展示如何使用 GroupDocs.Parser for .NET API 在 C# 中以編程方式從 PDF 發票或收據中提取數據。

從 PDF 發票中提取數據的工作流程

以下是如何使用 GroupDocs.Parser for .NET 從 PDF 發票中提取數據的工作流程。

  • 創建用於從表中提取數據的表參數。
  • 創建用於從字段中提取數據的模板項。
  • 根據給定的模板解析發票。
  • 提取數據。

發票

以下是我將用於提取數據的示例 PDF 發票的屏幕截圖。您可以從我們的 GitHub 存儲庫 下載此發票。

編碼

  • 為給定的發票創建模板(閱讀更多 關於模板)。
// 為“詳細信息”表創建檢測器參數
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();
			}
		}
	}
}

輸出

要探索有關 GroupDocs.Parser for .NET API 的更多信息,請訪問 文檔。如有任何問題或疑問,請通過我們的 論壇 聯繫我們。

也可以看看