Facturas y recibos son los documentos que se utilizan para registrar las transacciones en un formato particular cuando se trata de compra o venta de servicios o bienes. Las cosas se han vuelto digitales y con la popularidad de las compras en línea, las facturas digitales son ampliamente utilizadas. Procesar una serie de facturas digitales y extraer la información manualmente es un proceso complejo y lento. Por lo tanto, necesita una forma más rápida pero eficiente para tal caso. Entonces, en este artículo, le mostraré cómo extraer datos de una factura en PDF o recibo programadamente en C# usando GroupDocs. Analizador para .NET API.

Flujo de trabajo para extraer datos de una factura en PDF

El siguiente es el flujo de trabajo de cómo extraer los datos de una factura en PDF utilizando GroupDocs.Parser para .NET.

  • Crear parámetros de tabla para extraer datos de las tablas.
  • Crear elementos de plantilla para extraer datos de los campos.
  • Analizar la factura de acuerdo con la plantilla dada.
  • Extraer los datos.

La factura

La siguiente es la captura de pantalla de una factura en PDF de muestra que usaré para extraer los datos. Puede descargar esta factura desde nuestro repositorio de GitHub.

El código

  • Crear la plantilla para la factura dada (leer más sobre plantillas).
// Crear parámetros de detector para la tabla "Detalles"
TemplateTableParameters detailsTableParameters = new TemplateTableParameters(new Rectangle(new Point(35, 320), new Size(530, 55)), null);

// Crear parámetros de detector para la tabla "Resumen"
TemplateTableParameters summaryTableParameters = new TemplateTableParameters(new Rectangle(new Point(330, 385), new Size(220, 65)), null);

// Crear una colección de elementos de plantilla
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)
};

// Crear una plantilla de documento
Template template = new Template(templateItems);
  • Analizar la factura y extraer datos.
// Crear una instancia de la clase Parser
using (Parser parser = new Parser("invoice.pdf"))
{
	// Analizar el documento por la plantilla
	DocumentData data = parser.ParseByTemplate(template);

	// Imprimir todos los datos extraídos
	for (int i = 0; i < data.Count; i++)
	{
		Console.Write(data[i].Name + ": ");
		// Comprobar si el campo es una tabla
		PageTableArea area = data[i].PageArea as PageTableArea;
		if (area == null)
		{
			PageArea pageArea = data[i].PageArea;
			Console.WriteLine(pageArea.ToString());
		}
		else
		{
			// Iterar a través de las filas de la tabla
			for (int row = 0; row < area.RowCount; row++)
			{
				// Iterar a través de las columnas de la tabla
				for (int column = 0; column < area.ColumnCount; column++)
				{
					// Obtener el valor de la celda
					PageTextArea cellValue = area[row, column].PageArea as PageTextArea;

					// Imprimir el espacio entre columnas
					if (column > 0)
					{
						Console.Write("\t");
					}

					// Imprimir el valor de la celda
					Console.Write(cellValue == null ? "" : cellValue.Text);
				}

				// Imprimir nueva línea
				Console.WriteLine();
			}
		}
	}
}

La salida

Para explorar más sobre GroupDocs.Parser para .NET API, visite la documentación. Comuníquese con nosotros en nuestro foro en caso de cualquier pregunta o consulta.

Ver también