Faturas e recibos são os documentos usados para registrar as transações em um formato específico quando se trata de compra ou venda de serviços ou mercadorias. As coisas se tornaram digitais e com a popularidade das compras online, as faturas digitais são amplamente utilizadas. Processar várias faturas digitais e extrair as informações manualmente é um processo complexo e demorado. Assim, você precisa de uma maneira mais rápida e eficiente para esse caso. Portanto, neste artigo, mostrarei como extrair dados de uma fatura em PDF ou recibo programaticamente em C# usando GroupDocs. Analisador para .NET API.

Fluxo de trabalho para extrair dados de uma fatura em PDF

Veja a seguir o fluxo de trabalho de como extrair os dados de uma fatura em PDF usando GroupDocs.Parser para .NET.

  • Crie parâmetros de tabela para extrair dados das tabelas.
  • Crie itens de modelo para extrair dados de campos.
  • Analise a fatura de acordo com o modelo fornecido.
  • Extraia os dados.

A fatura

Veja a seguir a captura de tela de uma amostra de fatura em PDF que usarei para extrair os dados. Você pode baixar esta fatura do nosso repositório do GitHub.

O código

  • Crie o modelo para a fatura fornecida (leia mais sobre modelos).
// Criar parâmetros do detector para a tabela "Detalhes"
TemplateTableParameters detailsTableParameters = new TemplateTableParameters(new Rectangle(new Point(35, 320), new Size(530, 55)), null);

// Criar parâmetros do detector para a tabela "Resumo"
TemplateTableParameters summaryTableParameters = new TemplateTableParameters(new Rectangle(new Point(330, 385), new Size(220, 65)), null);

// Criar uma coleção de itens de modelo
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)
};

// Criar um modelo de documento
Template template = new Template(templateItems);
  • Analisar a fatura e extrair dados.
// Crie uma instância da classe Parser
using (Parser parser = new Parser("invoice.pdf"))
{
	// Analisar o documento pelo modelo
	DocumentData data = parser.ParseByTemplate(template);

	// Imprimir todos os dados extraídos
	for (int i = 0; i < data.Count; i++)
	{
		Console.Write(data[i].Name + ": ");
		// Verifique se o campo é uma tabela
		PageTableArea area = data[i].PageArea as PageTableArea;
		if (area == null)
		{
			PageArea pageArea = data[i].PageArea;
			Console.WriteLine(pageArea.ToString());
		}
		else
		{
			// Iterar por meio de linhas da tabela
			for (int row = 0; row < area.RowCount; row++)
			{
				// Iterar por meio de colunas da tabela
				for (int column = 0; column < area.ColumnCount; column++)
				{
					// Obter o valor da célula
					PageTextArea cellValue = area[row, column].PageArea as PageTextArea;

					// Imprima o espaço entre as colunas
					if (column > 0)
					{
						Console.Write("\t");
					}

					// Imprima o valor da célula
					Console.Write(cellValue == null ? "" : cellValue.Text);
				}

				// Imprimir nova linha
				Console.WriteLine();
			}
		}
	}
}

A saída

Para explorar mais sobre GroupDocs.Parser for .NET API, visite a documentação. Entre em contato conosco em nosso fórum em caso de dúvidas ou perguntas.

Veja também