Azure AI Document Intelligence Dotnet
MicrosoftOfficialCreated by Microsoft
- Skill
- Tool integration
- Software development
- MIT
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The Azure AI Document Intelligence SDK for .NET provides developers with the tools to extract text, tables, and structured data from various document types. It supports both prebuilt models for common documents like invoices, receipts, and ID cards, as well as custom models for specialized document processing. The SDK includes clients for document analysis and administrative tasks such as model training and classification management.
What it does
- Extracts text, tables, and structured fields from documents.
- Supports prebuilt models for invoices, receipts, IDs, and tax forms.
- Enables training and management of custom document models.
- Provides document classification capabilities.
- Offers secure authentication via Microsoft Entra ID or API keys.
- Handles long-running document analysis operations.
When to use it
- When automating data extraction from business documents like invoices or receipts.
- When building applications that require structured data from unstructured PDFs or images.
- When you need to classify documents automatically based on custom criteria.
- When integrating Azure AI document processing into a .NET backend application.
Advantages
- Native .NET support with thread-safe client instances.
- Comprehensive support for both prebuilt and custom model workflows.
- Flexible authentication options including managed identities.
- Detailed field-level confidence scores for validation.
Usage examples
- “How do I extract vendor and total amount from an invoice using the .NET SDK?”
- The agent provides a code snippet using DocumentIntelligenceClient.AnalyzeDocumentAsync with the 'prebuilt-invoice' model, demonstrating how to iterate through the result fields to retrieve vendor name and currency values.
- “Show me how to train a custom document model in .NET.”
- The agent provides an example using DocumentIntelligenceAdministrationClient.BuildDocumentModelAsync, specifying the model ID, build mode, and the blob container source for training data.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/microsoft/azure-ai-document-intelligence-dotnet/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip azure-ai-document-intelligence-dotnet.zip -d .agents/skills
Documentation by Microsoft
Azure.AI.DocumentIntelligence (.NET)
Extract text, tables, and structured data from documents using prebuilt and custom models.
Installation
dotnet add package Azure.AI.DocumentIntelligence
dotnet add package Azure.IdentityCurrent Version: v1.0.0 (GA)
Environment Variables
DOCUMENT_INTELLIGENCE_ENDPOINT=https://<resource-name>.cognitiveservices.azure.com/ # Required: Document Intelligence endpoint
DOCUMENT_INTELLIGENCE_API_KEY=<your-api-key> # Only required for AzureKeyCredential auth
BLOB_CONTAINER_SAS_URL=https://<storage>.blob.core.windows.net/<container>?<sas-token> # Optional: blob container SAS URL for training data
AZURE_TOKEN_CREDENTIALS=prod # Required only if DefaultAzureCredential is used in productionAuthentication
Microsoft Entra Token Credential
using Azure.Identity;
using Azure.AI.DocumentIntelligence;
string endpoint = Environment.GetEnvironmentVariable("DOCUMENT_INTELLIGENCE_ENDPOINT");
// Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
var credential = new DefaultAzureCredential(
DefaultAzureCredential.DefaultEnvironmentVariableName
);
// Or use a specific credential directly in production:
// See https://learn.microsoft.com/dotnet/api/overview/azure/identity-readme?view=azure-dotnet#credential-classes
// var credential = new ManagedIdentityCredential();
var client = new DocumentIntelligenceClient(new Uri(endpoint), credential);Note: Entra ID requires a custom subdomain (e.g.,
https://<resource-name>.cognitiveservices.azure.com/), not a regional endpoint.
API Key
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));Client Types
| Client | Purpose |
|---|---|
DocumentIntelligenceClient | Analyze documents, classify documents |
DocumentIntelligenceAdministrationClient | Build/manage custom models and classifiers |
Prebuilt Models
| Model ID | Description |
|---|---|
prebuilt-read | Extract text, languages, handwriting |
prebuilt-layout | Extract text, tables, selection marks, structure |
prebuilt-invoice | Extract invoice fields (vendor, items, totals) |
prebuilt-receipt | Extract receipt fields (merchant, items, total) |
prebuilt-idDocument | Extract ID document fields (name, DOB, address) |
prebuilt-businessCard | Extract business card fields |
prebuilt-tax.us.w2 | Extract W-2 tax form fields |
prebuilt-healthInsuranceCard.us | Extract health insurance card fields |
Core Workflows
1. Analyze Invoice
using Azure.AI.DocumentIntelligence;
Uri invoiceUri = new Uri("https://example.com/invoice.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($"Vendor Name: '{vendorName}', confidence: {vendorNameField.Confidence}");
}
if (document.Fields.TryGetValue("InvoiceTotal", out DocumentField invoiceTotalField)
&& invoiceTotalField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue invoiceTotal = invoiceTotalField.ValueCurrency;
Console.WriteLine($"Invoice Total: '{invoiceTotal.CurrencySymbol}{invoiceTotal.Amount}'");
}
// Extract line items
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($" Item: {descField.ValueString}");
}
}
}2. Extract Layout (Text, Tables, Structure)
Uri fileUri = new Uri("https://example.com/document.pdf");
Operation<AnalyzeResult> operation = await client.AnalyzeDocumentAsync(
WaitUntil.Completed,
"prebuilt-layout",
fileUri);
AnalyzeResult result = operation.Value;
// Extract text by page
foreach (DocumentPage page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber}: {page.Lines.Count} lines, {page.Words.Count} words");
foreach (DocumentLine line in page.Lines)
{
Console.WriteLine($" Line: '{line.Content}'");
}
}
// Extract tables
foreach (DocumentTable table in result.Tables)
{
Console.WriteLine($"Table: {table.RowCount} rows x {table.ColumnCount} columns");
foreach (DocumentTableCell cell in table.Cells)
{
Console.WriteLine($" Cell ({cell.RowIndex}, {cell.ColumnIndex}): {cell.Content}");
}
}3. Analyze Receipt
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($"Merchant: {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. Build Custom Model
var adminClient = new DocumentIntelligenceAdministrationClient(
new Uri(endpoint),
new AzureKeyCredential(apiKey));
string modelId = "my-custom-model";
Uri blobContainerUri = new Uri("<blob-container-sas-url>");
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($"Model ID: {model.ModelId}");
Console.WriteLine($"Created: {model.CreatedOn}");
foreach (var docType in model.DocumentTypes)
{
Console.WriteLine($"Document type: {docType.Key}");
foreach (var field in docType.Value.FieldSchema)
{
Console.WriteLine($" Field: {field.Key}, Confidence: {docType.Value.FieldConfidence[field.Key]}");
}
}5. Build Document Classifier
string classifierId = "my-classifier";
Uri blobContainerUri = new Uri("<blob-container-sas-url>");
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($"Classifier ID: {classifier.ClassifierId}");6. Classify Document
string classifierId = "my-classifier";
Uri documentUri = new Uri("https://example.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($"Document type: {document.DocumentType}, confidence: {document.Confidence}");
}7. Manage Models
// Get resource details
DocumentIntelligenceResourceDetails resourceDetails = await adminClient.GetResourceDetailsAsync();
Console.WriteLine($"Custom models: {resourceDetails.CustomDocumentModels.Count}/{resourceDetails.CustomDocumentModels.Limit}");
// Get specific model
DocumentModelDetails model = await adminClient.GetModelAsync("my-model-id");
Console.WriteLine($"Model: {model.ModelId}, Created: {model.CreatedOn}");
// List models
await foreach (DocumentModelDetails modelItem in adminClient.GetModelsAsync())
{
Console.WriteLine($"Model: {modelItem.ModelId}");
}
// Delete model
await adminClient.DeleteModelAsync("my-model-id");Key Types Reference
| Type | Description |
|---|---|
DocumentIntelligenceClient | Main client for analysis |
DocumentIntelligenceAdministrationClient | Model management |
AnalyzeResult | Result of document analysis |
AnalyzedDocument | Single document within result |
DocumentField | Extracted field with value and confidence |
DocumentFieldType | String, Date, Number, Currency, etc. |
DocumentPage | Page info (lines, words, selection marks) |
DocumentTable | Extracted table with cells |
DocumentModelDetails | Custom model metadata |
BlobContentSource | Training data source |
Build Modes
| Mode | Use Case |
|---|---|
DocumentBuildMode.Template | Fixed layout documents (forms) |
DocumentBuildMode.Neural | Variable layout documents |
Best Practices
Use DefaultAzureCredential for production
Reuse client instances — clients are thread-safe
Handle long-running operations — Use
WaitUntil.Completedfor simplicityCheck field confidence — Always verify
ConfidencepropertyUse appropriate model — Prebuilt for common docs, custom for specialized
Use custom subdomain — Required for Entra ID authentication
Error Handling
using Azure;
try
{
var operation = await client.AnalyzeDocumentAsync(
WaitUntil.Completed,
"prebuilt-invoice",
documentUri);
}
catch (RequestFailedException ex)
{
Console.WriteLine($"Error: {ex.Status} - {ex.Message}");
}Related SDKs
| SDK | Purpose | Install |
|---|---|---|
Azure.AI.DocumentIntelligence | Document analysis (this SDK) | dotnet add package Azure.AI.DocumentIntelligence |
Azure.AI.FormRecognizer | Legacy SDK (deprecated) | Use DocumentIntelligence instead |
Reference Links
| Resource | URL |
|---|---|
| NuGet Package | https://www.nuget.org/packages/Azure.AI.DocumentIntelligence |
| API Reference | https://learn.microsoft.com/dotnet/api/azure.ai.documentintelligence |
| GitHub Samples | https://github.com/Azure/azure-sdk-for-net/tree/main/sdk/documentintelligence/Azure.AI.DocumentIntelligence/samples |
| Document Intelligence Studio | https://documentintelligence.ai.azure.com/ |
| Prebuilt Models | https://aka.ms/azsdk/formrecognizer/models |
Files
- ATTRIBUTION.mdAdded by AutoGineer1022 B
- LICENSELicence file added by AutoGineer1.1 KiB
- SKILL.md11.6 KiB
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an API key
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- Microsoft
- Publisher
- Microsoft (Official)
- Source
- microsoft/skills · .github/plugins/azure-sdk-dotnet/skills/azure-ai-document-intelligence-dotnet · commit 0696600
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Microsoft.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download azure-ai-document-intelligence-dotnet.zip