Azure Ai Document Intelligence Dotnet

作者 microsoft354361d83247MIT收录于 2026年10月8日更新于 2026年10月8日

Azure AI Document Intelligence SDK for .NET. Extract text, tables, and structured data from documents using prebuilt and custom models. Use for invoice processing, receipt extraction, ID document analysis, and custom document models. Triggers: "Document Intelligence", "DocumentIntelligenceClient", "form recognizer", "invoice extraction", "receipt OCR", "document analysis .NET".

精选仅含说明Software Development
AI 生成的概览

指导 .NET 开发者使用 Azure AI 文档智能 SDK 从文档中提取文本、表格和字段。

功能
该技能为 Azure.AI.DocumentIntelligence .NET SDK 提供参考说明和 C# 代码示例。内容涵盖身份验证、用于发票、收据、身份证件和版面的预生成模型、自定义模型与分类器的构建,以及模型管理。它产出的是指导和示例代码,本身不运行脚本。
适用场景
适用于构建需要 OCR、发票或收据提取、身份证件分析或自定义文档模型的 .NET 应用。也适合以编程方式管理文档智能模型和分类器。
运行要求
需要 .NET SDK 以及 Azure.AI.DocumentIntelligence 和 Azure.Identity NuGet 包。需要 Azure 文档智能终结点,以及 API 密钥或 Microsoft Entra 凭据;需要访问 Azure 的网络连接。不包含脚本。

Azure.AI.DocumentIntelligence (.NET)

Extract text, tables, and structured data from documents using prebuilt and custom models.

Installation

bash
dotnet add package Azure.AI.DocumentIntelligencedotnet add package Azure.Identity

Current Version: v1.0.0 (GA)

Environment Variables

bash
DOCUMENT_INTELLIGENCE_ENDPOINT=https://<resource-name>.cognitiveservices.azure.com/  # Required: Document Intelligence endpointDOCUMENT_INTELLIGENCE_API_KEY=<your-api-key>  # Only required for AzureKeyCredential authBLOB_CONTAINER_SAS_URL=https://<storage>.blob.core.windows.net/<container>?<sas-token>  # Optional: blob container SAS URL for training dataAZURE_TOKEN_CREDENTIALS=prod  # Required only if DefaultAzureCredential is used in production

Authentication

Microsoft Entra Token Credential

csharp
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

csharp
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

ClientPurpose
DocumentIntelligenceClientAnalyze documents, classify documents
DocumentIntelligenceAdministrationClientBuild/manage custom models and classifiers

Prebuilt Models

Model IDDescription
prebuilt-readExtract text, languages, handwriting
prebuilt-layoutExtract text, tables, selection marks, structure
prebuilt-invoiceExtract invoice fields (vendor, items, totals)
prebuilt-receiptExtract receipt fields (merchant, items, total)
prebuilt-idDocumentExtract ID document fields (name, DOB, address)
prebuilt-businessCardExtract business card fields
prebuilt-tax.us.w2Extract W-2 tax form fields
prebuilt-healthInsuranceCard.usExtract health insurance card fields

Core Workflows

1. Analyze Invoice

csharp
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)

csharp
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 pageforeach (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 tablesforeach (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

csharp
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

csharp
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

csharp
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

csharp
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

csharp
// Get resource detailsDocumentIntelligenceResourceDetails resourceDetails = await adminClient.GetResourceDetailsAsync();Console.WriteLine($"Custom models: {resourceDetails.CustomDocumentModels.Count}/{resourceDetails.CustomDocumentModels.Limit}");
// Get specific modelDocumentModelDetails model = await adminClient.GetModelAsync("my-model-id");Console.WriteLine($"Model: {model.ModelId}, Created: {model.CreatedOn}");
// List modelsawait foreach (DocumentModelDetails modelItem in adminClient.GetModelsAsync()){    Console.WriteLine($"Model: {modelItem.ModelId}");}
// Delete modelawait adminClient.DeleteModelAsync("my-model-id");

Key Types Reference

TypeDescription
DocumentIntelligenceClientMain client for analysis
DocumentIntelligenceAdministrationClientModel management
AnalyzeResultResult of document analysis
AnalyzedDocumentSingle document within result
DocumentFieldExtracted field with value and confidence
DocumentFieldTypeString, Date, Number, Currency, etc.
DocumentPagePage info (lines, words, selection marks)
DocumentTableExtracted table with cells
DocumentModelDetailsCustom model metadata
BlobContentSourceTraining data source

Build Modes

ModeUse Case
DocumentBuildMode.TemplateFixed layout documents (forms)
DocumentBuildMode.NeuralVariable layout documents

Best Practices

  1. Use DefaultAzureCredential for production
  2. Reuse client instances — clients are thread-safe
  3. Handle long-running operations — Use WaitUntil.Completed for simplicity
  4. Check field confidence — Always verify Confidence property
  5. Use appropriate model — Prebuilt for common docs, custom for specialized
  6. Use custom subdomain — Required for Entra ID authentication

Error Handling

csharp
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

SDKPurposeInstall
Azure.AI.DocumentIntelligenceDocument analysis (this SDK)dotnet add package Azure.AI.DocumentIntelligence
Azure.AI.FormRecognizerLegacy SDK (deprecated)Use DocumentIntelligence instead

Reference Links

来源与署名

来源:microsoft/skills位于.github/plugins/azure-sdk-dotnet/skills/azure-ai-document-intelligence-dotnet提交354361d

许可证: MIT

内容归原作者所有。SourceWeft 从公开仓库中收录这些内容。

举报或申请下架