Azure.AI.DocumentIntelligence (.NET)
Extrayez du texte, des tableaux et des données structurées de documents à l'aide de modèles prédéfinis et personnalisés.
Installation
dotnet add package Azure.AI.DocumentIntelligence
dotnet add package Azure.Identity
Version actuelle : v1.0.0 (GA)
Variables d'environnement
DOCUMENT_INTELLIGENCE_ENDPOINT=https://<nom-ressource>.cognitiveservices.azure.com/
DOCUMENT_INTELLIGENCE_API_KEY=<votre-clé-api>
BLOB_CONTAINER_SAS_URL=https://<stockage>.blob.core.windows.net/<conteneur>?<jeton-sas>
AZURE_TOKEN_CREDENTIALS=prod
Authentification
Jeton d'identité Microsoft Entra
using Azure.Identity;
using Azure.AI.DocumentIntelligence;
string endpoint = Environment.GetEnvironmentVariable("DOCUMENT_INTELLIGENCE_ENDPOINT");
var credential = new DefaultAzureCredential(
DefaultAzureCredential.DefaultEnvironmentVariableName
);
var client = new DocumentIntelligenceClient(new Uri(endpoint), credential);
Remarque : Entra ID nécessite un sous-domaine personnalisé (par exemple, https://<nom-ressource>.cognitiveservices.azure.com/), et non un point de terminaison régional.
Clé API
string endpoint = Environment.GetEnvironmentVariable("DOCUMENT_INTELLIGENCE_ENDPOINT");
string apiKey = Environment.GetEnvironmentVariable("DOCUMENT_INTELLIGENCE_API_KEY");
var client = new DocumentIntelligenceClient(new Uri(endpoint), new AzureKeyCredential(apiKey));
Types de clients
| Client | Objectif |
|---|
DocumentIntelligenceClient | Analyser des documents, classer des documents |
DocumentIntelligenceAdministrationClient | Créer/gérer des modèles et classifieurs personnalisés |
Modèles prédéfinis
| ID du modèle | Description |
|---|
prebuilt-read | Extraire du texte, des langues, de l'écriture manuscrite |
prebuilt-layout | Extraire du texte, des tableaux, des marques de sélection, la structure |
prebuilt-invoice | Extraire les champs de facture (fournisseur, articles, totaux) |
prebuilt-receipt | Extraire les champs de reçu (commerçant, articles, total) |
prebuilt-idDocument | Extraire les champs de document d'identité (nom, date de naissance, adresse) |
prebuilt-businessCard | Extraire les champs de carte de visite |
prebuilt-tax.us.w2 | Extraire les champs du formulaire fiscal W-2 |
prebuilt-healthInsuranceCard.us | Extraire les champs de carte d'assurance maladie |
Workflows principaux
1. Analyser une facture
using Azure.AI.DocumentIntelligence;
Uri invoiceUri = new Uri("https://exemple.com/facture.pdf");
Operation<AnalyzeResult> operation = await client.AnalyzeDocumentAsync(
WaitUntil.Completed,
"prebuilt-invoice",
invoiceUri);
AnalyzeResult result = operation.Value;
foreach (AnalyzedDocument document in result.Documents)
{
if (document.Fields.TryGetValue("VendorName", out DocumentField vendorNameField)
&& vendorNameField.FieldType == DocumentFieldType.String)
{
string vendorName = vendorNameField.ValueString;
Console.WriteLine($"Nom du fournisseur : '{vendorName}', confiance : {vendorNameField.Confidence}");
}
if (document.Fields.TryGetValue("InvoiceTotal", out DocumentField invoiceTotalField)
&& invoiceTotalField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue invoiceTotal = invoiceTotalField.ValueCurrency;
Console.WriteLine($"Total de la facture : '{invoiceTotal.CurrencySymbol}{invoiceTotal.Amount}'");
}
if (document.Fields.TryGetValue("Items", out DocumentField itemsField)
&& itemsField.FieldType == DocumentFieldType.List)
{
foreach (DocumentField item in itemsField.ValueList)
{
var itemFields = item.ValueDictionary;
if (itemFields.TryGetValue("Description", out DocumentField descField))
Console.WriteLine($" Article : {descField.ValueString}");
}
}
}
2. Extraire la mise en page (texte, tableaux, structure)
Uri fileUri = new Uri("https://exemple.com/document.pdf");
Operation<AnalyzeResult> operation = await client.AnalyzeDocumentAsync(
WaitUntil.Completed,
"prebuilt-layout",
fileUri);
AnalyzeResult result = operation.Value;
foreach (DocumentPage page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber} : {page.Lines.Count} lignes, {page.Words.Count} mots");
foreach (DocumentLine line in page.Lines)
{
Console.WriteLine($" Ligne : '{line.Content}'");
}
}
foreach (DocumentTable table in result.Tables)
{
Console.WriteLine($"Tableau : {table.RowCount} lignes x {table.ColumnCount} colonnes");
foreach (DocumentTableCell cell in table.Cells)
{
Console.WriteLine($" Cellule ({cell.RowIndex}, {cell.ColumnIndex}) : {cell.Content}");
}
}
3. Analyser un reçu
Operation<AnalyzeResult> operation = await client.AnalyzeDocumentAsync(
WaitUntil.Completed,
"prebuilt-receipt",
receiptUri);
AnalyzeResult result = operation.Value;
foreach (AnalyzedDocument document in result.Documents)
{
if (document.Fields.TryGetValue("MerchantName", out DocumentField merchantField))
Console.WriteLine($"Commerçant : {merchantField.ValueString}");
if (document.Fields.TryGetValue("Total", out DocumentField totalField))
Console.WriteLine($"Total : {totalField.ValueCurrency.Amount}");
if (document.Fields.TryGetValue("TransactionDate", out DocumentField dateField))
Console.WriteLine($"Date : {dateField.ValueDate}");
}
4. Créer un modèle personnalisé
var adminClient = new DocumentIntelligenceAdministrationClient(
new Uri(endpoint),
new AzureKeyCredential(apiKey));
string modelId = "mon-modele-personnalise";
Uri blobContainerUri = new Uri("<url-sas-conteneur-blob>");
var blobSource = new BlobContentSource(blobContainerUri);
var options = new BuildDocumentModelOptions(modelId, DocumentBuildMode.Template, blobSource);
Operation<DocumentModelDetails> operation = await adminClient.BuildDocumentModelAsync(
WaitUntil.Completed,
options);
DocumentModelDetails model = operation.Value;
Console.WriteLine($"ID du modèle : {model.ModelId}");
Console.WriteLine($"Créé le : {model.CreatedOn}");
foreach (var docType in model.DocumentTypes)
{
Console.WriteLine($"Type de document : {docType.Key}");
foreach (var field in docType.Value.FieldSchema)
{
Console.WriteLine($" Champ : {field.Key}, Confiance : {docType.Value.FieldConfidence[field.Key]}");
}
}
5. Créer un classifieur de documents
string classifierId = "mon-classifieur";
Uri blobContainerUri = new Uri("<url-sas-conteneur-blob>");
var sourceA = new BlobContentSource(blobContainerUri) { Prefix = "TypeA/train" };
var sourceB = new BlobContentSource(blobContainerUri) { Prefix = "TypeB/train" };
var docTypes = new Dictionary<string, ClassifierDocumentTypeDetails>()
{
{ "TypeA", new ClassifierDocumentTypeDetails(sourceA) },
{ "TypeB", new ClassifierDocumentTypeDetails(sourceB) }
};
var options = new BuildClassifierOptions(classifierId, docTypes);
Operation<DocumentClassifierDetails> operation = await adminClient.BuildClassifierAsync(
WaitUntil.Completed,
options);
DocumentClassifierDetails classifier = operation.Value;
Console.WriteLine($"ID du classifieur : {classifier.ClassifierId}");
6. Classifier un document
string classifierId = "mon-classifieur";
Uri documentUri = new Uri("https://exemple.com/document.pdf");
var options = new ClassifyDocumentOptions(classifierId, documentUri);
Operation<AnalyzeResult> operation = await client.ClassifyDocumentAsync(
WaitUntil.Completed,
options);
AnalyzeResult result = operation.Value;
foreach (AnalyzedDocument document in result.Documents)
{
Console.WriteLine($"Type de document : {document.DocumentType}, confiance : {document.Confidence}");
}
7. Gérer les modèles
DocumentIntelligenceResourceDetails resourceDetails = await adminClient.GetResourceDetailsAsync();
Console.WriteLine($"Modèles personnalisés : {resourceDetails.CustomDocumentModels.Count}/{resourceDetails.CustomDocumentModels.Limit}");
DocumentModelDetails model = await adminClient.GetModelAsync("mon-id-modele");
Console.WriteLine($"Modèle : {model.ModelId}, Créé le : {model.CreatedOn}");
await foreach (DocumentModelDetails modelItem in adminClient.GetModelsAsync())
{
Console.WriteLine($"Modèle : {modelItem.ModelId}");
}
await adminClient.DeleteModelAsync("mon-id-modele");
Référence des types clés
| Type | Description |
|---|
DocumentIntelligenceClient | Client principal pour l'analyse |
DocumentIntelligenceAdministrationClient | Gestion des modèles |
AnalyzeResult | Résultat de l'analyse de document |
AnalyzedDocument | Document unique dans le résultat |
DocumentField | Champ extrait avec valeur et confiance |
DocumentFieldType | String, Date, Number, Currency, etc. |
DocumentPage | Informations de page (lignes, mots, marques de sélection) |
DocumentTable | Tableau extrait avec cellules |
DocumentModelDetails | Métadonnées du modèle personnalisé |
BlobContentSource | Source des données d'entraînement |
Modes de construction
| Mode | Cas d'usage |
|---|
DocumentBuildMode.Template | Documents à mise en page fixe (formulaires) |
DocumentBuildMode.Neural | Documents à mise en page variable |
Bonnes pratiques
- Utilisez DefaultAzureCredential pour la production
- Réutilisez les instances de client — les clients sont thread-safe
- Gérez les opérations longues — Utilisez
WaitUntil.Completed pour simplifier
- Vérifiez la confiance des champs — Vérifiez toujours la propriété
Confidence
- Utilisez le modèle approprié — Prédéfini pour les documents courants, personnalisé pour les spécialisés
- Utilisez un sous-domaine personnalisé — Requis pour l'authentification Entra ID
Gestion des erreurs
using Azure;
try
{
var operation = await client.AnalyzeDocumentAsync(
WaitUntil.Completed,
"prebuilt-invoice",
documentUri);
}
catch (RequestFailedException ex)
{
Console.WriteLine($"Erreur : {ex.Status} - {ex.Message}");
}
SDKs associés
| SDK | Objectif | Installation |
|---|
Azure.AI.DocumentIntelligence | Analyse de documents (ce SDK) | dotnet add package Azure.AI.DocumentIntelligence |
Azure.AI.FormRecognizer | SDK hérité (obsolète) | Utilisez DocumentIntelligence à la place |
Liens de référence