发票收据是在涉及购买或出售服务或商品时用于以特定格式记录交易的文件。事情已经数字化,随着网上购物的普及,数字发票被广泛使用。处理大量数字发票并手动提取信息是一个复杂且耗时的过程。因此,对于这种情况,您需要一种更快但更有效的方法。因此,在本文中,我将向您展示如何在 C# 中使用 GroupDocs. .NET 解析器 API

从 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 的更多信息,请访问 文档。如有任何问题或疑问,请通过我们的 论坛 联系我们。

也可以看看