Les factures et les reçus sont les documents utilisés pour enregistrer les transactions dans un format particulier lors de l’achat ou de la vente de services ou de biens. Les choses sont devenues numériques et avec la popularité des achats en ligne, les factures numériques sont largement utilisées. Le traitement d’un certain nombre de factures numériques et l’extraction manuelle des informations est un processus complexe et qui prend du temps. Ainsi, vous avez besoin d’un moyen plus rapide mais efficace pour un tel cas. Dans cet article, je vais donc vous montrer comment extraire des données d’une facture PDF ou d’un reçu programmatiquement en C# à l’aide de GroupDocs. Analyseur pour .NET API.

Flux de travail pour extraire des données d’une facture PDF

Voici le flux de travail expliquant comment extraire les données d’une facture PDF à l’aide de GroupDocs.Parser pour .NET.

  • Créer des paramètres de table pour extraire les données des tables.
  • Créez des éléments de modèle pour extraire les données des champs.
  • Analysez la facture selon le modèle donné.
  • Extraire les données.

La facture

Voici la capture d’écran d’un exemple de facture PDF que j’utiliserai pour extraire les données. Vous pouvez télécharger cette facture depuis notre référentiel GitHub.

Le code

  • Créez le modèle pour la facture donnée (en savoir plus à propos des modèles).
// Créer des paramètres de détecteur pour le tableau "Détails"
TemplateTableParameters detailsTableParameters = new TemplateTableParameters(new Rectangle(new Point(35, 320), new Size(530, 55)), null);

// Créer des paramètres de détecteur pour le tableau "Résumé"
TemplateTableParameters summaryTableParameters = new TemplateTableParameters(new Rectangle(new Point(330, 385), new Size(220, 65)), null);

// Créer une collection d'éléments de modèle
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)
};

// Créer un modèle de document
Template template = new Template(templateItems);
  • Analyser la facture et extraire les données.
// Créer une instance de la classe Parser
using (Parser parser = new Parser("invoice.pdf"))
{
	// Analyser le document par le modèle
	DocumentData data = parser.ParseByTemplate(template);

	// Imprimer toutes les données extraites
	for (int i = 0; i < data.Count; i++)
	{
		Console.Write(data[i].Name + ": ");
		// Vérifier si le champ est une table
		PageTableArea area = data[i].PageArea as PageTableArea;
		if (area == null)
		{
			PageArea pageArea = data[i].PageArea;
			Console.WriteLine(pageArea.ToString());
		}
		else
		{
			// Itérer via les lignes du tableau
			for (int row = 0; row < area.RowCount; row++)
			{
				// Itérer via les colonnes du tableau
				for (int column = 0; column < area.ColumnCount; column++)
				{
					// Obtenir la valeur de la cellule
					PageTextArea cellValue = area[row, column].PageArea as PageTextArea;

					// Imprimer l'espace entre les colonnes
					if (column > 0)
					{
						Console.Write("\t");
					}

					// Imprimer la valeur de la cellule
					Console.Write(cellValue == null ? "" : cellValue.Text);
				}

				// Imprimer nouvelle ligne
				Console.WriteLine();
			}
		}
	}
}

Le résultat

Pour en savoir plus sur l’API GroupDocs.Parser pour .NET, consultez la documentation. Contactez-nous sur notre forum en cas de questions ou de requêtes.

Voir également