Hóa đơn và biên lai là những tài liệu được sử dụng để ghi lại các giao dịch ở một định dạng cụ thể khi mua hoặc bán dịch vụ hoặc hàng hóa có liên quan. Mọi thứ đã trở thành kỹ thuật số và với sự phổ biến của mua sắm trực tuyến, hóa đơn kỹ thuật số được sử dụng rộng rãi. Xử lý một số hóa đơn kỹ thuật số và trích xuất thông tin theo cách thủ công là một quá trình phức tạp cũng như mất thời gian. Vì vậy, bạn cần một cách nhanh hơn nhưng hiệu quả hơn cho trường hợp như vậy. Vì vậy, trong bài viết này, tôi sẽ chỉ cho bạn cách trích xuất dữ liệu từ hóa đơn PDF hoặc biên nhận theo chương trình trong C# bằng GroupDocs.Parser for .NET API.

Quy trình trích xuất dữ liệu từ hóa đơn PDF

Sau đây là quy trình làm việc về cách trích xuất dữ liệu từ hóa đơn PDF bằng GroupDocs.Parser for .NET.

  • Tạo các tham số bảng để trích xuất dữ liệu từ các bảng.
  • Tạo các mục mẫu để trích xuất dữ liệu từ các trường.
  • Phân tích hóa đơn theo mẫu đã cho.
  • Trích xuất dữ liệu.

Hóa đơn

Sau đây là ảnh chụp màn hình hóa đơn PDF mẫu mà tôi sẽ sử dụng để trích xuất dữ liệu. Bạn có thể tải xuống hóa đơn này từ kho lưu trữ GitHub của chúng tôi.

Mật mã

  • Tạo mẫu cho hóa đơn nhất định (đọc thêm về mẫu).
// Tạo thông số máy dò cho bảng "Chi tiết"
TemplateTableParameters detailsTableParameters = new TemplateTableParameters(new Rectangle(new Point(35, 320), new Size(530, 55)), null);

// Tạo thông số máy dò cho bảng "Tóm tắt"
TemplateTableParameters summaryTableParameters = new TemplateTableParameters(new Rectangle(new Point(330, 385), new Size(220, 65)), null);

// Tạo một bộ sưu tập các mục mẫu
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)
};

// Tạo mẫu tài liệu
Template template = new Template(templateItems);
  • Phân tích hóa đơn và trích xuất dữ liệu.
// Tạo một thể hiện của lớp Parser
using (Parser parser = new Parser("invoice.pdf"))
{
	// Phân tích tài liệu theo mẫu
	DocumentData data = parser.ParseByTemplate(template);

	// In tất cả dữ liệu được trích xuất
	for (int i = 0; i < data.Count; i++)
	{
		Console.Write(data[i].Name + ": ");
		// Kiểm tra xem trường có phải là bảng không
		PageTableArea area = data[i].PageArea as PageTableArea;
		if (area == null)
		{
			PageArea pageArea = data[i].PageArea;
			Console.WriteLine(pageArea.ToString());
		}
		else
		{
			// Lặp lại qua các hàng của bảng
			for (int row = 0; row < area.RowCount; row++)
			{
				// Lặp lại qua các cột trong bảng
				for (int column = 0; column < area.ColumnCount; column++)
				{
					// Lấy giá trị ô
					PageTextArea cellValue = area[row, column].PageArea as PageTextArea;

					// In khoảng cách giữa các cột
					if (column > 0)
					{
						Console.Write("\t");
					}

					// In giá trị ô
					Console.Write(cellValue == null ? "" : cellValue.Text);
				}

				// In dòng mới
				Console.WriteLine();
			}
		}
	}
}

Đầu ra

Để khám phá thêm về API GroupDocs.Parser for .NET, hãy truy cập tài liệu. Liên hệ với chúng tôi tại forum của chúng tôi trong trường hợp có bất kỳ câu hỏi hoặc thắc mắc nào.

Xem thêm