ใบแจ้งหนี้และใบเสร็จรับเงินเป็นเอกสารที่ใช้ในการบันทึกธุรกรรมในรูปแบบเฉพาะเมื่อมีการซื้อหรือขายบริการหรือสินค้าที่เกี่ยวข้อง สิ่งต่าง ๆ เปลี่ยนไปเป็นดิจิทัลและด้วยความนิยมในการซื้อของออนไลน์ ใบแจ้งหนี้ดิจิทัลจึงถูกนำมาใช้อย่างแพร่หลาย การประมวลผลใบแจ้งหนี้ดิจิทัลจำนวนหนึ่งและการดึงข้อมูลด้วยตนเองนั้นเป็นกระบวนการที่ซับซ้อนและใช้เวลานาน ดังนั้น คุณต้องการวิธีที่เร็วกว่าและมีประสิทธิภาพสำหรับกรณีดังกล่าว ดังนั้นในบทความนี้ ฉันจะแสดงวิธีดึงข้อมูลจากใบแจ้งหนี้หรือใบเสร็จในรูปแบบ PDF โดยใช้โปรแกรมในภาษา C# โดยใช้ GroupDocs.Parser for .NET API

เวิร์กโฟลว์สำหรับการดึงข้อมูลจากใบแจ้งหนี้ PDF

ต่อไปนี้เป็นเวิร์กโฟลว์ของวิธีการแยกข้อมูลจากใบแจ้งหนี้ PDF โดยใช้ GroupDocs.Parser for .NET

  • สร้างพารามิเตอร์ของตารางเพื่อแยกข้อมูลจากตาราง
  • สร้างรายการเทมเพลตสำหรับการดึงข้อมูลจากฟิลด์
  • แยกวิเคราะห์ใบแจ้งหนี้ตามเทมเพลตที่กำหนด
  • แยกข้อมูล

ใบแจ้งหนี้

ต่อไปนี้คือภาพหน้าจอของตัวอย่างใบแจ้งหนี้ 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 โปรดไปที่ เอกสาร ติดต่อเราได้ที่ฟอรัม หากมีคำถามหรือข้อสงสัยใดๆ

ดูสิ่งนี้ด้วย