Comece com a Inteligência Documental

Importante

  • O Azure Cognitive Services Reconhecedor de Formulários é agora o Azure Document Intelligence na Foundry Tools.
  • Algumas plataformas ainda aguardam a atualização de renomeação.
  • Toda a menção ao Reconhecedor de Formulários ou Document Intelligence na nossa documentação refere-se ao mesmo serviço Azure.

Este conteúdo aplica-se a:checkmarkv4.0 (GA)Versões anteriores:blue-checkmarkv3.1 (GA)blue-checkmarkv3.0 (GA)

  • Comece a usar a mais recente versão estável v4.0 do Azure Document Intelligence 2024-11-30 (GA).

Este conteúdo aplica-se a:checkmarkv3.1 (GA)Versões anteriores:blue-checkmarkv3.0blue-checkmarkv2.1

  • Comece com a versão mais recente de disponibilidade geral do Azure Reconhecedor de Formulários (2023-07-31).

Este conteúdo aplica-se a:checkmarkv3.0 (GA)Versão mais recente:blue-checkmarkv3.1blue-checkmarkv2.1

  • Comece com a versão GA legado do Azure Reconhecedor de Formulários (2022-08-31).
  • Azure Document Intelligence / Reconhecedor de Formulários é um serviço baseado na cloud do Foundry Tools que utiliza aprendizagem automática para extrair pares-chave-valor, texto, tabelas e dados-chave dos seus documentos.

  • Pode facilmente integrar modelos de processamento de documentos nos seus fluxos de trabalho e aplicações usando um SDK de linguagem de programação ou chamando a API REST.

  • Recomendamos que utilize o serviço gratuito enquanto se familiariza com a tecnologia deste guia de início rápido. Lembre-se que o número de páginas gratuitas está limitado a 500 por mês.

Para saber mais sobre as funcionalidades da API e as opções de desenvolvimento, visite a nossa página de Visão Geral .

Neste início rápido, utilize as seguintes funcionalidades para analisar e extrair dados e valores de formulários e documentos:

  • Modelo de layout — Analise e extraia tabelas, linhas, palavras e marcas de seleção como botões de opção e caixas de seleção em documentos, sem necessidade de treinar um modelo.

  • Modelo pré-construído—Analise e extraia campos comuns de tipos específicos de documentos usando um modelo pré-construído.

Pré-requisitos

  • Um recurso de Ferramentas de Fabrico ou Inteligência de Documentos. Depois de teres a tua subscrição Azure, cria um recurso multiserviço único ou Azure multi-serviço, no portal Azure, para obter a tua chave e endpoint.

  • Podes usar o escalão de preços gratuito (F0) para experimentar o serviço, e depois fazer um upgrade para um nível pago para produção.

Dica

Crie um recurso Microsoft Foundry se planeia aceder a várias Foundry Tools num único endpoint/chave. Para acesso apenas à Inteligência Documental, crie um recurso de Inteligência Documental. Precisa de um recurso de serviço único se pretende usar autenticação Microsoft Entra.

  • Depois de o seu recurso ser implementado, selecione Ir para o recurso. Precisa da chave e do ponto final do recurso que cria para ligar a sua aplicação à API de Inteligência de Documentos. Colas a tua chave e endpoint no código mais tarde no quickstart:

    Captura de ecrã das chaves e localização do endpoint no portal Azure.

  • Um recurso de Ferramentas de Fabrico ou Inteligência de Documentos. Depois de teres a tua subscrição Azure, cria um recurso Azure de serviço único ou Azure de multisserviço, no portal Azure, para obter a tua chave e endpoint.

  • Podes usar o escalão de preços gratuito (F0) para experimentar o serviço, e depois fazer um upgrade para um nível pago para produção.

Dica

Crie um recurso Microsoft Foundry se planeia aceder a várias Foundry Tools num único endpoint/chave. Para acesso apenas ao Reconhecedor de Formulários, crie um recurso Reconhecedor de Formulários. Precisa de um recurso de serviço único se pretende usar autenticação Microsoft Entra.

  • Depois de o seu recurso ser implementado, selecione Ir para o recurso. Precisa da chave e do endpoint do recurso que cria para ligar a sua aplicação à API do Reconhecedor de Formulários. Colas a tua chave e endpoint no código mais tarde no quickstart:

    Captura de ecrã das chaves e localização do endpoint no portal Azure.

Configuração

  1. Inicia o Visual Studio.

  2. Na página inicial, escolha Criar um novo projeto.

    Captura de ecrã da janela de início Visual Studio.

  3. Na página Criar um novo projeto, introduza Consola na caixa de pesquisa. Escolhe o modelo de Aplicação de Consola e depois escolhe Próximo.

    Captura de ecrã da página de criação de novo projeto do Visual Studio.

  1. Na janela de diálogo Configurar o seu novo projeto, introduza doc_intel_quickstart na caixa do nome do projeto. Depois escolhe Próximo.
  1. Na janela de diálogo Configurar o seu novo projeto, introduza form_recognizer_quickstart na caixa do nome do projeto. Depois escolhe Próximo.
  1. Na janela de diálogo Informação adicional, selecione .NET 8.0 (Suporte a longo prazo) e depois selecione Criar.

    Captura de ecrã da janela de diálogo de informação adicional do Visual Studio.

Instale a biblioteca cliente com o NuGet

  1. Clique com o botão direito no seu projeto doc_intel_quickstart e selecione Gerir Pacotes NuGet... .

    Captura de ecrã da janela para selecionar pacotes de pré-lançamento do NuGet no Visual Studio.

  2. Selecione o separador Browse e escreva Azure. IA. DocumentIntelligence.

  3. Selecione a Include prerelease caixa de seleção.

    Captura de ecrã de um pacote NuGet pré-lançamento selecionado em Visual Studio.

  4. Escolha uma versão no menu suspenso e instale o pacote no seu projeto.

  1. Clique com o botão direito no seu projeto form_recognizer_quickstart e selecione Gerir Pacotes NuGet... .

    Captura de ecrã da janela de encontrar pacote NuGet em Visual Studio.

  2. Selecione o separador Navegar e escreva Azure. IA. FormRecognizer. Selecione a versão 4.1.0 no menu suspenso

    Captura de ecrã do pacote NuGet Reconhecedor de Formulários selecionado em Visual Studio.

  1. Clique com o botão direito no seu projeto form_recognizer_quickstart e selecione Gerir Pacotes NuGet... .

    Captura de ecrã da janela do pacote NuGet em Visual Studio.

  2. Selecione o separador Navegar e escreva Azure. IA. FormRecognizer. Selecione a versão 4.0.0 no menu desdobrável

    Captura de ecrã de um pacote legado NuGet selecionado em Visual Studio.

Constrói a tua aplicação

Para interagir com o serviço de Inteligência Documental, é necessário criar uma instância da DocumentIntelligenceClient classe. Para isso, cria um AzureKeyCredential com o seu key no Portal do Azure e uma instância DocumentIntelligenceClient com o AzureKeyCredential e o seu Document Intelligence endpoint.

Para interagir com o serviço Reconhecedor de Formulários, é necessário criar uma instância da classe DocumentAnalysisClient. Para isso, crias um AzureKeyCredential com o teu key do portal Azure e uma instância DocumentAnalysisClient com o AzureKeyCredential e o teu Reconhecedor de Formulários endpoint.

Nota

  • A partir do .NET 6, novos projetos que utilizam o modelo console geram um novo estilo de programa que difere das versões anteriores.
  • A nova saída utiliza funcionalidades recentes de C# que simplificam o código que precisa de escrever.
  • Quando usas a versão mais recente, só precisas de escrever o corpo do Main método. Não precisas de incluir instruções de topo, diretivas globais usando ou usando diretivas implícitas.
  • Para mais informações, consulteos novos modelos C# que geram instruções de topo.
  1. Abre o ficheiro Program.cs .

  2. Elimine o código existente, incluindo a linha Console.Writeline("Hello World!"), e selecione um dos seguintes exemplos de código para copiar e colar no ficheiro Program.cs da sua aplicação:

Importante

Recomendamos a autenticação do Microsoft Entra ID com identidades geridas para recursos do Azure para evitar armazenar credenciais com as suas aplicações que correm na cloud.

Use as chaves API com cautela. Não incluas a chave API diretamente no teu código e nunca a publiques publicamente. Se usar chaves API, guarde-as de forma segura no Azure Key Vault, rode as chaves regularmente e restrinja o acesso ao Azure Key Vault usando controlo de acesso baseado em funções e restrições de acesso à rede. Para obter mais informações sobre o uso seguro das chaves API nas suas aplicações, consulte chaves API com Azure Key Vault.

Para mais informações sobre a segurança dos serviços de IA, consulte Autenticar pedidos para Serviços de IA do Azure.

Modelo de disposição

Extrai texto, marcas de seleção, estilos de texto, estruturas de tabelas e coordenadas de regiões delimitadoras dos documentos.

  • Para este exemplo, precisarás de um ficheiro a partir de um URI. Pode usar o nosso documento exemplo para este início rápido.
  • Adicionámos o valor do URI do ficheiro à Uri fileUri variável no topo do script.
  • Para extrair o layout de um dado ficheiro num URI, use o AnalyzeDocumentAsync método e passe prebuilt-layout como ID do modelo. O valor devolvido é um AnalyzeResult objeto contendo dados do documento submetido.

Adicione o seguinte exemplo de código ao ficheiro Program.cs. Certifique-se de atualizar as variáveis chave e endpoint com os valores da sua instância de Document Intelligence do portal Azure:


using Azure;
using Azure.AI.DocumentIntelligence;

//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentIntelligenceClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentIntelligenceClient client = new DocumentIntelligenceClient(new Uri(endpoint), credential);

//sample document
Uri fileUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf");

AnalyzeDocumentContent content = new AnalyzeDocumentContent()
{
    UrlSource= fileUri
};

Operation<AnalyzeResult> operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-layout", content);

AnalyzeResult result = operation.Value;

foreach (DocumentPage page in result.Pages)
{
    Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s)," +
        $" and {page.SelectionMarks.Count} selection mark(s).");

    for (int i = 0; i < page.Lines.Count; i++)
    {
        DocumentLine line = page.Lines[i];

        Console.WriteLine($"  Line {i}:");
        Console.WriteLine($"    Content: '{line.Content}'");

        Console.Write("    Bounding polygon, with points ordered clockwise:");
        for (int j = 0; j < line.Polygon.Count; j += 2)
        {
            Console.Write($" ({line.Polygon[j]}, {line.Polygon[j + 1]})");
        }

        Console.WriteLine();
    }

    for (int i = 0; i < page.SelectionMarks.Count; i++)
    {
        DocumentSelectionMark selectionMark = page.SelectionMarks[i];

        Console.WriteLine($"  Selection Mark {i} is {selectionMark.State}.");
        Console.WriteLine($"    State: {selectionMark.State}");

        Console.Write("    Bounding polygon, with points ordered clockwise:");
        for (int j = 0; j < selectionMark.Polygon.Count; j++)
        {
            Console.Write($" ({selectionMark.Polygon[j]}, {selectionMark.Polygon[j + 1]})");
        }

        Console.WriteLine();
    }
}

for (int i = 0; i < result.Paragraphs.Count; i++)
{
    DocumentParagraph paragraph = result.Paragraphs[i];

    Console.WriteLine($"Paragraph {i}:");
    Console.WriteLine($"  Content: {paragraph.Content}");

    if (paragraph.Role != null)
    {
        Console.WriteLine($"  Role: {paragraph.Role}");
    }
}

foreach (DocumentStyle style in result.Styles)
{
    // Check the style and style confidence to see if text is handwritten.
    // Note that value '0.8' is used as an example.

    bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;

    if (isHandwritten && style.Confidence > 0.8)
    {
        Console.WriteLine($"Handwritten content found:");

        foreach (DocumentSpan span in style.Spans)
        {
            var handwrittenContent = result.Content.Substring(span.Offset, span.Length);
            Console.WriteLine($"  {handwrittenContent}");
        }
    }
}

for (int i = 0; i < result.Tables.Count; i++)
{
    DocumentTable table = result.Tables[i];

    Console.WriteLine($"Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");

    foreach (DocumentTableCell cell in table.Cells)
    {
        Console.WriteLine($"  Cell ({cell.RowIndex}, {cell.ColumnIndex}) is a '{cell.Kind}' with content: {cell.Content}");
    }
}

Execute a sua aplicação

Depois de adicionar um exemplo de código à sua aplicação, escolha o botão verde Start ao lado de formRecognizer_quickstart para construir e executar o seu programa, ou pressione F5.

Captura de ecrã do botão executar o seu programa do Visual Studio.

Adicione o seguinte exemplo de código ao ficheiro Program.cs. Certifique-se de atualizar as variáveis chave e endpoint com os valores da sua instância Reconhecedor de Formulários do portal Azure:

using Azure;
using Azure.AI.FormRecognizer.DocumentAnalysis;

//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentAnalysisClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

//sample document
Uri fileUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf");

AnalyzeDocumentOperation operation = await client.AnalyzeDocumentFromUriAsync(WaitUntil.Completed, "prebuilt-layout", fileUri);

AnalyzeResult result = operation.Value;

foreach (DocumentPage page in result.Pages)
{
    Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s),");
    Console.WriteLine($"and {page.SelectionMarks.Count} selection mark(s).");

    for (int i = 0; i < page.Lines.Count; i++)
    {
        DocumentLine line = page.Lines[i];
        Console.WriteLine($"  Line {i} has content: '{line.Content}'.");

        Console.WriteLine($"    Its bounding box is:");
        Console.WriteLine($"      Upper left => X: {line.Polygon[0].X}, Y= {line.Polygon[0].Y}");
        Console.WriteLine($"      Upper right => X: {line.Polygon[1].X}, Y= {line.Polygon[1].Y}");
        Console.WriteLine($"      Lower right => X: {line.Polygon[2].X}, Y= {line.Polygon[2].Y}");
        Console.WriteLine($"      Lower left => X: {line.Polygon[3].X}, Y= {line.Polygon[3].Y}");
    }

    for (int i = 0; i < page.SelectionMarks.Count; i++)
    {
        DocumentSelectionMark selectionMark = page.SelectionMarks[i];

        Console.WriteLine($"  Selection Mark {i} is {selectionMark.State}.");
        Console.WriteLine($"    Its bounding box is:");
        Console.WriteLine($"      Upper left => X: {selectionMark.Polygon[0].X}, Y= {selectionMark.Polygon[0].Y}");
        Console.WriteLine($"      Upper right => X: {selectionMark.Polygon[1].X}, Y= {selectionMark.Polygon[1].Y}");
        Console.WriteLine($"      Lower right => X: {selectionMark.Polygon[2].X}, Y= {selectionMark.Polygon[2].Y}");
        Console.WriteLine($"      Lower left => X: {selectionMark.Polygon[3].X}, Y= {selectionMark.Polygon[3].Y}");
    }
}

foreach (DocumentStyle style in result.Styles)
{
    // Check the style and style confidence to see if text is handwritten.
    // Note that value '0.8' is used as an example.

    bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;

    if (isHandwritten && style.Confidence > 0.8)
    {
        Console.WriteLine($"Handwritten content found:");

        foreach (DocumentSpan span in style.Spans)
        {
            Console.WriteLine($"  Content: {result.Content.Substring(span.Index, span.Length)}");
        }
    }
}

Console.WriteLine("The following tables were extracted:");

for (int i = 0; i < result.Tables.Count; i++)
{
    DocumentTable table = result.Tables[i];
    Console.WriteLine($"  Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");

    foreach (DocumentTableCell cell in table.Cells)
    {
        Console.WriteLine($"    Cell ({cell.RowIndex}, {cell.ColumnIndex}) has kind '{cell.Kind}' and content: '{cell.Content}'.");
    }
}

Execute a sua aplicação

Depois de adicionar um exemplo de código à sua aplicação, escolha o botão verde Start ao lado de formRecognizer_quickstart para construir e executar o seu programa, ou pressione F5.

Captura de ecrã da localização do botão para executar o seu programa no Visual Studio.

Saída do modelo de layout

Aqui está um excerto do resultado esperado:

  Document Page 1 has 69 line(s), 425 word(s), and 15 selection mark(s).
  Line 0 has content: 'UNITED STATES'.
    Its bounding box is:
      Upper left => X: 3.4915, Y= 0.6828
      Upper right => X: 5.0116, Y= 0.6828
      Lower right => X: 5.0116, Y= 0.8265
      Lower left => X: 3.4915, Y= 0.8265
  Line 1 has content: 'SECURITIES AND EXCHANGE COMMISSION'.
    Its bounding box is:
      Upper left => X: 2.1937, Y= 0.9061
      Upper right => X: 6.297, Y= 0.9061
      Lower right => X: 6.297, Y= 1.0498
      Lower left => X: 2.1937, Y= 1.0498

Para visualizar a saída completa, visite o repositório de Azure samples no GitHub para visualizar a saída do modelo layout.

Adicione o seguinte exemplo de código ao ficheiro Program.cs. Certifique-se de atualizar as variáveis chave e endpoint com os valores da sua instância Reconhecedor de Formulários do portal Azure:

using Azure;
using Azure.AI.FormRecognizer.DocumentAnalysis;

//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentAnalysisClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

//sample document
Uri fileUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf");

AnalyzeDocumentOperation operation = await client.AnalyzeDocumentFromUriAsync(WaitUntil.Completed, "prebuilt-layout", fileUri);

AnalyzeResult result = operation.Value;

foreach (DocumentPage page in result.Pages)
{
    Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s),");
    Console.WriteLine($"and {page.SelectionMarks.Count} selection mark(s).");

    for (int i = 0; i < page.Lines.Count; i++)
    {
        DocumentLine line = page.Lines[i];
        Console.WriteLine($"  Line {i} has content: '{line.Content}'.");

        Console.WriteLine($"    Its bounding polygon (points ordered clockwise):");

        for (int j = 0; j < line.Polygon.Count; j++)
        {
            Console.WriteLine($"      Point {j} => X: {line.Polygon[j].X}, Y: {line.Polygon[j].Y}");
        }
    }

    for (int i = 0; i < page.SelectionMarks.Count; i++)
    {
        DocumentSelectionMark selectionMark = page.SelectionMarks[i];

        Console.WriteLine($"  Selection Mark {i} is {selectionMark.State}.");
        Console.WriteLine($"    Its bounding polygon (points ordered clockwise):");

        for (int j = 0; j < selectionMark.Polygon.Count; j++)
        {
            Console.WriteLine($"      Point {j} => X: {selectionMark.Polygon[j].X}, Y: {selectionMark.Polygon[j].Y}");
        }
    }
}

Console.WriteLine("Paragraphs:");

foreach (DocumentParagraph paragraph in result.Paragraphs)
{
    Console.WriteLine($"  Paragraph content: {paragraph.Content}");

    if (paragraph.Role != null)
    {
        Console.WriteLine($"    Role: {paragraph.Role}");
    }
}

foreach (DocumentStyle style in result.Styles)
{
    // Check the style and style confidence to see if text is handwritten.
    // Note that value '0.8' is used as an example.

    bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;

    if (isHandwritten && style.Confidence > 0.8)
    {
        Console.WriteLine($"Handwritten content found:");

        foreach (DocumentSpan span in style.Spans)
        {
            Console.WriteLine($"  Content: {result.Content.Substring(span.Index, span.Length)}");
        }
    }
}

Console.WriteLine("The following tables were extracted:");

for (int i = 0; i < result.Tables.Count; i++)
{
    DocumentTable table = result.Tables[i];
    Console.WriteLine($"  Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");

    foreach (DocumentTableCell cell in table.Cells)
    {
        Console.WriteLine($"    Cell ({cell.RowIndex}, {cell.ColumnIndex}) has kind '{cell.Kind}' and content: '{cell.Content}'.");
    }
}
Extract the layout of a document from a file stream
To extract the layout from a given file at a file stream, use the AnalyzeDocument method and pass prebuilt-layout as the model ID. The returned value is an AnalyzeResult object containing data about the submitted document.

string filePath = "<filePath>";
using var stream = new FileStream(filePath, FileMode.Open);

AnalyzeDocumentOperation operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-layout", stream);
AnalyzeResult result = operation.Value;

foreach (DocumentPage page in result.Pages)
{
    Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s),");
    Console.WriteLine($"and {page.SelectionMarks.Count} selection mark(s).");

    for (int i = 0; i < page.Lines.Count; i++)
    {
        DocumentLine line = page.Lines[i];
        Console.WriteLine($"  Line {i} has content: '{line.Content}'.");

        Console.WriteLine($"    Its bounding polygon (points ordered clockwise):");

        for (int j = 0; j < line.Polygon.Count; j++)
        {
            Console.WriteLine($"      Point {j} => X: {line.Polygon[j].X}, Y: {line.Polygon[j].Y}");
        }
    }

    for (int i = 0; i < page.SelectionMarks.Count; i++)
    {
        DocumentSelectionMark selectionMark = page.SelectionMarks[i];

        Console.WriteLine($"  Selection Mark {i} is {selectionMark.State}.");
        Console.WriteLine($"    Its bounding polygon (points ordered clockwise):");

        for (int j = 0; j < selectionMark.Polygon.Count; j++)
        {
            Console.WriteLine($"      Point {j} => X: {selectionMark.Polygon[j].X}, Y: {selectionMark.Polygon[j].Y}");
        }
    }
}

Console.WriteLine("Paragraphs:");

foreach (DocumentParagraph paragraph in result.Paragraphs)
{
    Console.WriteLine($"  Paragraph content: {paragraph.Content}");

    if (paragraph.Role != null)
    {
        Console.WriteLine($"    Role: {paragraph.Role}");
    }
}

foreach (DocumentStyle style in result.Styles)
{
    // Check the style and style confidence to see if text is handwritten.
    // Note that value '0.8' is used as an example.

    bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;

    if (isHandwritten && style.Confidence > 0.8)
    {
        Console.WriteLine($"Handwritten content found:");

        foreach (DocumentSpan span in style.Spans)
        {
            Console.WriteLine($"  Content: {result.Content.Substring(span.Index, span.Length)}");
        }
    }
}

Console.WriteLine("The following tables were extracted:");

for (int i = 0; i < result.Tables.Count; i++)
{
    DocumentTable table = result.Tables[i];
    Console.WriteLine($"  Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");

    foreach (DocumentTableCell cell in table.Cells)
    {
        Console.WriteLine($"    Cell ({cell.RowIndex}, {cell.ColumnIndex}) has kind '{cell.Kind}' and content: '{cell.Content}'.");
    }
}

Execute a sua aplicação

Depois de adicionar um exemplo de código à sua aplicação, escolha o botão verde Start ao lado de formRecognizer_quickstart para construir e executar o seu programa, ou pressione F5.

Captura de ecrã de executar o teu programa Visual Studio.

Modelo pré-construído

Analise e extraia campos comuns de tipos específicos de documentos usando um modelo pré-construído. Neste exemplo, analisamos uma fatura usando o modelo de fatura pré-construída .

Dica

Não está limitado a faturas — existem vários modelos pré-definidos para escolher, cada um com o seu próprio conjunto de campos suportados. O modelo a utilizar para a analyze operação depende do tipo de documento a analisar. Ver extração de dados do modelo.

  • Analise uma fatura usando o modelo de fatura pré-construída. Pode usar o nosso documento exemplo de fatura para esta introdução rápida.
  • Adicionámos o valor do URI do ficheiro à Uri invoiceUri variável no topo do ficheiro Program.cs.
  • Para analisar um dado ficheiro num URI, use o AnalyzeDocumentAsync método e passe prebuilt-invoice como ID do modelo. O valor devolvido é um AnalyzeResult objeto contendo dados do documento submetido.
  • Para manter a simplicidade, não estão listados aqui todos os pares chave-valor que o serviço devolve. Para ver a lista de todos os campos suportados e tipos correspondentes, consulte a nossa página de conceitos de fatura .

Adicione o seguinte exemplo de código ao seu ficheiro Program.cs. Certifique-se de atualizar as variáveis chave e endpoint com os valores da sua instância de Document Intelligence do portal Azure:


using Azure;
using Azure.AI.DocumentIntelligence;

//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentIntelligenceClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentIntelligenceClient client = new DocumentIntelligenceClient(new Uri(endpoint), credential);

//sample invoice document
Uri invoiceUri = new Uri("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf");

AnalyzeDocumentContent content = new AnalyzeDocumentContent()
{
    UrlSource = invoiceUri
};

Operation<AnalyzeResult> operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-invoice", content);

AnalyzeResult result = operation.Value;

for (int i = 0; i < result.Documents.Count; i++)
{
    Console.WriteLine($"Document {i}:");

    AnalyzedDocument document = result.Documents[i];

    if (document.Fields.TryGetValue("VendorName", out DocumentField vendorNameField)
        && vendorNameField.FieldType == DocumentFieldType.String)
    {
        string vendorName = vendorNameField.ValueString;
        Console.WriteLine($"Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
    }

    if (document.Fields.TryGetValue("CustomerName", out DocumentField customerNameField)
        && customerNameField.FieldType == DocumentFieldType.String)
    {
        string customerName = customerNameField.ValueString;
        Console.WriteLine($"Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
    }

    if (document.Fields.TryGetValue("Items", out DocumentField itemsField)
        && itemsField.FieldType == DocumentFieldType.List)
    {
        foreach (DocumentField itemField in itemsField.ValueList)
        {
            Console.WriteLine("Item:");

            if (itemField.FieldType == DocumentFieldType.Dictionary)
            {
                IReadOnlyDictionary<string, DocumentField> itemFields = itemField.ValueDictionary;

                if (itemFields.TryGetValue("Description", out DocumentField itemDescriptionField)
                    && itemDescriptionField.FieldType == DocumentFieldType.String)
                {
                    string itemDescription = itemDescriptionField.ValueString;
                    Console.WriteLine($"  Description: '{itemDescription}', with confidence {itemDescriptionField.Confidence}");
                }

                if (itemFields.TryGetValue("Amount", out DocumentField itemAmountField)
                    && itemAmountField.FieldType == DocumentFieldType.Currency)
                {
                    CurrencyValue itemAmount = itemAmountField.ValueCurrency;
                    Console.WriteLine($"  Amount: '{itemAmount.CurrencySymbol}{itemAmount.Amount}', with confidence {itemAmountField.Confidence}");
                }
            }
        }
    }

    if (document.Fields.TryGetValue("SubTotal", out DocumentField subTotalField)
        && subTotalField.FieldType == DocumentFieldType.Currency)
    {
        CurrencyValue subTotal = subTotalField.ValueCurrency;
        Console.WriteLine($"Sub Total: '{subTotal.CurrencySymbol}{subTotal.Amount}', with confidence {subTotalField.Confidence}");
    }

    if (document.Fields.TryGetValue("TotalTax", out DocumentField totalTaxField)
        && totalTaxField.FieldType == DocumentFieldType.Currency)
    {
        CurrencyValue totalTax = totalTaxField.ValueCurrency;
        Console.WriteLine($"Total Tax: '{totalTax.CurrencySymbol}{totalTax.Amount}', with confidence {totalTaxField.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}', with confidence {invoiceTotalField.Confidence}");
    }
}

Execute a sua aplicação

Depois de adicionar um exemplo de código à sua aplicação, escolha o botão verde Start ao lado de formRecognizer_quickstart para construir e executar o seu programa, ou pressione F5.

Captura de ecrã do botão de executar o seu programa no Visual Studio.

Adicione o seguinte exemplo de código ao seu ficheiro Program.cs. Certifique-se de atualizar as variáveis chave e endpoint com os valores da sua instância Reconhecedor de Formulários do portal Azure:


using Azure;
using Azure.AI.FormRecognizer.DocumentAnalysis;

//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `FormRecognizerClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

//sample invoice document

Uri invoiceUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf");

Operation operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-invoice", invoiceUri);

AnalyzeResult result = operation.Value;

for (int i = 0; i < result.Documents.Count; i++)
{
    Console.WriteLine($"Document {i}:");

    AnalyzedDocument document = result.Documents[i];

    if (document.Fields.TryGetValue("VendorName", out DocumentField vendorNameField))
    {
        if (vendorNameField.FieldType == DocumentFieldType.String)
        {
            string vendorName = vendorNameField.Value.AsString();
            Console.WriteLine($"Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("CustomerName", out DocumentField customerNameField))
    {
        if (customerNameField.FieldType == DocumentFieldType.String)
        {
            string customerName = customerNameField.Value.AsString();
            Console.WriteLine($"Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("Items", out DocumentField itemsField))
    {
        if (itemsField.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField itemField in itemsField.Value.AsList())
            {
                Console.WriteLine("Item:");

                if (itemField.FieldType == DocumentFieldType.Dictionary)
                {
                    IReadOnlyDictionary<string, DocumentField> itemFields = itemField.Value.AsDictionary();

                    if (itemFields.TryGetValue("Description", out DocumentField itemDescriptionField))
                    {
                        if (itemDescriptionField.FieldType == DocumentFieldType.String)
                        {
                            string itemDescription = itemDescriptionField.Value.AsString();

                            Console.WriteLine($"  Description: '{itemDescription}', with confidence {itemDescriptionField.Confidence}");
                        }
                    }

                    if (itemFields.TryGetValue("Amount", out DocumentField itemAmountField))
                    {
                        if (itemAmountField.FieldType == DocumentFieldType.Currency)
                        {
                            CurrencyValue itemAmount = itemAmountField.Value.AsCurrency();

                            Console.WriteLine($"  Amount: '{itemAmount.Symbol}{itemAmount.Amount}', with confidence {itemAmountField.Confidence}");
                        }
                    }
                }
            }
        }
    }

    if (document.Fields.TryGetValue("SubTotal", out DocumentField subTotalField))
    {
        if (subTotalField.FieldType == DocumentFieldType.Currency)
        {
            CurrencyValue subTotal = subTotalField.Value.AsCurrency();
            Console.WriteLine($"Sub Total: '{subTotal.Symbol}{subTotal.Amount}', with confidence {subTotalField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("TotalTax", out DocumentField totalTaxField))
    {
        if (totalTaxField.FieldType == DocumentFieldType.Currency)
        {
            CurrencyValue totalTax = totalTaxField.Value.AsCurrency();
            Console.WriteLine($"Total Tax: '{totalTax.Symbol}{totalTax.Amount}', with confidence {totalTaxField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("InvoiceTotal", out DocumentField invoiceTotalField))
    {
        if (invoiceTotalField.FieldType == DocumentFieldType.Currency)
        {
            CurrencyValue invoiceTotal = invoiceTotalField.Value.AsCurrency();
            Console.WriteLine($"Invoice Total: '{invoiceTotal.Symbol}{invoiceTotal.Amount}', with confidence {invoiceTotalField.Confidence}");
        }
    }
}

Execute a sua aplicação

Depois de adicionar um exemplo de código à sua aplicação, escolha o botão verde Start ao lado de formRecognizer_quickstart para construir e executar o seu programa, ou pressione F5.

Captura de ecrã da localização do botão para executar o seu programa no Visual Studio.

Saída do modelo pré-construído

Aqui está um excerto do resultado esperado:

  Document 0:
  Vendor Name: 'CONTOSO LTD.', with confidence 0.962
  Customer Name: 'MICROSOFT CORPORATION', with confidence 0.951
  Item:
    Description: 'Test for 23 fields', with confidence 0.899
    Amount: '100', with confidence 0.902
  Sub Total: '100', with confidence 0.979

Para visualizar a saída completa, visite o repositório Azure samples no GitHub para visualizar a saída do modelo de fatura pré-construído.

Adicione o seguinte exemplo de código ao seu ficheiro Program.cs. Certifique-se de atualizar as variáveis chave e endpoint com os valores da sua instância Reconhecedor de Formulários do portal Azure:


using Azure;
using Azure.AI.FormRecognizer.DocumentAnalysis;

//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `FormRecognizerClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

//sample invoice document

Uri invoiceUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf");

AnalyzeDocumentOperation operation = await client.AnalyzeDocumentFromUriAsync(WaitUntil.Completed, "prebuilt-invoice", invoiceUri);

AnalyzeResult result = operation.Value;

for (int i = 0; i < result.Documents.Count; i++)
{
    Console.WriteLine($"Document {i}:");

    AnalyzedDocument document = result.Documents[i];

    if (document.Fields.TryGetValue("VendorName", out DocumentField vendorNameField))
    {
        if (vendorNameField.FieldType == DocumentFieldType.String)
        {
            string vendorName = vendorNameField.Value.AsString();
            Console.WriteLine($"Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("CustomerName", out DocumentField customerNameField))
    {
        if (customerNameField.FieldType == DocumentFieldType.String)
        {
            string customerName = customerNameField.Value.AsString();
            Console.WriteLine($"Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("Items", out DocumentField itemsField))
    {
        if (itemsField.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField itemField in itemsField.Value.AsList())
            {
                Console.WriteLine("Item:");

                if (itemField.FieldType == DocumentFieldType.Dictionary)
                {
                    IReadOnlyDictionary<string, DocumentField> itemFields = itemField.Value.AsDictionary();

                    if (itemFields.TryGetValue("Description", out DocumentField itemDescriptionField))
                    {
                        if (itemDescriptionField.FieldType == DocumentFieldType.String)
                        {
                            string itemDescription = itemDescriptionField.Value.AsString();

                            Console.WriteLine($"  Description: '{itemDescription}', with confidence {itemDescriptionField.Confidence}");
                        }
                    }

                    if (itemFields.TryGetValue("Amount", out DocumentField itemAmountField))
                    {
                        if (itemAmountField.FieldType == DocumentFieldType.Currency)
                        {
                            CurrencyValue itemAmount = itemAmountField.Value.AsCurrency();

                            Console.WriteLine($"  Amount: '{itemAmount.Symbol}{itemAmount.Amount}', with confidence {itemAmountField.Confidence}");
                        }
                    }
                }
            }
        }
    }

    if (document.Fields.TryGetValue("SubTotal", out DocumentField subTotalField))
    {
        if (subTotalField.FieldType == DocumentFieldType.Currency)
        {
            CurrencyValue subTotal = subTotalField.Value.AsCurrency();
            Console.WriteLine($"Sub Total: '{subTotal.Symbol}{subTotal.Amount}', with confidence {subTotalField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("TotalTax", out DocumentField totalTaxField))
    {
        if (totalTaxField.FieldType == DocumentFieldType.Currency)
        {
            CurrencyValue totalTax = totalTaxField.Value.AsCurrency();
            Console.WriteLine($"Total Tax: '{totalTax.Symbol}{totalTax.Amount}', with confidence {totalTaxField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("InvoiceTotal", out DocumentField invoiceTotalField))
    {
        if (invoiceTotalField.FieldType == DocumentFieldType.Currency)
        {
            CurrencyValue invoiceTotal = invoiceTotalField.Value.AsCurrency();
            Console.WriteLine($"Invoice Total: '{invoiceTotal.Symbol}{invoiceTotal.Amount}', with confidence {invoiceTotalField.Confidence}");
        }
    }
}

Execute a sua aplicação

Depois de adicionar um exemplo de código à sua aplicação, escolha o botão verde Start ao lado de formRecognizer_quickstart para construir e executar o seu programa, ou pressione F5.

Captura de ecrã de executar o teu programa Visual Studio.

Neste início rápido, utilize as seguintes funcionalidades para analisar e extrair dados e valores de formulários e documentos:

  • Layout — Analise e extraia tabelas, linhas, palavras e marcas de seleção, como botões de rádio e caixas de seleção em documentos, sem a necessidade de treinar um modelo.

  • Fatura Pronta—Analise e extraia campos comuns de tipos específicos de documentos utilizando um modelo treinado previamente.

Pré-requisitos

  • Azure subscrição - Cria uma gratuitamente.

  • A versão mais recente do Visual Studio Code ou o seu IDE preferido. VejaJava em Visual Studio Code.

    Dica

    • Visual Studio Code oferece um Coding Pack para Java para Windows e macOS. O código pack é um conjunto de VS Code, o Java Development Kit (JDK) e uma coleção de extensões sugeridas por Microsoft. O Coding Pack também pode ser usado para corrigir um ambiente de desenvolvimento existente.
    • Se estiveres a usar o VS Code e o Coding Pack For Java, instala a extensão Gradle para Java.
  • Se não estiver a usar Visual Studio Code, certifique-se de que tem o seguinte instalado no seu ambiente de desenvolvimento:

  • Um recurso de Ferramentas de Fabrico ou Inteligência de Documentos. Depois de ter a sua subscrição do Azure, crie um recurso de Inteligência de Documentos de serviço único ou multi-serviço no portal do Azure, para obter a sua chave e o endpoint. Podes usar o escalão de preços gratuito (F0) para experimentar o serviço, e depois fazer um upgrade para um nível pago para produção.

    Dica

    Crie um recurso Microsoft Foundry se planeia aceder a várias Foundry Tools num único endpoint/chave. Para acesso apenas à Inteligência Documental, crie um recurso de Inteligência Documental. Precisa de um recurso de serviço único se pretende usar autenticação Microsoft Entra.

  • Depois de o seu recurso ser implementado, selecione Ir para o recurso. Precisa da chave e do ponto final do recurso que cria para ligar a sua aplicação à API de Inteligência de Documentos. Mais tarde, colas a tua chave e endpoint no código:

    Captura de ecrã das chaves e localização do endpoint no portal Azure.

Configuração

Criar um novo projeto Gradle

  1. Na janela da consola (como cmd, PowerShell ou Bash), cria um novo diretório para a tua aplicação chamado doc-intel-app e navega até lá.

    mkdir doc-intel-app && doc-intel-app
    
    mkdir doc-intel-app; cd doc-intel-app
    
  2. Executa o gradle init comando a partir do teu diretório de trabalho. Este comando cria ficheiros de compilação essenciais para o Gradle, incluindo build.gradle.kts, que é usado em tempo de execução para criar e configurar a sua aplicação.

    gradle init --type basic
    
  3. Quando solicitado a escolher um DSL, selecione Kotlin.

  4. Aceite o nome padrão do projeto (doc-intel-app) selecionando Return ou Enter.

  1. Na janela da consola (como cmd, PowerShell ou Bash), crie um novo diretório para a sua aplicação chamado form-recognize-app e navegue até lá.

    mkdir form-recognize-app && cd form-recognize-app
    
    mkdir form-recognize-app; cd form-recognize-app
    
  2. Executa o gradle init comando a partir do teu diretório de trabalho. Este comando cria ficheiros de compilação essenciais para o Gradle, incluindo build.gradle.kts, que é usado em tempo de execução para criar e configurar a sua aplicação.

    gradle init --type basic
    
  3. Quando solicitado a escolher um DSL, selecione Kotlin.

  4. Aceite o nome padrão do projeto (form-recognize-app) selecionando Return ou Enter.

Instalar a biblioteca cliente

Este quickstart utiliza o gestor de dependências do Gradle. Pode encontrar a biblioteca cliente e informações para outros gestores de dependências no Repositório Central Maven.

Abre o ficheiro build.gradle.kts do projeto no teu IDE. Copie e cole o código seguinte para incluir a biblioteca do cliente como uma implementation instrução, juntamente com os plugins e configurações necessárias.

   plugins {
       java
       application
   }
   application {
       mainClass.set("DocIntelligence")
   }
   repositories {
       mavenCentral()
   }
   dependencies {
       implementation group: 'com.azure', name: 'azure-ai-documentintelligence', version: '1.0.0'

   }

Este quickstart utiliza o gestor de dependências do Gradle. Pode encontrar a biblioteca cliente e informações para outros gestores de dependências no Repositório Central Maven.

Abre o ficheiro build.gradle.kts do projeto no teu IDE. Copie e cole o código seguinte para incluir a biblioteca do cliente como uma implementation instrução, juntamente com os plugins e definições necessárias.

   plugins {
       java
       application
   }
   application {
       mainClass.set("FormRecognizer")
   }
   repositories {
       mavenCentral()
   }
   dependencies {
       implementation group: 'com.azure', name: 'azure-ai-formrecognizer', version: '4.1.0'

   }

Este quickstart utiliza o gestor de dependências do Gradle. Pode encontrar a biblioteca cliente e informações para outros gestores de dependências no Repositório Central Maven.

Abre o ficheiro build.gradle.kts do projeto no teu IDE. Copie e cole o código seguinte para incluir a biblioteca cliente como uma implementation declaração, juntamente com os plugins e definições necessárias.

   plugins {
       java
       application
   }
   application {
       mainClass.set("FormRecognizer")
   }
   repositories {
       mavenCentral()
   }
   dependencies {
       implementation group: 'com.azure', name: 'azure-ai-formrecognizer', version: '4.0.0'


   }

Criar uma aplicação Java

Para interagir com o serviço de Inteligência Documental, deve criar uma instância da DocumentIntelligenceClient classe. Para isso, cria um AzureKeyCredential com o seu key do portal Azure e uma instância DocumentIntelligenceClient com o AzureKeyCredential e o seu Document Intelligence endpoint.

Para interagir com o serviço de Inteligência Documental, é necessário criar uma instância da DocumentAnalysisClient classe. Para isso, cria um AzureKeyCredential com o seu key no Portal do Azure e uma instância DocumentAnalysisClient com o AzureKeyCredential e o seu Document Intelligence endpoint.

  1. A partir do diretório doc-intel-app, execute o seguinte comando:

    mkdir -p src/main/java
    

    Cria-se a seguinte estrutura de diretórios:

    Captura de ecrã da estrutura de diretórios Java

  1. Navegue até à java pasta e crie um ficheiro chamado DocIntelligence.java.

    Dica

    • Podes criar um novo ficheiro usando o PowerShell.
    • Abre uma janela PowerShell no diretório do teu projeto mantendo pressionada a tecla Shift e clicando com o botão direito na pasta.
    • Digite o seguinte comando New-Item DocIntelligence.java.
  2. Abre o DocIntelligence.java ficheiro. Copie e cole um dos seguintes exemplos de código na sua aplicação:

  1. Navegue até à java pasta e crie um ficheiro chamado FormRecognizer.java.

    Dica

    • Podes criar um novo ficheiro usando o PowerShell.
    • Abre uma janela PowerShell no diretório do teu projeto mantendo pressionada a tecla Shift e clicando com o botão direito na pasta.
    • Digite o seguinte comando New-Item FormRecognizer.java.
  2. Abre o FormRecognizer.java ficheiro. Copie e cole um dos seguintes exemplos de código na sua aplicação:

Importante

Recomendamos a autenticação do Microsoft Entra ID com identidades geridas para recursos do Azure para evitar armazenar credenciais com as suas aplicações que correm na cloud.

Use as chaves API com cautela. Não incluas a chave API diretamente no teu código e nunca a publiques publicamente. Se usar chaves API, guarde-as de forma segura no Azure Key Vault, rode as chaves regularmente e restrinja o acesso ao Azure Key Vault usando controlo de acesso baseado em funções e restrições de acesso à rede. Para obter mais informações sobre o uso seguro das chaves API nas suas aplicações, consulte chaves API com Azure Key Vault.

Para mais informações sobre a segurança dos serviços de IA, consulte Autenticar pedidos para Serviços de IA do Azure.

Modelo de disposição

Extrai texto, marcas de seleção, estilos de texto, estruturas de tabelas e coordenadas de regiões delimitadoras dos documentos.

  • Para este exemplo, vai precisar de um ficheiro de documento numa URI. Pode usar o nosso documento exemplo para este início rápido.
  • Para analisar um dado ficheiro num URI, vais usar o beginAnalyzeDocument método e passar prebuilt-layout como ID do modelo. O valor devolvido é um AnalyzeResult objeto que contém dados sobre o documento submetido.
  • Adicionámos o valor do URI do ficheiro à documentUrl variável no método principal.

Adicione o seguinte exemplo de código ao DocIntelligence.java ficheiro. Certifique-se de atualizar as variáveis chave e endpoint com os valores da sua instância de Document Intelligence do portal Azure:


import com.azure.ai.documentintelligence.DocumentIntelligenceClient;
import com.azure.ai.documentintelligence.DocumentIntelligenceClientBuilder;
import com.azure.ai.documentintelligence.models.AnalyzeDocumentOptions;
import com.azure.ai.documentintelligence.models.AnalyzeOperationDetails;
import com.azure.ai.documentintelligence.models.AnalyzeResult;
import com.azure.ai.documentintelligence.models.DocumentTable;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;

import java.util.List;

public class DocIntelligence {

  // set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
  private static final String endpoint = "<your-endpoint>";
  private static final String key = "<your-key>";

  public static void main(String[] args) {

    // create your `DocumentIntelligenceClient` instance and `AzureKeyCredential` variable
    DocumentIntelligenceClient client = new DocumentIntelligenceClientBuilder()
      .credential(new AzureKeyCredential(key))
      .endpoint(endpoint)
      .buildClient();

    // sample document
    String modelId = "prebuilt-layout";
    String documentUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";

    AnalyzeDocumentOptions options = new AnalyzeDocumentOptions(documentUrl);

    SyncPoller<AnalyzeOperationDetails, AnalyzeResult> analyzeLayoutPoller = client.beginAnalyzeDocument(modelId, options);

    AnalyzeResult analyzeLayoutResult = analyzeLayoutPoller.getFinalResult();

    // pages
    analyzeLayoutResult.getPages().forEach(documentPage -> {
      System.out.printf("Page has width: %.2f and height: %.2f, measured with unit: %s%n",
        documentPage.getWidth(),
        documentPage.getHeight(),
        documentPage.getUnit());

      // lines
      documentPage.getLines().forEach(documentLine ->
        System.out.printf("Line '%s' is within a bounding polygon %s.%n",
          documentLine.getContent(),
          documentLine.getPolygon()));

      // words
      documentPage.getWords().forEach(documentWord ->
        System.out.printf("Word '%s' has a confidence score of %.2f.%n",
          documentWord.getContent(),
          documentWord.getConfidence()));

      // selection marks
      documentPage.getSelectionMarks().forEach(documentSelectionMark ->
        System.out.printf("Selection mark is '%s' and is within a bounding polygon %s with confidence %.2f.%n",
          documentSelectionMark.getState().toString(),
          documentSelectionMark.getPolygon(),
          documentSelectionMark.getConfidence()));
    });

    // tables
    List < DocumentTable > tables = analyzeLayoutResult.getTables();
    for (int i = 0; i < tables.size(); i++) {
      DocumentTable documentTable = tables.get(i);
      System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTable.getRowCount(),
        documentTable.getColumnCount());
      documentTable.getCells().forEach(documentTableCell ->
        System.out.printf("Cell '%s', has row index %d and column index %d.%n", documentTableCell.getContent(),
          documentTableCell.getRowIndex(), documentTableCell.getColumnIndex()));
      System.out.println();
    }

    // styles
    analyzeLayoutResult.getStyles().forEach(documentStyle -> System.out.printf("Document is handwritten %s.%n", documentStyle.isHandwritten()));
  }
}

Construir e executar a aplicação

Depois de adicionar um exemplo de código à sua aplicação, navegue de volta ao diretório principal do seu projeto — doc-intel-app.

  1. Constrói a tua aplicação com o build comando:

    gradle build
    
  2. Execute a sua aplicação com o run comando:

    gradle run
    

Adicione o seguinte exemplo de código ao FormRecognizer.java ficheiro. Certifique-se de atualizar as variáveis chave e endpoint com os valores da sua instância de Document Intelligence do portal Azure:


import com.azure.ai.formrecognizer.documentanalysis.models.*;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClientBuilder;

import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;

import java.io.IOException;
import java.util.List;
import java.util.Arrays;
import java.time.LocalDate;
import java.util.Map;
import java.util.stream.Collectors;

public class FormRecognizer {

  // set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
  private static final String endpoint = "<your-endpoint>";
  private static final String key = "<your-key>";

  public static void main(String[] args) {

    // create your `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
    DocumentAnalysisClient client = new DocumentAnalysisClientBuilder()
      .credential(new AzureKeyCredential(key))
      .endpoint(endpoint)
      .buildClient();

    // sample document
    String documentUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
    String modelId = "prebuilt-layout";

    SyncPoller < OperationResult, AnalyzeResult > analyzeLayoutResultPoller =
      client.beginAnalyzeDocumentFromUrl(modelId, documentUrl);

    AnalyzeResult analyzeLayoutResult = analyzeLayoutResultPoller.getFinalResult();

    // pages
    analyzeLayoutResult.getPages().forEach(documentPage -> {
      System.out.printf("Page has width: %.2f and height: %.2f, measured with unit: %s%n",
        documentPage.getWidth(),
        documentPage.getHeight(),
        documentPage.getUnit());

      // lines
      documentPage.getLines().forEach(documentLine ->
        System.out.printf("Line %s is within a bounding polygon %s.%n",
          documentLine.getContent(),
          documentLine.getPolygon().toString()));

      // words
      documentPage.getWords().forEach(documentWord ->
        System.out.printf("Word '%s' has a confidence score of %.2f%n",
          documentWord.getContent(),
          documentWord.getConfidence()));

      // selection marks
      documentPage.getSelectionMarks().forEach(documentSelectionMark ->
        System.out.printf("Selection mark is %s and is within a bounding polygon %s with confidence %.2f.%n",
          documentSelectionMark.getState().toString(),
          documentSelectionMark.getPolygon().toString(),
          documentSelectionMark.getConfidence()));
    });

    // tables
    List < DocumentTable > tables = analyzeLayoutResult.getTables();
    for (int i = 0; i < tables.size(); i++) {
      DocumentTable documentTable = tables.get(i);
      System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTable.getRowCount(),
        documentTable.getColumnCount());
      documentTable.getCells().forEach(documentTableCell -> {
        System.out.printf("Cell '%s', has row index %d and column index %d.%n", documentTableCell.getContent(),
          documentTableCell.getRowIndex(), documentTableCell.getColumnIndex());
      });
      System.out.println();
    }
  }
  // Utility function to get the bounding polygon coordinates
  private static String getBoundingCoordinates(List < Point > Polygon) {
    return Polygon.stream().map(point -> String.format("[%.2f, %.2f]", point.getX(),
      point.getY())).collect(Collectors.joining(", "));
  }
}

Construir e executar a aplicação

Depois de adicionar um exemplo de código à sua aplicação, volte ao diretório principal do seu projeto — form-recognize-app.

  1. Constrói a tua aplicação com o build comando:

    gradle build
    
  2. Execute a sua aplicação com o run comando:

    gradle run
    

Saída do modelo de layout

Aqui está um excerto do resultado esperado:

  Table 0 has 5 rows and 3 columns.
  Cell 'Title of each class', has row index 0 and column index 0.
  Cell 'Trading Symbol', has row index 0 and column index 1.
  Cell 'Name of exchange on which registered', has row index 0 and column index 2.
  Cell 'Common stock, $0.00000625 par value per share', has row index 1 and column index 0.
  Cell 'MSFT', has row index 1 and column index 1.
  Cell 'NASDAQ', has row index 1 and column index 2.
  Cell '2.125% Notes due 2021', has row index 2 and column index 0.
  Cell 'MSFT', has row index 2 and column index 1.
  Cell 'NASDAQ', has row index 2 and column index 2.
  Cell '3.125% Notes due 2028', has row index 3 and column index 0.
  Cell 'MSFT', has row index 3 and column index 1.
  Cell 'NASDAQ', has row index 3 and column index 2.
  Cell '2.625% Notes due 2033', has row index 4 and column index 0.
  Cell 'MSFT', has row index 4 and column index 1.
  Cell 'NASDAQ', has row index 4 and column index 2.

Para visualizar a saída completa, visite o repositório de Azure samples no GitHub para visualizar a saída do modelo layout.

Adicione o seguinte exemplo de código ao FormRecognizer.java ficheiro. Certifique-se de atualizar as variáveis chave e endpoint com os valores da sua instância de Document Intelligence do portal Azure:


import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClientBuilder;
import com.azure.ai.formrecognizer.documentanalysis.models.AnalyzeResult;
import com.azure.ai.formrecognizer.documentanalysis.models.OperationResult;
import com.azure.ai.formrecognizer.documentanalysis.models.DocumentTable;
import com.azure.ai.formrecognizer.documentanalysis.models.Point;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;

import java.util.List;
import java.util.stream.Collectors;

public class FormRecognizer {

  // set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
  private static final String endpoint = "<your-endpoint>";
  private static final String key = "<your-key>";

  public static void main(String[] args) {

    // create your `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
    DocumentAnalysisClient client = new DocumentAnalysisClientBuilder()
      .credential(new AzureKeyCredential(key))
      .endpoint(endpoint)
      .buildClient();

    // sample document
    String documentUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
    String modelId = "prebuilt-layout";

    SyncPoller < OperationResult, AnalyzeResult > analyzeLayoutPoller =
      client.beginAnalyzeDocumentFromUrl(modelId, documentUrl);

    AnalyzeResult analyzeLayoutResult = analyzeLayoutPoller.getFinalResult();

    // pages
    analyzeLayoutResult.getPages().forEach(documentPage -> {
      System.out.printf("Page has width: %.2f and height: %.2f, measured with unit: %s%n",
        documentPage.getWidth(),
        documentPage.getHeight(),
        documentPage.getUnit());

      // lines
      documentPage.getLines().forEach(documentLine ->
        System.out.printf("Line '%s' is within a bounding polygon %s.%n",
          documentLine.getContent(),
          getBoundingCoordinates(documentLine.getPolygon())));

      // words
      documentPage.getWords().forEach(documentWord ->
        System.out.printf("Word '%s' has a confidence score of %.2f.%n",
          documentWord.getContent(),
          documentWord.getConfidence()));

      // selection marks
      documentPage.getSelectionMarks().forEach(documentSelectionMark ->
        System.out.printf("Selection mark is '%s' and is within a bounding polygon %s with confidence %.2f.%n",
          documentSelectionMark.getSelectionMarkState().toString(),
          getBoundingCoordinates(documentSelectionMark.getPolygon()),
          documentSelectionMark.getConfidence()));
    });

    // tables
    List < DocumentTable > tables = analyzeLayoutResult.getTables();
    for (int i = 0; i < tables.size(); i++) {
      DocumentTable documentTable = tables.get(i);
      System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTable.getRowCount(),
        documentTable.getColumnCount());
      documentTable.getCells().forEach(documentTableCell -> {
        System.out.printf("Cell '%s', has row index %d and column index %d.%n", documentTableCell.getContent(),
          documentTableCell.getRowIndex(), documentTableCell.getColumnIndex());
      });
      System.out.println();
    }

    // styles
    analyzeLayoutResult.getStyles().forEach(documentStyle -
      > System.out.printf("Document is handwritten %s.%n", documentStyle.isHandwritten()));
  }

  /**
   * Utility function to get the bounding polygon coordinates.
   */
  private static String getBoundingCoordinates(List < Point > Polygon) {
    return Polygon.stream().map(point -> String.format("[%.2f, %.2f]", point.getX(),
      point.getY())).collect(Collectors.joining(", "));
  }
}

Construir e executar a aplicação

Depois de adicionar um exemplo de código à sua aplicação, volte ao diretório principal do seu projeto — form-recognize-app.

  1. Constrói a tua aplicação com o build comando:

    gradle build
    
  2. Execute a sua aplicação com o run comando:

    gradle run
    

Modelo pré-construído

Analise e extraia campos comuns de tipos específicos de documentos usando um modelo pré-construído. Neste exemplo, analisamos uma fatura usando o modelo de fatura pré-construída .

Dica

Não está limitado a faturas — existem vários modelos pré-definidos para escolher, cada um com o seu próprio conjunto de campos suportados. O modelo a utilizar para a analyze operação depende do tipo de documento a analisar. Ver extração de dados do modelo.

  • Analise uma fatura usando o modelo de fatura pré-construída. Pode usar o nosso documento exemplo de fatura para esta introdução rápida.
  • Adicionámos o valor do URL do ficheiro à invoiceUrl variável no topo do ficheiro.
  • Para analisar um dado ficheiro num URI, vais usar o beginAnalyzeDocuments método e passar PrebuiltModels.Invoice como ID do modelo. O valor devolvido é um result objeto que contém dados sobre o documento submetido.
  • Para manter a simplicidade, não estão listados aqui todos os pares chave-valor que o serviço devolve. Para ver a lista de todos os campos suportados e tipos correspondentes, consulte a nossa página de conceitos de fatura .

Adicione o seguinte exemplo de código ao DocIntelligence.java ficheiro. Certifique-se de atualizar as variáveis chave e endpoint com os valores da sua instância de Document Intelligence do portal Azure:


import com.azure.ai.documentintelligence.DocumentIntelligenceClient;
import com.azure.ai.documentintelligence.DocumentIntelligenceClientBuilder;
import com.azure.ai.documentintelligence.models.AnalyzeDocumentOptions;
import com.azure.ai.documentintelligence.models.AnalyzeOperationDetails;
import com.azure.ai.documentintelligence.models.AnalyzeResult;
import com.azure.ai.documentintelligence.models.AnalyzedDocument;
import com.azure.ai.documentintelligence.models.DocumentField;
import com.azure.ai.documentintelligence.models.DocumentFieldType;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

public class DocIntelligence {

  // set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
  private static final String endpoint = "<your-endpoint>";
  private static final String key = "<your-key>";

  public static void main(String[] args) {

    // create your `DocumentIntelligenceClient` instance and `AzureKeyCredential` variable
    DocumentIntelligenceClient client = new DocumentIntelligenceClientBuilder()
      .credential(new AzureKeyCredential(key))
      .endpoint(endpoint)
      .buildClient();

    // sample document
    String modelId = "prebuilt-invoice";
    String invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";

    SyncPoller<AnalyzeOperationDetails, AnalyzeResult> analyzeInvoicesPoller =
      client.beginAnalyzeDocument(modelId, new AnalyzeDocumentOptions(invoiceUrl));

    AnalyzeResult analyzeInvoiceResult = analyzeInvoicesPoller.getFinalResult();

    for (int i = 0; i < analyzeInvoiceResult.getDocuments().size(); i++) {
      AnalyzedDocument analyzedInvoice = analyzeInvoiceResult.getDocuments().get(i);
      Map<String, DocumentField> invoiceFields = analyzedInvoice.getFields();
      System.out.printf("----------- Analyzing invoice  %d -----------%n", i);
      DocumentField vendorNameField = invoiceFields.get("VendorName");
      if (vendorNameField != null) {
        if (DocumentFieldType.STRING == vendorNameField.getType()) {
          String merchantName = vendorNameField.getValueAsString();
          System.out.printf("Vendor Name: %s, confidence: %.2f%n",
            merchantName, vendorNameField.getConfidence());
        }
      }

      DocumentField vendorAddressField = invoiceFields.get("VendorAddress");
      if (vendorAddressField != null) {
        if (DocumentFieldType.STRING == vendorAddressField.getType()) {
          String merchantAddress = vendorAddressField.getValueAsString();
          System.out.printf("Vendor address: %s, confidence: %.2f%n",
            merchantAddress, vendorAddressField.getConfidence());
        }
      }

      DocumentField customerNameField = invoiceFields.get("CustomerName");
      if (customerNameField != null) {
        if (DocumentFieldType.STRING == customerNameField.getType()) {
          String merchantAddress = customerNameField.getValueAsString();
          System.out.printf("Customer Name: %s, confidence: %.2f%n",
            merchantAddress, customerNameField.getConfidence());
        }
      }

      DocumentField customerAddressRecipientField = invoiceFields.get("CustomerAddressRecipient");
      if (customerAddressRecipientField != null) {
        if (DocumentFieldType.STRING == customerAddressRecipientField.getType()) {
          String customerAddr = customerAddressRecipientField.getValueAsString();
          System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n",
            customerAddr, customerAddressRecipientField.getConfidence());
        }
      }

      DocumentField invoiceIdField = invoiceFields.get("InvoiceId");
      if (invoiceIdField != null) {
        if (DocumentFieldType.STRING == invoiceIdField.getType()) {
          String invoiceId = invoiceIdField.getValueAsString();
          System.out.printf("Invoice ID: %s, confidence: %.2f%n",
            invoiceId, invoiceIdField.getConfidence());
        }
      }

      DocumentField invoiceDateField = invoiceFields.get("InvoiceDate");
      if (invoiceDateField != null) {
        if (DocumentFieldType.DATE == invoiceDateField.getType()) {
          LocalDate invoiceDate = invoiceDateField.getValueAsDate();
          System.out.printf("Invoice Date: %s, confidence: %.2f%n",
            invoiceDate, invoiceDateField.getConfidence());
        }
      }

      DocumentField invoiceTotalField = invoiceFields.get("InvoiceTotal");
      if (invoiceTotalField != null) {
        if (DocumentFieldType.DOUBLE == invoiceTotalField.getType()) {
          Double invoiceTotal = invoiceTotalField.getValueAsDouble();
          System.out.printf("Invoice Total: %.2f, confidence: %.2f%n",
            invoiceTotal, invoiceTotalField.getConfidence());
        }
      }

      DocumentField invoiceItemsField = invoiceFields.get("Items");
      if (invoiceItemsField != null) {
        System.out.printf("Invoice Items: %n");
        if (DocumentFieldType.LIST == invoiceItemsField.getType()) {
          List<DocumentField> invoiceItems = invoiceItemsField.getValueAsList();
          invoiceItems.stream()
            .filter(invoiceItem -> DocumentFieldType.MAP == invoiceItem.getType())
            .map(documentField -> documentField.getValueAsMap())
            .forEach(documentFieldMap -> documentFieldMap.forEach((key, documentField) -> {

              // See a full list of fields found on an invoice here:
              // https://aka.ms/documentintelligence/invoicefields

              if ("Description".equals(key)) {
                if (DocumentFieldType.STRING == documentField.getType()) {
                  String name = documentField.getValueAsString();
                  System.out.printf("Description: %s, confidence: %.2fs%n",
                    name, documentField.getConfidence());
                }
              }
              if ("Quantity".equals(key)) {
                if (DocumentFieldType.DOUBLE == documentField.getType()) {
                  Double quantity = documentField.getValueAsDouble();
                  System.out.printf("Quantity: %f, confidence: %.2f%n",
                    quantity, documentField.getConfidence());
                }
              }
              if ("UnitPrice".equals(key)) {
                if (DocumentFieldType.DOUBLE == documentField.getType()) {
                  Double unitPrice = documentField.getValueAsDouble();
                  System.out.printf("Unit Price: %f, confidence: %.2f%n",
                    unitPrice, documentField.getConfidence());
                }
              }
              if ("ProductCode".equals(key)) {
                if (DocumentFieldType.DOUBLE == documentField.getType()) {
                  Double productCode = documentField.getValueAsDouble();
                  System.out.printf("Product Code: %f, confidence: %.2f%n",
                    productCode, documentField.getConfidence());
                }
              }
            }));
        }
      }
    }
  }
}

Construir e executar a aplicação

Depois de adicionar um exemplo de código à sua aplicação, navegue de volta ao diretório principal do seu projeto — doc-intel-app.

  1. Constrói a tua aplicação com o build comando:

    gradle build
    
  2. Execute a sua aplicação com o run comando:

    gradle run
    

Adicione o seguinte exemplo de código ao FormRecognizer.java ficheiro. Certifique-se de atualizar as variáveis chave e endpoint com os valores da sua instância de Document Intelligence do portal Azure:


import com.azure.ai.formrecognizer.documentanalysis.models.*;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClientBuilder;

import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;

import java.io.IOException;
import java.util.List;
import java.util.Arrays;
import java.time.LocalDate;
import java.util.Map;
import java.util.stream.Collectors;

public class FormRecognizer {

  // set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
  private static final String endpoint = "<your-endpoint>";
  private static final String key = "<your-key>";

  public static void main(final String[] args) throws IOException {

    // create your `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
    DocumentAnalysisClient client = new DocumentAnalysisClientBuilder()
      .credential(new AzureKeyCredential(key))
      .endpoint(endpoint)
      .buildClient();

    // sample document
    String modelId = "prebuilt-invoice";
    String invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";

    SyncPoller < OperationResult, AnalyzeResult > analyzeInvoicePoller = client.beginAnalyzeDocumentFromUrl(modelId, invoiceUrl);

    AnalyzeResult analyzeInvoiceResult = analyzeInvoicePoller.getFinalResult();

    for (int i = 0; i < analyzeInvoiceResult.getDocuments().size(); i++) {
      AnalyzedDocument analyzedInvoice = analyzeInvoiceResult.getDocuments().get(i);
      Map < String, DocumentField > invoiceFields = analyzedInvoice.getFields();
      System.out.printf("----------- Analyzing invoice  %d -----------%n", i);
      DocumentField vendorNameField = invoiceFields.get("VendorName");
      if (vendorNameField != null) {
        if (DocumentFieldType.STRING == vendorNameField.getType()) {
          String merchantName = vendorNameField.getValueAsString();
          System.out.printf("Vendor Name: %s, confidence: %.2f%n",
            merchantName, vendorNameField.getConfidence());
        }
      }

      DocumentField vendorAddressField = invoiceFields.get("VendorAddress");
      if (vendorAddressField != null) {
        if (DocumentFieldType.STRING == vendorAddressField.getType()) {
          String merchantAddress = vendorAddressField.getValueAsString();
          System.out.printf("Vendor address: %s, confidence: %.2f%n",
            merchantAddress, vendorAddressField.getConfidence());
        }
      }

      DocumentField customerNameField = invoiceFields.get("CustomerName");
      if (customerNameField != null) {
        if (DocumentFieldType.STRING == customerNameField.getType()) {
          String merchantAddress = customerNameField.getValueAsString();
          System.out.printf("Customer Name: %s, confidence: %.2f%n",
            merchantAddress, customerNameField.getConfidence());
        }
      }

      DocumentField customerAddressRecipientField = invoiceFields.get("CustomerAddressRecipient");
      if (customerAddressRecipientField != null) {
        if (DocumentFieldType.STRING == customerAddressRecipientField.getType()) {
          String customerAddr = customerAddressRecipientField.getValueAsString();
          System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n",
            customerAddr, customerAddressRecipientField.getConfidence());
        }
      }

      DocumentField invoiceIdField = invoiceFields.get("InvoiceId");
      if (invoiceIdField != null) {
        if (DocumentFieldType.STRING == invoiceIdField.getType()) {
          String invoiceId = invoiceIdField.getValueAsString();
          System.out.printf("Invoice ID: %s, confidence: %.2f%n",
            invoiceId, invoiceIdField.getConfidence());
        }
      }

      DocumentField invoiceDateField = invoiceFields.get("InvoiceDate");
      if (customerNameField != null) {
        if (DocumentFieldType.DATE == invoiceDateField.getType()) {
          LocalDate invoiceDate = invoiceDateField.getValueAsDate();
          System.out.printf("Invoice Date: %s, confidence: %.2f%n",
            invoiceDate, invoiceDateField.getConfidence());
        }
      }

      DocumentField invoiceTotalField = invoiceFields.get("InvoiceTotal");
      if (customerAddressRecipientField != null) {
        if (DocumentFieldType.DOUBLE == invoiceTotalField.getType()) {
          Double invoiceTotal = invoiceTotalField.getValueAsDouble();
          System.out.printf("Invoice Total: %.2f, confidence: %.2f%n",
            invoiceTotal, invoiceTotalField.getConfidence());
        }
      }

      DocumentField invoiceItemsField = invoiceFields.get("Items");
      if (invoiceItemsField != null) {
        System.out.printf("Invoice Items: %n");
        if (DocumentFieldType.LIST == invoiceItemsField.getType()) {
          List < DocumentField > invoiceItems = invoiceItemsField.getValueAsList();
          invoiceItems.stream()
            .filter(invoiceItem -> DocumentFieldType.MAP == invoiceItem.getType())
            .map(documentField -> documentField.getValueAsMap())
            .forEach(documentFieldMap -> documentFieldMap.forEach((key, documentField) -> {

              // See a full list of fields found on an invoice here:
              // https://aka.ms/formrecognizer/invoicefields

              if ("Description".equals(key)) {
                if (DocumentFieldType.STRING == documentField.getType()) {
                  String name = documentField.getValueAsString();
                  System.out.printf("Description: %s, confidence: %.2fs%n",
                    name, documentField.getConfidence());
                }
              }
              if ("Quantity".equals(key)) {
                if (DocumentFieldType.DOUBLE == documentField.getType()) {
                  Double quantity = documentField.getValueAsDouble();
                  System.out.printf("Quantity: %f, confidence: %.2f%n",
                    quantity, documentField.getConfidence());
                }
              }
              if ("UnitPrice".equals(key)) {
                if (DocumentFieldType.DOUBLE == documentField.getType()) {
                  Double unitPrice = documentField.getValueAsDouble();
                  System.out.printf("Unit Price: %f, confidence: %.2f%n",
                    unitPrice, documentField.getConfidence());
                }
              }
              if ("ProductCode".equals(key)) {
                if (DocumentFieldType.DOUBLE == documentField.getType()) {
                  Double productCode = documentField.getValueAsDouble();
                  System.out.printf("Product Code: %f, confidence: %.2f%n",
                    productCode, documentField.getConfidence());
                }
              }
            }));
        }
      }
    }
  }
}

Construir e executar a aplicação

Depois de adicionar um exemplo de código à sua aplicação, navegue de volta ao diretório principal do seu projeto — doc-intel-app.

  1. Constrói a tua aplicação com o build comando:

    gradle build
    
  2. Execute a sua aplicação com o run comando:

    gradle run
    

Saída do modelo pré-construído

Aqui está um excerto do resultado esperado:

  ----------- Analyzing invoice  0 -----------
  Analyzed document has doc type invoice with confidence : 1.00
  Vendor Name: CONTOSO LTD., confidence: 0.92
  Vendor address: 123 456th St New York, NY, 10001, confidence: 0.91
  Customer Name: MICROSOFT CORPORATION, confidence: 0.84
  Customer Address Recipient: Microsoft Corp, confidence: 0.92
  Invoice ID: INV-100, confidence: 0.97
  Invoice Date: 2019-11-15, confidence: 0.97

Para visualizar a saída completa, visite o repositório Azure samples no GitHub para visualizar a saída do modelo de fatura pré-construído.

Adicione o seguinte exemplo de código ao FormRecognizer.java ficheiro. Certifique-se de atualizar as variáveis chave e endpoint com os valores da sua instância de Document Intelligence do portal Azure:


import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClientBuilder;
import com.azure.ai.formrecognizer.documentanalysis.models.AnalyzeResult;
import com.azure.ai.formrecognizer.documentanalysis.models.AnalyzedDocument;
import com.azure.ai.formrecognizer.documentanalysis.models.DocumentField;
import com.azure.ai.formrecognizer.documentanalysis.models.DocumentFieldType;
import com.azure.ai.formrecognizer.documentanalysis.models.OperationResult;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;

import java.io.IOException;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;

public class FormRecognizer {

  // set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
  private static final String endpoint = "<your-endpoint>";
  private static final String key = "<your-key>";

  public static void main(String[] args) {

    // create your `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
    DocumentAnalysisClient client = new DocumentAnalysisClientBuilder()
      .credential(new AzureKeyCredential(key))
      .endpoint(endpoint)
      .buildClient();

    // sample document
    String modelId = "prebuilt-invoice";
    String invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";

    SyncPoller < OperationResult, AnalyzeResult > analyzeInvoicePoller = client.beginAnalyzeDocumentFromUrl(modelId, invoiceUrl);

    AnalyzeResult analyzeInvoiceResult = analyzeInvoicePoller.getFinalResult();

    for (int i = 0; i < analyzeInvoiceResult.getDocuments().size(); i++) {
      AnalyzedDocument analyzedInvoice = analyzeInvoiceResult.getDocuments().get(i);
      Map < String, DocumentField > invoiceFields = analyzedInvoice.getFields();
      System.out.printf("----------- Analyzing invoice  %d -----------%n", i);
      DocumentField vendorNameField = invoiceFields.get("VendorName");
      if (vendorNameField != null) {
        if (DocumentFieldType.STRING == vendorNameField.getType()) {
          String merchantName = vendorNameField.getValueAsString();
          System.out.printf("Vendor Name: %s, confidence: %.2f%n",
            merchantName, vendorNameField.getConfidence());
        }
      }

      DocumentField vendorAddressField = invoiceFields.get("VendorAddress");
      if (vendorAddressField != null) {
        if (DocumentFieldType.STRING == vendorAddressField.getType()) {
          String merchantAddress = vendorAddressField.getValueAsString();
          System.out.printf("Vendor address: %s, confidence: %.2f%n",
            merchantAddress, vendorAddressField.getConfidence());
        }
      }

      DocumentField customerNameField = invoiceFields.get("CustomerName");
      if (customerNameField != null) {
        if (DocumentFieldType.STRING == customerNameField.getType()) {
          String merchantAddress = customerNameField.getValueAsString();
          System.out.printf("Customer Name: %s, confidence: %.2f%n",
            merchantAddress, customerNameField.getConfidence());
        }
      }

      DocumentField customerAddressRecipientField = invoiceFields.get("CustomerAddressRecipient");
      if (customerAddressRecipientField != null) {
        if (DocumentFieldType.STRING == customerAddressRecipientField.getType()) {
          String customerAddr = customerAddressRecipientField.getValueAsString();
          System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n",
            customerAddr, customerAddressRecipientField.getConfidence());
        }
      }

      DocumentField invoiceIdField = invoiceFields.get("InvoiceId");
      if (invoiceIdField != null) {
        if (DocumentFieldType.STRING == invoiceIdField.getType()) {
          String invoiceId = invoiceIdField.getValueAsString();
          System.out.printf("Invoice ID: %s, confidence: %.2f%n",
            invoiceId, invoiceIdField.getConfidence());
        }
      }

      DocumentField invoiceDateField = invoiceFields.get("InvoiceDate");
      if (customerNameField != null) {
        if (DocumentFieldType.DATE == invoiceDateField.getType()) {
          LocalDate invoiceDate = invoiceDateField.getValueAsDate();
          System.out.printf("Invoice Date: %s, confidence: %.2f%n",
            invoiceDate, invoiceDateField.getConfidence());
        }
      }

      DocumentField invoiceTotalField = invoiceFields.get("InvoiceTotal");
      if (customerAddressRecipientField != null) {
        if (DocumentFieldType.DOUBLE == invoiceTotalField.getType()) {
          Double invoiceTotal = invoiceTotalField.getValueAsDouble();
          System.out.printf("Invoice Total: %.2f, confidence: %.2f%n",
            invoiceTotal, invoiceTotalField.getConfidence());
        }
      }

      DocumentField invoiceItemsField = invoiceFields.get("Items");
      if (invoiceItemsField != null) {
        System.out.printf("Invoice Items: %n");
        if (DocumentFieldType.LIST == invoiceItemsField.getType()) {
          List < DocumentField > invoiceItems = invoiceItemsField.getValueAsList();
          invoiceItems.stream()
            .filter(invoiceItem -> DocumentFieldType.MAP == invoiceItem.getType())
            .map(documentField -> documentField.getValueAsMap())
            .forEach(documentFieldMap -> documentFieldMap.forEach((key, documentField) -> {

              // See a full list of fields found on an invoice here:
              // https://aka.ms/formrecognizer/invoicefields

              if ("Description".equals(key)) {
                if (DocumentFieldType.STRING == documentField.getType()) {
                  String name = documentField.getValueAsString();
                  System.out.printf("Description: %s, confidence: %.2fs%n",
                    name, documentField.getConfidence());
                }
              }
              if ("Quantity".equals(key)) {
                if (DocumentFieldType.DOUBLE == documentField.getType()) {
                  Double quantity = documentField.getValueAsDouble();
                  System.out.printf("Quantity: %f, confidence: %.2f%n",
                    quantity, documentField.getConfidence());
                }
              }
              if ("UnitPrice".equals(key)) {
                if (DocumentFieldType.DOUBLE == documentField.getType()) {
                  Double unitPrice = documentField.getValueAsDouble();
                  System.out.printf("Unit Price: %f, confidence: %.2f%n",
                    unitPrice, documentField.getConfidence());
                }
              }
              if ("ProductCode".equals(key)) {
                if (DocumentFieldType.DOUBLE == documentField.getType()) {
                  Double productCode = documentField.getValueAsDouble();
                  System.out.printf("Product Code: %f, confidence: %.2f%n",
                    productCode, documentField.getConfidence());
                }
              }
            }));
        }
      }
    }
  }
}

Construir e executar a aplicação

Depois de adicionar um exemplo de código à sua aplicação, navegue de volta ao diretório principal do seu projeto — doc-intel-app.

  1. Constrói a tua aplicação com o build comando:

    gradle build
    
  2. Execute a sua aplicação com o run comando:

    gradle run
    

Neste início rápido, utilize as seguintes funcionalidades para analisar e extrair dados e valores de formulários e documentos:

  • Layout — Analise e extraia tabelas, linhas, palavras e marcas de seleção, como botões de rádio e caixas de seleção em documentos, sem a necessidade de treinar um modelo.

  • Fatura pré-construída — Analise e extraia campos comuns de tipos específicos de documentos utilizando um modelo de fatura pré-treinado.

Pré-requisitos

  • Azure subscrição - Cria uma gratuitamente.

  • A versão mais recente do Visual Studio Code ou o seu IDE preferido. Para mais informações, ver Node.js em Visual Studio Code.

  • A versão mais recente LTS do Node.js.

  • Um recurso de Ferramentas de Fabrico ou Inteligência de Documentos. Depois de ter a sua subscrição do Azure, crie um recurso de Inteligência de Documentos de serviço único ou multi-serviço no portal do Azure, para obter a sua chave e o endpoint. Podes usar o escalão de preços gratuito (F0) para experimentar o serviço, e depois fazer um upgrade para um nível pago para produção.

    Dica

    Crie um recurso Microsoft Foundry se planeia aceder a várias Foundry Tools num único endpoint/chave. Para acesso apenas à Inteligência Documental, crie um recurso de Inteligência Documental. Precisa de um recurso de serviço único se pretende usar autenticação Microsoft Entra.

  • Depois de o seu recurso ser implementado, selecione Ir para o recurso. Precisa da chave e do ponto final do recurso que cria para ligar a sua aplicação à API de Inteligência de Documentos. Colas a tua chave e endpoint no código mais tarde no quickstart:

    Captura de ecrã das chaves e localização do endpoint no portal Azure.

Configuração

  1. Crie uma nova aplicação Node.js Express: Numa janela de consola (como cmd, PowerShell ou Bash), crie e navegue até um novo diretório para a sua aplicação chamado doc-intel-app.

    mkdir doc-intel-app && cd doc-intel-app
    
  2. Executa o comando npm init para inicializar a aplicação e estruturar o teu projeto.

    npm init
    
  3. Especifique os atributos do seu projeto usando os prompts apresentados no terminal.

    • Os atributos mais importantes são nome, número de versão e ponto de entrada.
    • Recomendamos manter o nome do ponto de entrada index.js. A descrição, comando de teste, repositório do GitHub, palavras-chave, autor e informação de licença são atributos opcionais — podem ser ignorados neste projeto.
    • Aceite as sugestões entre parênteses selecionando Voltar ou Entrar.
    • Depois de completares os prompts, será criado um package.json ficheiro no teu diretório doc-intel-app.
  1. Instale a ai-document-intelligence biblioteca cliente e azure/identity os pacotes npm:

    npm i @azure-rest/ai-document-intelligence@1.1.0
    

    O ficheiro package.json da sua aplicação é atualizado com as dependências.

  1. Instale a ai-form-recognizer biblioteca cliente e azure/identity os pacotes npm:

    npm i @azure/ai-form-recognizer@5.0.0 @azure/identity
    
    • O ficheiro package.json da tua aplicação foi atualizado com as dependências.
  1. Instale a ai-form-recognizer biblioteca cliente e azure/identity os pacotes npm:

    npm i @azure/ai-form-recognizer@4.0.0 @azure/identity
    
  1. Crie um ficheiro nomeado index.js no diretório da aplicação.

    Dica

    • Podes criar um novo ficheiro usando o PowerShell.
    • Abre uma janela PowerShell no diretório do teu projeto mantendo pressionada a tecla Shift e clicando com o botão direito na pasta.
    • Digite o seguinte comando New-Item index.js.

Constrói a tua aplicação

Para interagir com o serviço de Inteligência Documental, é necessário criar uma instância da DocumentIntelligenceClient classe. Para isso, cria um AzureKeyCredential com o seu key no Portal do Azure e uma instância DocumentIntelligenceClient com o AzureKeyCredential e o seu Document Intelligence endpoint.

Para interagir com o serviço de Inteligência Documental, é necessário criar uma instância da DocumentAnalysisClient classe. Para isso, crias um AzureKeyCredential com o teu key do portal Azure e uma instância DocumentAnalysisClient com o AzureKeyCredential e o teu Reconhecedor de Formulários endpoint.

  1. Abre o ficheiro index.js no Visual Studio Code ou no teu IDE favorito. Copie e cole um dos seguintes exemplos de código na sua aplicação:

Importante

Recomendamos a autenticação do Microsoft Entra ID com identidades geridas para recursos do Azure para evitar armazenar credenciais com as suas aplicações que correm na cloud.

Use as chaves API com cautela. Não incluas a chave API diretamente no teu código e nunca a publiques publicamente. Se usar chaves API, guarde-as de forma segura no Azure Key Vault, rode as chaves regularmente e restrinja o acesso ao Azure Key Vault usando controlo de acesso baseado em funções e restrições de acesso à rede. Para obter mais informações sobre o uso seguro das chaves API nas suas aplicações, consulte chaves API com Azure Key Vault.

Para mais informações sobre a segurança dos serviços de IA, consulte Autenticar pedidos para Serviços de IA do Azure.

Modelo de disposição

Extrai texto, marcas de seleção, estilos de texto, estruturas de tabelas e coordenadas de regiões delimitadoras dos documentos.

  • Para este exemplo, vai precisar de um ficheiro de documento a partir de uma URL. Pode usar o nosso documento exemplo para este início rápido.
  • Adicionámos o valor da URL do ficheiro à formUrl variável perto do topo do ficheiro.
  • Para analisar um dado ficheiro a partir de uma URL, vais usar o beginAnalyzeDocuments método e passar prebuilt-layout como o ID do modelo.
const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
{ getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");

// set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
const key = "<your-key>";
const endpoint = "<your-endpoint>";

// sample document
const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"

async function main() {
  const client = DocumentIntelligence(endpoint, { key });

  const initialResponse = await client
    .path("/documentModels/{modelId}:analyze", "prebuilt-layout")
    .post({
      contentType: "application/json",
      body: {
        urlSource: formUrl
      },
    });

  if (isUnexpected(initialResponse)) {
    throw initialResponse.body.error;
  }

  const poller = getLongRunningPoller(client, initialResponse);
  const analyzeResult = (await poller.pollUntilDone()).body.analyzeResult;

  const pages = analyzeResult?.pages;
  const tables = analyzeResult?.tables;

  if (pages && pages.length > 0) {
    console.log("Pages:");
    for (const page of pages) {
      console.log("- Page", page.pageNumber, `(unit: ${page.unit})`);
      console.log(`  ${page.width}x${page.height}`);
      console.log(`  ${page.lines?.length || 0} lines, ${page.words?.length || 0} words`);
    }
  } else {
    console.log("No pages were extracted from the document.");
  }

  if (tables && tables.length > 0) {
    console.log("Tables:");
    for (const table of tables) {
      console.log(
        `- Extracted table: ${table.columnCount} columns, ${table.rowCount} rows (${table.cells.length} cells)`
      );
    }
  } else {
    console.log("No tables were extracted from the document.");
  }
}

main().catch((error) => {
  console.error("An error occurred:", error);
  process.exit(1);
});

Execute a sua aplicação

Depois de adicionar um exemplo de código à sua aplicação, execute o seu programa:

  1. Navegue até à pasta onde tem a sua aplicação de Inteligência Documental (doc-intel-app).

  2. Digite o seguinte comando no seu terminal:

    node index.js
    

Adicione o seguinte exemplo de código ao index.js ficheiro. Certifique-se de atualizar as variáveis chave e endpoint com os valores da sua instância de Document Intelligence do portal Azure:


 const { AzureKeyCredential, DocumentAnalysisClient } = require("@azure/ai-form-recognizer");

    // set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
    const key = "<your-key>";
    const endpoint = "<your-endpoint>";

    // sample document
  const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"

  async function main() {
    const client = new DocumentAnalysisClient(endpoint, new AzureKeyCredential(key));

    const poller = await client.beginAnalyzeDocumentFromUrl("prebuilt-layout", formUrl);

    const {
        pages,
        tables
    } = await poller.pollUntilDone();

    if (pages.length <= 0) {
        console.log("No pages were extracted from the document.");
    } else {
        console.log("Pages:");
        for (const page of pages) {
            console.log("- Page", page.pageNumber, `(unit: ${page.unit})`);
            console.log(`  ${page.width}x${page.height}, angle: ${page.angle}`);
            console.log(`  ${page.lines.length} lines, ${page.words.length} words`);
        }
    }

    if (tables.length <= 0) {
        console.log("No tables were extracted from the document.");
    } else {
        console.log("Tables:");
        for (const table of tables) {
            console.log(
                `- Extracted table: ${table.columnCount} columns, ${table.rowCount} rows (${table.cells.length} cells)`
            );
        }
    }
}

main().catch((error) => {
    console.error("An error occurred:", error);
    process.exit(1);
});

Execute a sua aplicação

Depois de adicionar um exemplo de código à sua aplicação, execute o seu programa:

  1. Navegue até à pasta onde tem a sua aplicação de Inteligência Documental (doc-intel-app).

  2. Digite o seguinte comando no seu terminal:

    node index.js
    

Saída do modelo de layout

Aqui está um excerto do resultado esperado:

Pages:
- Page 1 (unit: inch)
  8.5x11, angle: 0
  69 lines, 425 words
Tables:
- Extracted table: 3 columns, 5 rows (15 cells)

Para visualizar a saída completa, visite o repositório de Azure samples no GitHub para visualizar a saída do modelo layout.

Modelo pré-construído

Neste exemplo, analisamos uma fatura usando o modelo de fatura pré-construída .

Dica

Não está limitado a faturas — existem vários modelos pré-definidos para escolher, cada um com o seu próprio conjunto de campos suportados. O modelo a utilizar para a analyze operação depende do tipo de documento a analisar. Ver extração de dados do modelo.

  • Analise uma fatura usando o modelo de fatura pré-construída. Pode usar o nosso documento exemplo de fatura para esta introdução rápida.
  • Adicionámos o valor do URL do ficheiro à invoiceUrl variável no topo do ficheiro.
  • Para analisar um dado ficheiro num URI, vais usar o beginAnalyzeDocuments método e passar PrebuiltModels.Invoice como ID do modelo. O valor devolvido é um result objeto que contém dados sobre o documento submetido.
  • Para manter a simplicidade, não estão listados aqui todos os pares chave-valor que o serviço devolve. Para ver a lista de todos os campos suportados e tipos correspondentes, consulte a nossa página de conceitos de fatura .
const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
{ getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");

// set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
const key = "<your-key>";
const endpoint = "<your-endpoint>";

// sample document
const invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"

async function main() {
  const client = DocumentIntelligence(endpoint, { key });

  const initialResponse = await client
    .path("/documentModels/{modelId}:analyze", "prebuilt-invoice")
    .post({
      contentType: "application/json",
      body: {
        urlSource: invoiceUrl,
      },
    });

  if (isUnexpected(initialResponse)) {
    throw initialResponse.body.error;
  }

  const poller = getLongRunningPoller(client, initialResponse);
  const analyzeResult = (await poller.pollUntilDone()).body.analyzeResult;

  const documents = analyzeResult?.documents;

  const invoice = documents && documents[0];
  if (!invoice) {
    throw new Error("Expected at least one invoice in the result.");
  }

  console.log(
    "Extracted invoice:",
    invoice.docType,
    `(confidence: ${invoice.confidence || "<undefined>"})`
  );
  console.log("Fields:", invoice.fields);
}

main().catch((error) => {
  console.error("An error occurred:", error);
  process.exit(1);
});

Execute a sua aplicação

Depois de adicionar um exemplo de código à sua aplicação, execute o seu programa:

  1. Navegue até à pasta onde tem a sua aplicação de Inteligência Documental (doc-intel-app).

  2. Digite o seguinte comando no seu terminal:

    node index.js
    

 const {
    AzureKeyCredential,
    DocumentAnalysisClient
} = require("@azure/ai-form-recognizer");

// set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
const key = "<your-key>";
const endpoint = "<your-endpoint>";
// sample document
invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"

async function main() {
    const client = new DocumentAnalysisClient(endpoint, new AzureKeyCredential(key));

    const poller = await client.beginAnalyzeDocumentFromUrl("prebuilt-invoice", invoiceUrl);

    const {
        pages,
        tables
    } = await poller.pollUntilDone();

    if (pages.length <= 0) {
        console.log("No pages were extracted from the document.");
    } else {
        console.log("Pages:");
        for (const page of pages) {
            console.log("- Page", page.pageNumber, `(unit: ${page.unit})`);
            console.log(`  ${page.width}x${page.height}, angle: ${page.angle}`);
            console.log(`  ${page.lines.length} lines, ${page.words.length} words`);

            if (page.lines && page.lines.length > 0) {
                console.log("  Lines:");

                for (const line of page.lines) {
                    console.log(`  - "${line.content}"`);

                    // The words of the line can also be iterated independently. The words are computed based on their
                    // corresponding spans.
                    for (const word of line.words()) {
                        console.log(`    - "${word.content}"`);
                    }
                }
            }
        }
    }

    if (tables.length <= 0) {
        console.log("No tables were extracted from the document.");
    } else {
        console.log("Tables:");
        for (const table of tables) {
            console.log(
                `- Extracted table: ${table.columnCount} columns, ${table.rowCount} rows (${table.cells.length} cells)`
            );
        }
    }
}

main().catch((error) => {
    console.error("An error occurred:", error);
    process.exit(1);
});

Execute a sua aplicação

Depois de adicionar um exemplo de código à sua aplicação, execute o seu programa:

  1. Navegue até à pasta onde tem a sua aplicação de Inteligência Documental (doc-intel-app).

  2. Digite o seguinte comando no seu terminal:

    node index.js
    

Saída do modelo pré-construído

Aqui está um excerto do resultado esperado:

  Vendor Name: CONTOSO LTD.
  Customer Name: MICROSOFT CORPORATION
  Invoice Date: 2019-11-15T00:00:00.000Z
  Due Date: 2019-12-15T00:00:00.000Z
  Items:
  - <no product code>
    Description: Test for 23 fields
    Quantity: 1
    Date: undefined
    Unit: undefined
    Unit Price: 1
    Tax: undefined
    Amount: 100

Para visualizar a saída completa, visite o repositório Azure samples no GitHub para visualizar a saída do modelo de fatura pré-construído.

const { AzureKeyCredential, DocumentAnalysisClient } = require("@azure/ai-form-recognizer");

  // set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
      const key = "<your-key>";
      const endpoint = "<your-endpoint>";
// sample document
    invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"

async function main() {
    const client = new DocumentAnalysisClient(endpoint, new AzureKeyCredential(key));

    const poller = await client.beginAnalyzeDocument("prebuilt-invoice", invoiceUrl);

    const {
    documents: [document],
  } = await poller.pollUntilDone();


  if (document) {
    const {
      vendorName,
      customerName,
      invoiceDate,
      dueDate,
      items,
      subTotal,
      previousUnpaidBalance,
      totalTax,
      amountDue,
    } = document.fields;

    // The invoice model has many fields. For details, *see* [Invoice model field extraction](../../prebuilt/invoice.md#field-extraction)
    console.log("Vendor Name:", vendorName && vendorName.value);
    console.log("Customer Name:", customerName && customerName.value);
    console.log("Invoice Date:", invoiceDate && invoiceDate.value);
    console.log("Due Date:", dueDate && dueDate.value);

    console.log("Items:");
    for (const item of (items && items.values) || []) {
      const { productCode, description, quantity, date, unit, unitPrice, tax, amount } =
        item.properties;

      console.log("-", (productCode && productCode.value) || "<no product code>");
      console.log("  Description:", description && description.value);
      console.log("  Quantity:", quantity && quantity.value);
      console.log("  Date:", date && date.value);
      console.log("  Unit:", unit && unit.value);
      console.log("  Unit Price:", unitPrice && unitPrice.value);
      console.log("  Tax:", tax && tax.value);
      console.log("  Amount:", amount && amount.value);
    }

    console.log("Subtotal:", subTotal && subTotal.value);
    console.log("Previous Unpaid Balance:", previousUnpaidBalance && previousUnpaidBalance.value);
    console.log("Tax:", totalTax && totalTax.value);
    console.log("Amount Due:", amountDue && amountDue.value);
  } else {
    throw new Error("Expected at least one receipt in the result.");
  }
}


main().catch((error) => {
    console.error("An error occurred:", error);
    process.exit(1);
});

Execute a sua aplicação

Depois de adicionar um exemplo de código à sua aplicação, execute o seu programa:

  1. Navegue até à pasta onde tem a sua aplicação de Inteligência Documental (doc-intel-app).

  2. Digite o seguinte comando no seu terminal:

    node index.js
    

Neste início rápido, utilize as seguintes funcionalidades para analisar e extrair dados de formulários e documentos:

  • Disposição — Analise e extraia tabelas, linhas, palavras e marcas de seleção, como botões de opção e caixas de seleção, e pares chave-valor, sem necessidade de treinar um modelo.

  • Fatura Pronta—Analise e extraia campos comuns de tipos específicos de documentos utilizando um modelo treinado previamente.

Pré-requisitos

  • Azure subscrição - Cria uma gratuitamente.

  • Python 3.7 ou posterior.

    • A sua instalação Python deve incluir pip. Podes verificar se tens pip instalado correndo pip --version na linha de comandos. Obtenha pip instalando a versão mais recente do Python.
  • A versão mais recente do Visual Studio Code ou o seu IDE preferido. Para mais informações, vejaComo Começar com Python em Visual Studio Code.

  • Um recurso de Ferramentas de Fabrico ou Inteligência de Documentos. Depois de ter a sua subscrição do Azure, crie um recurso de Inteligência de Documentos de serviço único ou multi-serviço no portal do Azure, para obter a sua chave e o endpoint. Podes usar o escalão de preços gratuito (F0) para experimentar o serviço, e depois fazer um upgrade para um nível pago para produção.

Dica

Crie um recurso Microsoft Foundry se planeia aceder a várias Foundry Tools num único endpoint/chave. Para acesso apenas à Inteligência Documental, crie um recurso de Inteligência Documental. Precisa de um recurso de serviço único se pretende usar autenticação Microsoft Entra.

  • Depois de o seu recurso ser implementado, selecione Ir para o recurso. Precisa da chave e do ponto final do recurso que cria para ligar a sua aplicação à API de Inteligência de Documentos. Colas a tua chave e endpoint no código mais tarde no quickstart:

    Captura de ecrã das chaves e localização do endpoint no portal Azure.

Configuração

Abra uma janela de terminal no seu ambiente local e instale a biblioteca cliente Azure Document Intelligence no Foundry Tools para Python com pip:

pip install azure-ai-documentintelligence==1.0.2

pip install azure-ai-formrecognizer==3.3.0

pip install azure-ai-formrecognizer==3.2.0b6

Crie a sua aplicação em Python

Para interagir com o serviço de Inteligência Documental, é necessário criar uma instância da DocumentIntelligenceClient classe. Para isso, cria um AzureKeyCredential com o seu key no Portal do Azure e uma instância DocumentIntelligenceClient com o AzureKeyCredential e o seu Document Intelligence endpoint.

  1. Cria um novo ficheiro Python chamado doc_intel_quickstart.py no teu editor ou IDE preferido.

  2. Abra o ficheiro doc_intel_quickstart.py e selecione um dos seguintes exemplos de código para copiar e colar na sua aplicação:

Para interagir com o serviço de Inteligência Documental, é necessário criar uma instância da DocumentAnalysisClient classe. Para isso, cria um AzureKeyCredential com o seu key no Portal do Azure e uma instância DocumentAnalysisClient com o AzureKeyCredential e o seu Document Intelligence endpoint.

  1. Cria um novo ficheiro Python chamado form_recognizer_quickstart.py no teu editor ou IDE preferido.

  2. Abra o ficheiro form_recognizer_quickstart.py e selecione um dos seguintes exemplos de código para copiar e colar na sua aplicação:

Importante

Recomendamos a autenticação do Microsoft Entra ID com identidades geridas para recursos do Azure para evitar armazenar credenciais com as suas aplicações que correm na cloud.

Use as chaves API com cautela. Não incluas a chave API diretamente no teu código e nunca a publiques publicamente. Se usar chaves API, guarde-as de forma segura no Azure Key Vault, rode as chaves regularmente e restrinja o acesso ao Azure Key Vault usando controlo de acesso baseado em funções e restrições de acesso à rede. Para obter mais informações sobre o uso seguro das chaves API nas suas aplicações, consulte chaves API com Azure Key Vault.

Para mais informações sobre a segurança dos serviços de IA, consulte Autenticar pedidos para Serviços de IA do Azure.

Modelo de disposição

Extrai texto, marcas de seleção, estilos de texto, estruturas de tabelas e coordenadas de regiões delimitadoras dos documentos.

  • Para este exemplo, vai precisar de um ficheiro de documento a partir de uma URL. Pode usar o nosso documento exemplo para este início rápido.
  • Adicionámos o valor do URL do ficheiro à formUrl variável na analyze_layout função.

Adicione o seguinte exemplo de código à sua aplicação doc_intel_quickstart.py. Certifique-se de atualizar as variáveis chave e endpoint com os valores da sua instância de Document Intelligence do portal Azure:


# import libraries
import os
from azure.core.credentials import AzureKeyCredential
from azure.ai.documentintelligence import DocumentIntelligenceClient
from azure.ai.documentintelligence.models import AnalyzeResult
from azure.ai.documentintelligence.models import AnalyzeDocumentRequest

# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"

# helper functions

def get_words(page, line):
    result = []
    for word in page.words:
        if _in_span(word, line.spans):
            result.append(word)
    return result


def _in_span(word, spans):
    for span in spans:
        if word.span.offset >= span.offset and (
            word.span.offset + word.span.length
        ) <= (span.offset + span.length):
            return True
    return False


def analyze_layout():
    # sample document
    formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"

    document_intelligence_client = DocumentIntelligenceClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )

    poller = document_intelligence_client.begin_analyze_document(
        "prebuilt-layout", AnalyzeDocumentRequest(url_source=formUrl
    ))

    result: AnalyzeResult = poller.result()

    if result.styles and any([style.is_handwritten for style in result.styles]):
        print("Document contains handwritten content")
    else:
        print("Document does not contain handwritten content")

    for page in result.pages:
        print(f"----Analyzing layout from page #{page.page_number}----")
        print(
            f"Page has width: {page.width} and height: {page.height}, measured with unit: {page.unit}"
        )

        if page.lines:
            for line_idx, line in enumerate(page.lines):
                words = get_words(page, line)
                print(
                    f"...Line # {line_idx} has word count {len(words)} and text '{line.content}' "
                    f"within bounding polygon '{line.polygon}'"
                )

                for word in words:
                    print(
                        f"......Word '{word.content}' has a confidence of {word.confidence}"
                    )

        if page.selection_marks:
            for selection_mark in page.selection_marks:
                print(
                    f"Selection mark is '{selection_mark.state}' within bounding polygon "
                    f"'{selection_mark.polygon}' and has a confidence of {selection_mark.confidence}"
                )

    if result.tables:
        for table_idx, table in enumerate(result.tables):
            print(
                f"Table # {table_idx} has {table.row_count} rows and "
                f"{table.column_count} columns"
            )
            if table.bounding_regions:
                for region in table.bounding_regions:
                    print(
                        f"Table # {table_idx} location on page: {region.page_number} is {region.polygon}"
                    )
            for cell in table.cells:
                print(
                    f"...Cell[{cell.row_index}][{cell.column_index}] has text '{cell.content}'"
                )
                if cell.bounding_regions:
                    for region in cell.bounding_regions:
                        print(
                            f"...content on page {region.page_number} is within bounding polygon '{region.polygon}'"
                        )

    print("----------------------------------------")


if __name__ == "__main__":
    analyze_layout()

Executar a aplicação

Depois de adicionar um exemplo de código à sua aplicação, construa e execute o seu programa:

  1. Navega até à pasta onde tens o ficheiro doc_intel_quickstart.py .

  2. Digite o seguinte comando no seu terminal:

    python doc_intel_quickstart.py
    

Para analisar um dado ficheiro numa URL, use o begin_analyze_document_from_url método e passe prebuilt-layout como ID do modelo. O valor devolvido é um result objeto que contém dados sobre o documento submetido.

Adicione o seguinte exemplo de código à sua form_recognizer_quickstart.py aplicação. Certifique-se de atualizar as variáveis chave e endpoint com os valores da sua instância Reconhecedor de Formulários do portal Azure:


# import libraries
import os
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential

# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"

def format_polygon(polygon):
    if not polygon:
        return "N/A"
    return ", ".join(["[{}, {}]".format(p.x, p.y) for p in polygon])

def analyze_layout():
    # sample document
    formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"

    document_analysis_client = DocumentAnalysisClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )

    poller = document_analysis_client.begin_analyze_document_from_url(
            "prebuilt-layout", formUrl)
    result = poller.result()

    for idx, style in enumerate(result.styles):
        print(
            "Document contains {} content".format(
                "handwritten" if style.is_handwritten else "no handwritten"
            )
        )

    for page in result.pages:
        print("----Analyzing layout from page #{}----".format(page.page_number))
        print(
            "Page has width: {} and height: {}, measured with unit: {}".format(
                page.width, page.height, page.unit
            )
        )

        for line_idx, line in enumerate(page.lines):
            words = line.get_words()
            print(
                "...Line # {} has word count {} and text '{}' within bounding box '{}'".format(
                    line_idx,
                    len(words),
                    line.content,
                    format_polygon(line.polygon),
                )
            )

            for word in words:
                print(
                    "......Word '{}' has a confidence of {}".format(
                        word.content, word.confidence
                    )
                )

        for selection_mark in page.selection_marks:
            print(
                "...Selection mark is '{}' within bounding box '{}' and has a confidence of {}".format(
                    selection_mark.state,
                    format_polygon(selection_mark.polygon),
                    selection_mark.confidence,
                )
            )

    for table_idx, table in enumerate(result.tables):
        print(
            "Table # {} has {} rows and {} columns".format(
                table_idx, table.row_count, table.column_count
            )
        )
        for region in table.bounding_regions:
            print(
                "Table # {} location on page: {} is {}".format(
                    table_idx,
                    region.page_number,
                    format_polygon(region.polygon),
                )
            )
        for cell in table.cells:
            print(
                "...Cell[{}][{}] has content '{}'".format(
                    cell.row_index,
                    cell.column_index,
                    cell.content,
                )
            )
            for region in cell.bounding_regions:
                print(
                    "...content on page {} is within bounding box '{}'".format(
                        region.page_number,
                        format_polygon(region.polygon),
                    )
                )

    print("----------------------------------------")


if __name__ == "__main__":
    analyze_layout()

Executar a aplicação

Depois de adicionar um exemplo de código à sua aplicação, construa e execute o seu programa:

  1. Navega até à pasta onde tens o ficheiro form_recognizer_quickstart.py .

  2. Digite o seguinte comando no seu terminal:

    python form_recognizer_quickstart.py
    

Saída do modelo de layout

Aqui está um excerto do resultado esperado:

  ----Analyzing layout from page #1----
  Page has width: 8.5 and height: 11.0, measured with unit: inch
  ...Line # 0 has word count 2 and text 'UNITED STATES' within bounding box '[3.4915, 0.6828], [5.0116, 0.6828], [5.0116, 0.8265], [3.4915, 0.8265]'
  ......Word 'UNITED' has a confidence of 1.0
  ......Word 'STATES' has a confidence of 1.0
  ...Line # 1 has word count 4 and text 'SECURITIES AND EXCHANGE COMMISSION' within bounding box '[2.1937, 0.9061], [6.297, 0.9061], [6.297, 1.0498], [2.1937, 1.0498]'
  ......Word 'SECURITIES' has a confidence of 1.0
  ......Word 'AND' has a confidence of 1.0
  ......Word 'EXCHANGE' has a confidence of 1.0
  ......Word 'COMMISSION' has a confidence of 1.0
  ...Line # 2 has word count 3 and text 'Washington, D.C. 20549' within bounding box '[3.4629, 1.1179], [5.031, 1.1179], [5.031, 1.2483], [3.4629, 1.2483]'
  ......Word 'Washington,' has a confidence of 1.0
  ......Word 'D.C.' has a confidence of 1.0

Para visualizar a saída completa, visite o repositório de Azure samples no GitHub para visualizar a saída do modelo layout.

Adicione o seguinte exemplo de código à sua form_recognizer_quickstart.py aplicação. Certifique-se de atualizar as variáveis chave e endpoint com os valores da sua instância Reconhecedor de Formulários do portal Azure:


# import libraries
import os
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential

# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"


def analyze_layout():
    # sample document
    formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"

    document_analysis_client = DocumentAnalysisClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )

    poller = document_analysis_client.begin_analyze_document_from_url(
        "prebuilt-layout", formUrl
    )
    result = poller.result()

    for idx, style in enumerate(result.styles):
        print(
            "Document contains {} content".format(
                "handwritten" if style.is_handwritten else "no handwritten"
            )
        )

    for page in result.pages:
        print("----Analyzing layout from page #{}----".format(page.page_number))
        print(
            "Page has width: {} and height: {}, measured with unit: {}".format(
                page.width, page.height, page.unit
            )
        )

        for line_idx, line in enumerate(page.lines):
            words = line.get_words()
            print(
                "...Line # {} has word count {} and text '{}' within bounding polygon '{}'".format(
                    line_idx,
                    len(words),
                    line.content,
                    format_polygon(line.polygon),
                )
            )

            for word in words:
                print(
                    "......Word '{}' has a confidence of {}".format(
                        word.content, word.confidence
                    )
                )

        for selection_mark in page.selection_marks:
            print(
                "...Selection mark is '{}' within bounding polygon '{}' and has a confidence of {}".format(
                    selection_mark.state,
                    format_polygon(selection_mark.polygon),
                    selection_mark.confidence,
                )
            )

    for table_idx, table in enumerate(result.tables):
        print(
            "Table # {} has {} rows and {} columns".format(
                table_idx, table.row_count, table.column_count
            )
        )
        for region in table.bounding_regions:
            print(
                "Table # {} location on page: {} is {}".format(
                    table_idx,
                    region.page_number,
                    format_polygon(region.polygon),
                )
            )
        for cell in table.cells:
            print(
                "...Cell[{}][{}] has content '{}'".format(
                    cell.row_index,
                    cell.column_index,
                    cell.content,
                )
            )
            for region in cell.bounding_regions:
                print(
                    "...content on page {} is within bounding polygon '{}'".format(
                        region.page_number,
                        format_polygon(region.polygon),
                    )
                )

    print("----------------------------------------")


if __name__ == "__main__":
    analyze_layout()


Executar a aplicação

Depois de adicionar um exemplo de código à sua aplicação, construa e execute o seu programa:

  1. Navega até à pasta onde tens o ficheiro form_recognizer_quickstart.py .

  2. Digite o seguinte comando no seu terminal:

    python form_recognizer_quickstart.py
    

Modelo pré-construído

Analise e extraia campos comuns de tipos específicos de documentos usando um modelo pré-construído. Neste exemplo, analisamos uma fatura usando o modelo de fatura pré-construída .

Dica

Não está limitado a faturas — existem vários modelos pré-definidos para escolher, cada um com o seu próprio conjunto de campos suportados. O modelo a utilizar para a analyze operação depende do tipo de documento a analisar. Ver extração de dados do modelo.

  • Analise uma fatura usando o modelo de fatura pré-construída. Pode usar o nosso documento exemplo de fatura para esta introdução rápida.
  • Adicionámos o valor do URL do ficheiro à invoiceUrl variável no topo do ficheiro.
  • Para manter a simplicidade, não estão listados aqui todos os pares chave-valor que o serviço devolve. Para ver a lista de todos os campos suportados e tipos correspondentes, consulte a nossa página de conceitos de fatura .

Adicione o seguinte exemplo de código à sua aplicação doc_intel_quickstart.py. Certifique-se de atualizar as variáveis chave e endpoint com os valores da sua instância de Document Intelligence do portal Azure:


# import libraries
import os
from azure.core.credentials import AzureKeyCredential
from azure.ai.documentintelligence import DocumentIntelligenceClient
from azure.ai.documentintelligence.models import AnalyzeResult
from azure.ai.documentintelligence.models import AnalyzeDocumentRequest



# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"

def analyze_invoice():
    # sample document

    invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"

    document_intelligence_client = DocumentIntelligenceClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )

    poller = document_intelligence_client.begin_analyze_document(
        "prebuilt-invoice", AnalyzeDocumentRequest(url_source=invoiceUrl)
    )
    invoices = poller.result()

    if invoices.documents:
        for idx, invoice in enumerate(invoices.documents):
            print(f"--------Analyzing invoice #{idx + 1}--------")
            vendor_name = invoice.fields.get("VendorName")
            if vendor_name:
                print(
                    f"Vendor Name: {vendor_name.get('content')} has confidence: {vendor_name.get('confidence')}"
                )
            vendor_address = invoice.fields.get("VendorAddress")
            if vendor_address:
                print(
                    f"Vendor Address: {vendor_address.get('content')} has confidence: {vendor_address.get('confidence')}"
                )
            vendor_address_recipient = invoice.fields.get("VendorAddressRecipient")
            if vendor_address_recipient:
                print(
                    f"Vendor Address Recipient: {vendor_address_recipient.get('content')} has confidence: {vendor_address_recipient.get('confidence')}"
                )
            customer_name = invoice.fields.get("CustomerName")
            if customer_name:
                print(
                    f"Customer Name: {customer_name.get('content')} has confidence: {customer_name.get('confidence')}"
                )
            customer_id = invoice.fields.get("CustomerId")
            if customer_id:
                print(
                    f"Customer Id: {customer_id.get('content')} has confidence: {customer_id.get('confidence')}"
                )
            customer_address = invoice.fields.get("CustomerAddress")
            if customer_address:
                print(
                    f"Customer Address: {customer_address.get('content')} has confidence: {customer_address.get('confidence')}"
                )
            customer_address_recipient = invoice.fields.get("CustomerAddressRecipient")
            if customer_address_recipient:
                print(
                    f"Customer Address Recipient: {customer_address_recipient.get('content')} has confidence: {customer_address_recipient.get('confidence')}"
                )
            invoice_id = invoice.fields.get("InvoiceId")
            if invoice_id:
                print(
                    f"Invoice Id: {invoice_id.get('content')} has confidence: {invoice_id.get('confidence')}"
                )
            invoice_date = invoice.fields.get("InvoiceDate")
            if invoice_date:
                print(
                    f"Invoice Date: {invoice_date.get('content')} has confidence: {invoice_date.get('confidence')}"
                )
            invoice_total = invoice.fields.get("InvoiceTotal")
            if invoice_total:
                print(
                    f"Invoice Total: {invoice_total.get('content')} has confidence: {invoice_total.get('confidence')}"
                )
            due_date = invoice.fields.get("DueDate")
            if due_date:
                print(
                    f"Due Date: {due_date.get('content')} has confidence: {due_date.get('confidence')}"
                )
            purchase_order = invoice.fields.get("PurchaseOrder")
            if purchase_order:
                print(
                    f"Purchase Order: {purchase_order.get('content')} has confidence: {purchase_order.get('confidence')}"
                )
            billing_address = invoice.fields.get("BillingAddress")
            if billing_address:
                print(
                    f"Billing Address: {billing_address.get('content')} has confidence: {billing_address.get('confidence')}"
                )
            billing_address_recipient = invoice.fields.get("BillingAddressRecipient")
            if billing_address_recipient:
                print(
                    f"Billing Address Recipient: {billing_address_recipient.get('content')} has confidence: {billing_address_recipient.get('confidence')}"
                )
            shipping_address = invoice.fields.get("ShippingAddress")
            if shipping_address:
                print(
                    f"Shipping Address: {shipping_address.get('content')} has confidence: {shipping_address.get('confidence')}"
                )
            shipping_address_recipient = invoice.fields.get("ShippingAddressRecipient")
            if shipping_address_recipient:
                print(
                    f"Shipping Address Recipient: {shipping_address_recipient.get('content')} has confidence: {shipping_address_recipient.get('confidence')}"
                )
            print("Invoice items:")
            for idx, item in enumerate(invoice.fields.get("Items").get("valueArray")):
                print(f"...Item #{idx + 1}")
                item_description = item.get("valueObject").get("Description")
                if item_description:
                    print(
                        f"......Description: {item_description.get('content')} has confidence: {item_description.get('confidence')}"
                    )
                item_quantity = item.get("valueObject").get("Quantity")
                if item_quantity:
                    print(
                        f"......Quantity: {item_quantity.get('content')} has confidence: {item_quantity.get('confidence')}"
                    )
                unit = item.get("valueObject").get("Unit")
                if unit:
                    print(
                        f"......Unit: {unit.get('content')} has confidence: {unit.get('confidence')}"
                    )
                unit_price = item.get("valueObject").get("UnitPrice")
                if unit_price:
                    unit_price_code = (
                        unit_price.get("valueCurrency").get("currencyCode")
                        if unit_price.get("valueCurrency").get("currencyCode")
                        else ""
                    )
                    print(
                        f"......Unit Price: {unit_price.get('content')}{unit_price_code} has confidence: {unit_price.get('confidence')}"
                    )
                product_code = item.get("valueObject").get("ProductCode")
                if product_code:
                    print(
                        f"......Product Code: {product_code.get('content')} has confidence: {product_code.get('confidence')}"
                    )
                item_date = item.get("valueObject").get("Date")
                if item_date:
                    print(
                        f"......Date: {item_date.get('content')} has confidence: {item_date.get('confidence')}"
                    )
                tax = item.get("valueObject").get("Tax")
                if tax:
                    print(
                        f"......Tax: {tax.get('content')} has confidence: {tax.get('confidence')}"
                    )
                amount = item.get("valueObject").get("Amount")
                if amount:
                    print(
                        f"......Amount: {amount.get('content')} has confidence: {amount.get('confidence')}"
                    )
            subtotal = invoice.fields.get("SubTotal")
            if subtotal:
                print(
                    f"Subtotal: {subtotal.get('content')} has confidence: {subtotal.get('confidence')}"
                )
            total_tax = invoice.fields.get("TotalTax")
            if total_tax:
                print(
                    f"Total Tax: {total_tax.get('content')} has confidence: {total_tax.get('confidence')}"
                )
            previous_unpaid_balance = invoice.fields.get("PreviousUnpaidBalance")
            if previous_unpaid_balance:
                print(
                    f"Previous Unpaid Balance: {previous_unpaid_balance.get('content')} has confidence: {previous_unpaid_balance.get('confidence')}"
                )
            amount_due = invoice.fields.get("AmountDue")
            if amount_due:
                print(
                    f"Amount Due: {amount_due.get('content')} has confidence: {amount_due.get('confidence')}"
                )
            service_start_date = invoice.fields.get("ServiceStartDate")
            if service_start_date:
                print(
                    f"Service Start Date: {service_start_date.get('content')} has confidence: {service_start_date.get('confidence')}"
                )
            service_end_date = invoice.fields.get("ServiceEndDate")
            if service_end_date:
                print(
                    f"Service End Date: {service_end_date.get('content')} has confidence: {service_end_date.get('confidence')}"
                )
            service_address = invoice.fields.get("ServiceAddress")
            if service_address:
                print(
                    f"Service Address: {service_address.get('content')} has confidence: {service_address.get('confidence')}"
                )
            service_address_recipient = invoice.fields.get("ServiceAddressRecipient")
            if service_address_recipient:
                print(
                    f"Service Address Recipient: {service_address_recipient.get('content')} has confidence: {service_address_recipient.get('confidence')}"
                )
            remittance_address = invoice.fields.get("RemittanceAddress")
            if remittance_address:
                print(
                    f"Remittance Address: {remittance_address.get('content')} has confidence: {remittance_address.get('confidence')}"
                )
            remittance_address_recipient = invoice.fields.get(
                "RemittanceAddressRecipient"
            )
            if remittance_address_recipient:
                print(
                    f"Remittance Address Recipient: {remittance_address_recipient.get('content')} has confidence: {remittance_address_recipient.get('confidence')}"
                )

            print("----------------------------------------")


if __name__ == "__main__":
    analyze_invoice()


Executar a aplicação

Depois de adicionar um exemplo de código à sua aplicação, construa e execute o seu programa:

  1. Navega até à pasta onde tens o ficheiro doc_intel_quickstart.py .

  2. Digite o seguinte comando no seu terminal:

    python doc_intel_quickstart.py
    

Para analisar um dado ficheiro num URI, use o begin_analyze_document_from_url método e passe prebuilt-invoice como ID do modelo. O valor devolvido é um result objeto que contém dados sobre o documento submetido.

Adicione o seguinte exemplo de código à sua form_recognizer_quickstart.py aplicação. Certifique-se de atualizar as variáveis chave e endpoint com os valores da sua instância Reconhecedor de Formulários do portal Azure:

# import libraries
import os
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential

# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"


def format_bounding_region(bounding_regions):
    if not bounding_regions:
        return "N/A"
    return ", ".join(
        "Page #{}: {}".format(region.page_number, format_polygon(region.polygon))
        for region in bounding_regions
    )


def format_polygon(polygon):
    if not polygon:
        return "N/A"
    return ", ".join(["[{}, {}]".format(p.x, p.y) for p in polygon])


def analyze_invoice():

    invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"

    document_analysis_client = DocumentAnalysisClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )

    poller = document_analysis_client.begin_analyze_document_from_url(
        "prebuilt-invoice", invoiceUrl
    )
    invoices = poller.result()

    for idx, invoice in enumerate(invoices.documents):
        print("--------Recognizing invoice #{}--------".format(idx + 1))
        vendor_name = invoice.fields.get("VendorName")
        if vendor_name:
            print(
                "Vendor Name: {} has confidence: {}".format(
                    vendor_name.value, vendor_name.confidence
                )
            )
        vendor_address = invoice.fields.get("VendorAddress")
        if vendor_address:
            print(
                "Vendor Address: {} has confidence: {}".format(
                    vendor_address.value, vendor_address.confidence
                )
            )
        vendor_address_recipient = invoice.fields.get("VendorAddressRecipient")
        if vendor_address_recipient:
            print(
                "Vendor Address Recipient: {} has confidence: {}".format(
                    vendor_address_recipient.value, vendor_address_recipient.confidence
                )
            )
        customer_name = invoice.fields.get("CustomerName")
        if customer_name:
            print(
                "Customer Name: {} has confidence: {}".format(
                    customer_name.value, customer_name.confidence
                )
            )
        customer_id = invoice.fields.get("CustomerId")
        if customer_id:
            print(
                "Customer Id: {} has confidence: {}".format(
                    customer_id.value, customer_id.confidence
                )
            )
        customer_address = invoice.fields.get("CustomerAddress")
        if customer_address:
            print(
                "Customer Address: {} has confidence: {}".format(
                    customer_address.value, customer_address.confidence
                )
            )
        customer_address_recipient = invoice.fields.get("CustomerAddressRecipient")
        if customer_address_recipient:
            print(
                "Customer Address Recipient: {} has confidence: {}".format(
                    customer_address_recipient.value,
                    customer_address_recipient.confidence,
                )
            )
        invoice_id = invoice.fields.get("InvoiceId")
        if invoice_id:
            print(
                "Invoice Id: {} has confidence: {}".format(
                    invoice_id.value, invoice_id.confidence
                )
            )
        invoice_date = invoice.fields.get("InvoiceDate")
        if invoice_date:
            print(
                "Invoice Date: {} has confidence: {}".format(
                    invoice_date.value, invoice_date.confidence
                )
            )
        invoice_total = invoice.fields.get("InvoiceTotal")
        if invoice_total:
            print(
                "Invoice Total: {} has confidence: {}".format(
                    invoice_total.value, invoice_total.confidence
                )
            )
        due_date = invoice.fields.get("DueDate")
        if due_date:
            print(
                "Due Date: {} has confidence: {}".format(
                    due_date.value, due_date.confidence
                )
            )
        purchase_order = invoice.fields.get("PurchaseOrder")
        if purchase_order:
            print(
                "Purchase Order: {} has confidence: {}".format(
                    purchase_order.value, purchase_order.confidence
                )
            )
        billing_address = invoice.fields.get("BillingAddress")
        if billing_address:
            print(
                "Billing Address: {} has confidence: {}".format(
                    billing_address.value, billing_address.confidence
                )
            )
        billing_address_recipient = invoice.fields.get("BillingAddressRecipient")
        if billing_address_recipient:
            print(
                "Billing Address Recipient: {} has confidence: {}".format(
                    billing_address_recipient.value,
                    billing_address_recipient.confidence,
                )
            )
        shipping_address = invoice.fields.get("ShippingAddress")
        if shipping_address:
            print(
                "Shipping Address: {} has confidence: {}".format(
                    shipping_address.value, shipping_address.confidence
                )
            )
        shipping_address_recipient = invoice.fields.get("ShippingAddressRecipient")
        if shipping_address_recipient:
            print(
                "Shipping Address Recipient: {} has confidence: {}".format(
                    shipping_address_recipient.value,
                    shipping_address_recipient.confidence,
                )
            )
        print("Invoice items:")
        for idx, item in enumerate(invoice.fields.get("Items").value):
            print("...Item #{}".format(idx + 1))
            item_description = item.value.get("Description")
            if item_description:
                print(
                    "......Description: {} has confidence: {}".format(
                        item_description.value, item_description.confidence
                    )
                )
            item_quantity = item.value.get("Quantity")
            if item_quantity:
                print(
                    "......Quantity: {} has confidence: {}".format(
                        item_quantity.value, item_quantity.confidence
                    )
                )
            unit = item.value.get("Unit")
            if unit:
                print(
                    "......Unit: {} has confidence: {}".format(
                        unit.value, unit.confidence
                    )
                )
            unit_price = item.value.get("UnitPrice")
            if unit_price:
                print(
                    "......Unit Price: {} has confidence: {}".format(
                        unit_price.value, unit_price.confidence
                    )
                )
            product_code = item.value.get("ProductCode")
            if product_code:
                print(
                    "......Product Code: {} has confidence: {}".format(
                        product_code.value, product_code.confidence
                    )
                )
            item_date = item.value.get("Date")
            if item_date:
                print(
                    "......Date: {} has confidence: {}".format(
                        item_date.value, item_date.confidence
                    )
                )
            tax = item.value.get("Tax")
            if tax:
                print(
                    "......Tax: {} has confidence: {}".format(tax.value, tax.confidence)
                )
            amount = item.value.get("Amount")
            if amount:
                print(
                    "......Amount: {} has confidence: {}".format(
                        amount.value, amount.confidence
                    )
                )
        subtotal = invoice.fields.get("SubTotal")
        if subtotal:
            print(
                "Subtotal: {} has confidence: {}".format(
                    subtotal.value, subtotal.confidence
                )
            )
        total_tax = invoice.fields.get("TotalTax")
        if total_tax:
            print(
                "Total Tax: {} has confidence: {}".format(
                    total_tax.value, total_tax.confidence
                )
            )
        previous_unpaid_balance = invoice.fields.get("PreviousUnpaidBalance")
        if previous_unpaid_balance:
            print(
                "Previous Unpaid Balance: {} has confidence: {}".format(
                    previous_unpaid_balance.value, previous_unpaid_balance.confidence
                )
            )
        amount_due = invoice.fields.get("AmountDue")
        if amount_due:
            print(
                "Amount Due: {} has confidence: {}".format(
                    amount_due.value, amount_due.confidence
                )
            )
        service_start_date = invoice.fields.get("ServiceStartDate")
        if service_start_date:
            print(
                "Service Start Date: {} has confidence: {}".format(
                    service_start_date.value, service_start_date.confidence
                )
            )
        service_end_date = invoice.fields.get("ServiceEndDate")
        if service_end_date:
            print(
                "Service End Date: {} has confidence: {}".format(
                    service_end_date.value, service_end_date.confidence
                )
            )
        service_address = invoice.fields.get("ServiceAddress")
        if service_address:
            print(
                "Service Address: {} has confidence: {}".format(
                    service_address.value, service_address.confidence
                )
            )
        service_address_recipient = invoice.fields.get("ServiceAddressRecipient")
        if service_address_recipient:
            print(
                "Service Address Recipient: {} has confidence: {}".format(
                    service_address_recipient.value,
                    service_address_recipient.confidence,
                )
            )
        remittance_address = invoice.fields.get("RemittanceAddress")
        if remittance_address:
            print(
                "Remittance Address: {} has confidence: {}".format(
                    remittance_address.value, remittance_address.confidence
                )
            )
        remittance_address_recipient = invoice.fields.get("RemittanceAddressRecipient")
        if remittance_address_recipient:
            print(
                "Remittance Address Recipient: {} has confidence: {}".format(
                    remittance_address_recipient.value,
                    remittance_address_recipient.confidence,
                )
            )

        print("----------------------------------------")

if __name__ == "__main__":
    analyze_invoice()


Executar a aplicação

Depois de adicionar um exemplo de código à sua aplicação, construa e execute o seu programa:

  1. Navega até à pasta onde tens o ficheiro form_recognizer_quickstart.py .

  2. Digite o seguinte comando no seu terminal:

    python form_recognizer_quickstart.py
    

Saída do modelo pré-construído

Aqui está um excerto do resultado esperado:

  --------Recognizing invoice #1--------
  Vendor Name: CONTOSO LTD. has confidence: 0.919
  Vendor Address: 123 456th St New York, NY, 10001 has confidence: 0.907
  Vendor Address Recipient: Contoso Headquarters has confidence: 0.919
  Customer Name: MICROSOFT CORPORATION has confidence: 0.84
  Customer Id: CID-12345 has confidence: 0.956
  Customer Address: 123 Other St, Redmond WA, 98052 has confidence: 0.909
  Customer Address Recipient: Microsoft Corp has confidence: 0.917
  Invoice Id: INV-100 has confidence: 0.972
  Invoice Date: 2019-11-15 has confidence: 0.971
  Invoice Total: CurrencyValue(amount=110.0, symbol=$) has confidence: 0.97
  Due Date: 2019-12-15 has confidence: 0.973

Para visualizar a saída completa, visite o repositório Azure samples no GitHub para visualizar a saída do modelo de fatura pré-construído.

Adicione o seguinte exemplo de código à sua form_recognizer_quickstart.py aplicação. Certifique-se de atualizar as variáveis chave e endpoint com os valores da sua instância Reconhecedor de Formulários do portal Azure:


# import libraries
import os
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential

# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"


def format_polygon(polygon):
    if not polygon:
        return "N/A"
    return ", ".join(["[{}, {}]".format(p.x, p.y) for p in polygon])


def analyze_layout():
    # sample document
    formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"

    document_analysis_client = DocumentAnalysisClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )

    poller = document_analysis_client.begin_analyze_document_from_url(
        "prebuilt-layout", formUrl
    )
    result = poller.result()

    for idx, style in enumerate(result.styles):
        print(
            "Document contains {} content".format(
                "handwritten" if style.is_handwritten else "no handwritten"
            )
        )


for page in result.pages:
    print("----Analyzing layout from page #{}----".format(page.page_number))
    print(
        "Page has width: {} and height: {}, measured with unit: {}".format(
            page.width, page.height, page.unit
        )
    )

    for line_idx, line in enumerate(page.lines):
        words = line.get_words()
        print(
            "...Line # {} has word count {} and text '{}' within bounding polygon '{}'".format(
                line_idx,
                len(words),
                line.content,
                format_polygon(line.polygon),
            )
        )

        for word in words:
            print(
                "......Word '{}' has a confidence of {}".format(
                    word.content, word.confidence
                )
            )

    for selection_mark in page.selection_marks:
        print(
            "...Selection mark is '{}' within bounding polygon '{}' and has a confidence of {}".format(
                selection_mark.state,
                format_polygon(selection_mark.polygon),
                selection_mark.confidence,
            )
        )

for table_idx, table in enumerate(result.tables):
    print(
        "Table # {} has {} rows and {} columns".format(
            table_idx, table.row_count, table.column_count
        )
    )
    for region in table.bounding_regions:
        print(
            "Table # {} location on page: {} is {}".format(
                table_idx,
                region.page_number,
                format_polygon(region.polygon),
            )
        )
    for cell in table.cells:
        print(
            "...Cell[{}][{}] has content '{}'".format(
                cell.row_index,
                cell.column_index,
                cell.content,
            )
        )
        for region in cell.bounding_regions:
            print(
                "...content on page {} is within bounding polygon '{}'".format(
                    region.page_number,
                    format_polygon(region.polygon),
                )
            )

print("----------------------------------------")


if __name__ == "__main__":
    analyze_layout()


Executar a aplicação

Depois de adicionar um exemplo de código à sua aplicação, construa e execute o seu programa:

  1. Navega até à pasta onde tens o ficheiro form_recognizer_quickstart.py .

  2. Digite o seguinte comando no seu terminal:

    python form_recognizer_quickstart.py
    

Neste início rápido, aprenda a usar a API REST de Document Intelligence para analisar e extrair dados e valores de documentos.

Pré-requisitos

  • Azure subscrição - Criar uma gratuitamente

  • A ferramenta de linha de comandos cURL está instalada.

  • PowerShell versão 7.*+ (ou uma aplicação semelhante na linha de comandos):

  • Para verificar a versão do seu PowerShell, escreva o seguinte comando relativo ao seu sistema operativo:

    • Windows: Get-Host | Select-Object Version
    • macOS ou Linux: $PSVersionTable
  • Um recurso de Inteligência Documental (serviço único) ou Foundry Tools (multi-serviço). Depois de ter a sua subscrição do Azure, crie um recurso de Inteligência de Documentos de serviço único ou multi-serviço no portal do Azure, para obter a sua chave e o endpoint. Podes usar o escalão de preços gratuito (F0) para experimentar o serviço, e depois fazer um upgrade para um nível pago para produção.

Dica

Crie um recurso Microsoft Foundry se planeia aceder a várias Foundry Tools num único endpoint/chave. Para acesso apenas à Inteligência Documental, crie um recurso de Inteligência Documental. Precisa de um recurso de serviço único se pretende usar autenticação Microsoft Entra.

  • Depois de o seu recurso ser implementado, selecione Ir para o recurso. Precisa da chave e do ponto final do recurso que cria para ligar a sua aplicação à API de Inteligência de Documentos. Colas a tua chave e endpoint no código mais tarde no quickstart:

    Captura de ecrã das chaves e localização do endpoint no portal Azure.

Analise documentos e obtenha resultados

Um pedido POST é usado para analisar documentos com um modelo pré-construído ou personalizado. Um pedido GET é usado para recuperar o resultado de uma chamada de análise documental. O modelId é utilizado com operações POST e o resultId com operações GET.

Analisar documento (Solicitação POST)

Antes de executar o comando cURL, faça as seguintes alterações ao pedido de publicação:

  1. Substitua {endpoint} pelo valor do endpoint da sua instância de Document Intelligence do portal de Azure.

  2. Substitua {key} pelo valor-chave da sua instância de Inteligência de Documentos do portal Azure.

  3. Usando a tabela seguinte como referência, substitua {modelID} e {your-document-url} pelos valores desejados.

  4. Precisas de um ficheiro de documento com uma URL. Para este início rápido, pode usar os formulários de exemplo fornecidos na tabela seguinte para cada funcionalidade:

Documentos de exemplo

Funcionalidade {modelID} {your-document-url}
Leia prebuilt-read https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png
Layout prebuilt-layout https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png
Cartão de seguro de saúde prebuilt-healthInsuranceCard.us https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/insurance-card.png
W-2 prebuilt-tax.us.w2 https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png
Fatura prebuilt-invoice https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf
Receção prebuilt-receipt https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png
Documento de identificação prebuilt-idDocument https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png

Documentos de exemplo

Funcionalidade {modelID} {your-document-url}
Documento Geral prebuilt-document https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf
Leia prebuilt-read https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png
Layout prebuilt-layout https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png
Cartão de seguro de saúde prebuilt-healthInsuranceCard.us https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/insurance-card.png
W-2 prebuilt-tax.us.w2 https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png
Fatura prebuilt-invoice https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf
Receção prebuilt-receipt https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png
Documento de identificação prebuilt-idDocument https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png
Cartão de visita prebuilt-businessCard https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/de5e0d8982ab754823c54de47a47e8e499351523/curl/form-recognizer/rest-api/business_card.jpg

Importante

Lembre-se de remover a chave do seu código quando terminar e nunca a publique publicamente. Para produção, usa uma forma segura de armazenar e aceder às tuas credenciais, como Azure Key Vault. Para mais informações, consulte a segurança das Ferramentas de Fundição.

Pedido POST

curl -v -i -X POST "{endpoint}/documentintelligence/documentModels/{modelId}:analyze?api-version=2024-11-30" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your-document-url}'}"
curl -v -i POST "{endpoint}/formrecognizer/documentModels/{modelID}:analyze?api-version=2023-07-31" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your-document-url}'}"
curl -v -i POST "{endpoint}/formrecognizer/documentModels/{modelId}:analyze?api-version=2022-08-31" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your-document-url}'}"

Resposta POST (resultID)

Recebe uma 202 (Success) resposta que inclui um cabeçalho Operation-Location de apenas leitura. O valor deste cabeçalho contém um resultID que pode ser consultado para obter o estado da operação assíncrona e recuperar os resultados usando um pedido GET com a sua mesma chave de subscrição de recursos:

{alt-text}

Obtenha resultados de análise (Pedido GET)

Depois de chamar a Analyze document API, chama a API Get analyze result para obter o estado da operação e os dados extraídos. Antes de executares o comando, faz estas alterações:

Depois de chamar a Analyze document API, chame a API Get analyze result para obter o estado da operação e os dados extraídos. Antes de executares o comando, faz estas alterações:

Depois de chamares a API Analyze document, chama a API Obter resultado de análise para obteres o estado da operação e os dados extraídos. Antes de executares o comando, faz estas alterações:

  1. Substitua o cabeçalho Operation-Location da resposta do POST.

  2. Substitua {key} pelo valor-chave da sua instância de Document Intelligence no portal Azure.

Pedido GET

curl -v -X GET "{endpoint}/documentintelligence/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2024-11-30" -H "Ocp-Apim-Subscription-Key: {key}"
curl -v -X GET "{endpoint}/formrecognizer/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2023-07-31" -H "Ocp-Apim-Subscription-Key: {key}"

curl -v -X GET "{endpoint}/formrecognizer/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2022-08-31" -H "Ocp-Apim-Subscription-Key: {key}"

Analise a resposta

Recebes uma 200 (Success) resposta com saída JSON. O primeiro campo, "status", indica o estado da operação. Se a operação não estiver concluída, o valor de "status" é "running" ou "notStarted", e deve chamar a API novamente, manualmente ou através de um script. Recomendamos um intervalo de um segundo ou mais entre chamadas.

Exemplo de resposta para fatura pré-definida

{
    "status": "succeeded",
    "createdDateTime": "2024-03-25T19:31:37Z",
    "lastUpdatedDateTime": "2024-03-25T19:31:43Z",
    "analyzeResult": {
        "apiVersion": "2024-11-30",
        "modelId": "prebuilt-invoice",
        "stringIndexType": "textElements"...
    ..."pages": [
            {
                "pageNumber": 1,
                "angle": 0,
                "width": 8.5,
                "height": 11,
                "unit": "inch",
                "words": [
                    {
                        "content": "CONTOSO",
                        "boundingBox": [
                            0.5911,
                            0.6857,
                            1.7451,
                            0.6857,
                            1.7451,
                            0.8664,
                            0.5911,
                            0.8664
                        ],
                        "confidence": 1,
                        "span": {
                            "offset": 0,
                            "length": 7
                                }
                      }],
              }]
      }
}
{
    "status": "succeeded",
    "createdDateTime": "2023-08-25T19:31:37Z",
    "lastUpdatedDateTime": "2023-08-25T19:31:43Z",
    "analyzeResult": {
        "apiVersion": "2023-07-31",
        "modelId": "prebuilt-invoice",
        "stringIndexType": "textElements"...
    ..."pages": [
            {
                "pageNumber": 1,
                "angle": 0,
                "width": 8.5,
                "height": 11,
                "unit": "inch",
                "words": [
                    {
                        "content": "CONTOSO",
                        "boundingBox": [
                            0.5911,
                            0.6857,
                            1.7451,
                            0.6857,
                            1.7451,
                            0.8664,
                            0.5911,
                            0.8664
                        ],
                        "confidence": 1,
                        "span": {
                            "offset": 0,
                            "length": 7
                                }
                      }],
              }]
      }
}
{
    "status": "succeeded",
    "createdDateTime": "2022-09-25T19:31:37Z",
    "lastUpdatedDateTime": "2022-09-25T19:31:43Z",
    "analyzeResult": {
        "apiVersion": "2022-08-31",
        "modelId": "prebuilt-invoice",
        "stringIndexType": "textElements"...
    ..."pages": [
            {
                "pageNumber": 1,
                "angle": 0,
                "width": 8.5,
                "height": 11,
                "unit": "inch",
                "words": [
                    {
                        "content": "CONTOSO",
                        "boundingBox": [
                            0.5911,
                            0.6857,
                            1.7451,
                            0.6857,
                            1.7451,
                            0.8664,
                            0.5911,
                            0.8664
                        ],
                        "confidence": 1,
                        "span": {
                            "offset": 0,
                            "length": 7
                                }
                      }],
              }]
      }
}

Campos de documentos suportados

Os modelos pré-construídos extraem conjuntos pré-definidos de campos de documento. Consulte Extração de dados de modelos para nomes de campos, tipos, descrições e exemplos extraídos.

É isso, parabéns!

Neste quickstart, utilizaste um modelo de Inteligência de Documentos para analisar vários formulários e documentos. De seguida, explore o Document Intelligence Studio e a documentação de referência para aprender em profundidade sobre a API de Document Intelligence.

Próximos passos

Este conteúdo aplica-se a:red-checkmarkv2.1 | Última versão:blue-checkmarkv4.0 (GA)

Comece a usar o Azure Document Intelligence usando a linguagem de programação da sua escolha ou a API REST. A Inteligência de Documentos é um serviço Foundry Tools baseado na cloud que utiliza aprendizagem automática para extrair pares-chave-valor, texto e tabelas dos seus documentos. Recomendamos que utilize o serviço gratuito enquanto estiver a aprender a tecnologia. Lembre-se que o número de páginas gratuitas está limitado a 500 por mês.

Para saber mais sobre as funcionalidades e opções de desenvolvimento da Inteligência Documental, visite a nossa página de Visão Geral .

Documentação de referência | Código-fonte da biblioteca | Package (NuGet) | Samples

Neste quickstart, utilizas as seguintes APIs para extrair dados estruturados de formulários e documentos:

Pré-requisitos

  • Azure subscrição - Cria uma gratuitamente.

  • A versão atual de Visual Studio IDE.

  • Um recurso de Ferramentas de Fabrico ou Inteligência de Documentos. Depois de ter a sua subscrição Azure, crie um recurso de Document Intelligence de serviço único ou multi-serviço no portal do Azure para obter a sua chave e endpoint. Podes usar o escalão de preços gratuito (F0) para experimentar o serviço, e depois fazer um upgrade para um nível pago para produção.

    Dica

    Crie um recurso Foundry se pretender aceder a várias Ferramentas Foundry através de um único ponto de acesso ou chave. Para acesso apenas à Inteligência Documental, crie um recurso de Inteligência Documental. Por favor, note que vai precisar de um recurso de serviço único se pretende usar autenticação Microsoft Entra.

  • Depois de o seu recurso ser implementado, selecione Ir para o recurso. Precisa da chave e do ponto final do recurso que cria para ligar a sua aplicação à API de Inteligência de Documentos. Colas a tua chave e endpoint no código mais tarde no quickstart:

    Captura de ecrã das chaves e localização do endpoint no portal Azure.

Configuração

  1. Inicie o Visual Studio 2019.

  2. Na página inicial, escolha Criar um novo projeto.

    Captura de ecrã da janela de início Visual Studio.

  3. Na página Criar um novo projeto, introduza Consola na caixa de pesquisa. Escolhe o modelo de Aplicação de Consola e depois escolhe Próximo.

    Captura de ecrã da página Visual Studio criar novo projeto.

  4. Na janela de diálogo Configurar o seu novo projeto, introduza formRecognizer_quickstart na caixa do nome do projeto. Depois escolhe Próximo.

    Captura de ecrã da janela de diálogo do Visual Studios para configurar novo projeto.

  5. Na janela de diálogo Informação adicional, selecione .NET 5.0 (Atual) e depois selecione Criar.

    Captura de ecrã de Visual Studio janela de diálogo de informação adicional.

Instale a biblioteca cliente com o NuGet

  1. Clique com o botão direito no seu projeto formRecognizer_quickstart e selecione Gerir Pacotes NuGet... .

    Captura de ecrã a mostrar a janela de seleção do pacote NuGet.

  2. Selecione o separador Navegar e escreva Azure. IA. FormRecognizer.

    Captura de ecrã a mostrar o menu suspenso para seleção do pacote de Inteligência Documental.

  3. Selecione a versão 3.1.1 no menu suspenso e selecione Instalar.

Constrói a tua aplicação

Para interagir com o serviço de Inteligência Documental, é necessário criar uma instância da FormRecognizerClient classe. Para isso, cria uma AzureKeyCredential com a sua chave e uma instância FormRecognizerClient com a AzureKeyCredential e a sua Inteligência de Documentos endpoint.

Nota

  • A partir do .NET 6, novos projetos que utilizam o modelo console geram um novo estilo de programa que difere das versões anteriores.
  • A nova saída utiliza funcionalidades recentes de C# que simplificam o código que precisa de escrever.
  • Quando usas a versão mais recente, só precisas de escrever o corpo do Main método. Não precisas de incluir instruções de topo, diretivas globais usando ou usando diretivas implícitas.
  • Para mais informações, consulteos novos modelos C# que geram instruções de topo.
  1. Abre o ficheiro Program.cs .

  2. Inclua as seguintes diretrizes de utilização:

using Azure;
using Azure.AI.FormRecognizer;
using Azure.AI.FormRecognizer.Models;
using System.Threading.Tasks;
  1. Defina as variáveis de ambiente endpoint e key e crie as suas instâncias AzureKeyCredential e FormRecognizerClient.
private static readonly string endpoint = "your-form-recognizer-endpoint";
private static readonly string key = "your-api-key";
private static readonly AzureKeyCredential credential = new AzureKeyCredential(key);
  1. Apague a linha, Console.Writeline("Hello World!"); , e adicione um dos exemplos de código Try It ao ficheiro Program.cs:

    Captura de ecrã de adicionar o código de exemplo ao método principal.

  2. Selecione um exemplo de código para copiar e colar no método principal da sua aplicação:

Importante

Lembre-se de remover a chave do seu código quando terminar e nunca a publique publicamente. Para produção, usa uma forma segura de armazenar e aceder às tuas credenciais, como Azure Key Vault. Para mais informações, consulte o artigo sobre segurança da Foundry Tools.

Experimente: Modelo de layout

Extrai texto, marcas de seleção, estilos de texto e estruturas de tabelas de documentos, juntamente com as coordenadas das suas regiões delimitadoras.

  • Para este exemplo, vai precisar de um ficheiro de documento numa URI. Pode usar o nosso documento exemplo para este início rápido.
  • Adicionámos o valor do URI do ficheiro à formUri variável.
  • Para extrair o layout de um dado ficheiro num URI, use o método StartRecognizeContentFromUriAsync.

Adicione o seguinte código no ficheiro Program.cs da sua aplicação de layout:


FormRecognizerClient recognizerClient = AuthenticateClient();

Task recognizeContent = RecognizeContent(recognizerClient);
Task.WaitAll(recognizeContent);

private static FormRecognizerClient AuthenticateClient()
            {
                var credential = new AzureKeyCredential(key);
                var client = new FormRecognizerClient(new Uri(endpoint), credential);
                return client;
            }

            private static async Task RecognizeContent(FormRecognizerClient recognizerClient)
        {
            string formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
            FormPageCollection formPages = await recognizerClient
        .StartRecognizeContentFromUri(new Uri(formUrl))
        .WaitForCompletionAsync();

            foreach (FormPage page in formPages)
            {
                Console.WriteLine($"Form Page {page.PageNumber} has {page.Lines.Count} lines.");

                for (int i = 0; i < page.Lines.Count; i++)
                {
                    FormLine line = page.Lines[i];
                    Console.WriteLine($"    Line {i} has {line.Words.Count} word{(line.Words.Count > 1 ? "s" : "")}, and text: '{line.Text}'.");
                }

                for (int i = 0; i < page.Tables.Count; i++)
                {
                    FormTable table = page.Tables[i];
                    Console.WriteLine($"Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
                    foreach (FormTableCell cell in table.Cells)
                    {
                        Console.WriteLine($"    Cell ({cell.RowIndex}, {cell.ColumnIndex}) contains text: '{cell.Text}'.");
                    }
                }
            }
        }
    }
}

Experimenta: modelo pré-montado

Este exemplo demonstra como analisar dados de certos tipos de documentos comuns com modelos pré-treinados, usando uma fatura como exemplo.

  • Neste exemplo, vamos analisar um documento de fatura usando um modelo pré-construído. Pode usar o nosso documento exemplo de fatura para esta introdução rápida.
  • Adicionámos o valor do URI do ficheiro à invoiceUri variável no topo do método principal.
  • Para analisar um dado ficheiro num URI, use o StartRecognizeInvoicesFromUriAsync método.
  • Para simplificar, todos os campos que o serviço devolve não são mostrados aqui. Para ver a lista de todos os campos suportados e tipos correspondentes, consulte a nossa página de conceitos de fatura .

Escolha um modelo pré-montado

Não está limitado a faturas — existem vários modelos pré-definidos para escolher, cada um com o seu próprio conjunto de campos suportados. O modelo a utilizar para a operação de análise depende do tipo de documento a analisar. Aqui estão os modelos pré-construídos atualmente suportados pelo serviço de Inteligência Documental:

  • Fatura: extrai texto, marcas de seleção, tabelas, campos e informações chave das faturas.
  • Recibo: extrai texto e informações chave dos recibos.
  • Documento de identificação: extrai texto e informações essenciais das cartas de condução e passaportes internacionais.
  • Cartão de visita: extrai texto e informações importantes de cartões de visita.

Adicione o seguinte código ao método do ficheiro Program.cs na sua aplicação de faturação pré-construída.

FormRecognizerClient recognizerClient = AuthenticateClient();

  Task analyzeinvoice = AnalyzeInvoice(recognizerClient, invoiceUrl);
  Task.WaitAll(analyzeinvoice);

   private static FormRecognizerClient AuthenticateClient() {
     var credential = new AzureKeyCredential(key);
     var client = new FormRecognizerClient(new Uri(endpoint), credential);
     return client;
   }

   static string invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";

   private static async Task AnalyzeInvoice(FormRecognizerClient recognizerClient, string invoiceUrl) {
     var options = new RecognizeInvoicesOptions() {
       Locale = "en-US"
     };
     RecognizedFormCollection invoices = await recognizerClient.StartRecognizeInvoicesFromUriAsync(new Uri(invoiceUrl), options).WaitForCompletionAsync();

     RecognizedForm invoice = invoices[0];

     FormField invoiceIdField;
     if (invoice.Fields.TryGetValue("InvoiceId", out invoiceIdField)) {
       if (invoiceIdField.Value.ValueType == FieldValueType.String) {
         string invoiceId = invoiceIdField.Value.AsString();
         Console.WriteLine($"    Invoice Id: '{invoiceId}', with confidence {invoiceIdField.Confidence}");
       }
     }

     FormField invoiceDateField;
     if (invoice.Fields.TryGetValue("InvoiceDate", out invoiceDateField)) {
       if (invoiceDateField.Value.ValueType == FieldValueType.Date) {
         DateTime invoiceDate = invoiceDateField.Value.AsDate();
         Console.WriteLine($"    Invoice Date: '{invoiceDate}', with confidence {invoiceDateField.Confidence}");
       }
     }

     FormField dueDateField;
     if (invoice.Fields.TryGetValue("DueDate", out dueDateField)) {
       if (dueDateField.Value.ValueType == FieldValueType.Date) {
         DateTime dueDate = dueDateField.Value.AsDate();
         Console.WriteLine($"    Due Date: '{dueDate}', with confidence {dueDateField.Confidence}");
       }
     }

     FormField vendorNameField;
     if (invoice.Fields.TryGetValue("VendorName", out vendorNameField)) {
       if (vendorNameField.Value.ValueType == FieldValueType.String) {
         string vendorName = vendorNameField.Value.AsString();
         Console.WriteLine($"    Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
       }
     }

     FormField vendorAddressField;
     if (invoice.Fields.TryGetValue("VendorAddress", out vendorAddressField)) {
       if (vendorAddressField.Value.ValueType == FieldValueType.String) {
         string vendorAddress = vendorAddressField.Value.AsString();
         Console.WriteLine($"    Vendor Address: '{vendorAddress}', with confidence {vendorAddressField.Confidence}");
       }
     }

     FormField customerNameField;
     if (invoice.Fields.TryGetValue("CustomerName", out customerNameField)) {
       if (customerNameField.Value.ValueType == FieldValueType.String) {
         string customerName = customerNameField.Value.AsString();
         Console.WriteLine($"    Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
       }
     }

     FormField customerAddressField;
     if (invoice.Fields.TryGetValue("CustomerAddress", out customerAddressField)) {
       if (customerAddressField.Value.ValueType == FieldValueType.String) {
         string customerAddress = customerAddressField.Value.AsString();
         Console.WriteLine($"    Customer Address: '{customerAddress}', with confidence {customerAddressField.Confidence}");
       }
     }

     FormField customerAddressRecipientField;
     if (invoice.Fields.TryGetValue("CustomerAddressRecipient", out customerAddressRecipientField)) {
       if (customerAddressRecipientField.Value.ValueType == FieldValueType.String) {
         string customerAddressRecipient = customerAddressRecipientField.Value.AsString();
         Console.WriteLine($"    Customer address recipient: '{customerAddressRecipient}', with confidence {customerAddressRecipientField.Confidence}");
       }
     }

     FormField invoiceTotalField;
     if (invoice.Fields.TryGetValue("InvoiceTotal", out invoiceTotalField)) {
       if (invoiceTotalField.Value.ValueType == FieldValueType.Float) {
         float invoiceTotal = invoiceTotalField.Value.AsFloat();
         Console.WriteLine($"    Invoice Total: '{invoiceTotal}', with confidence {invoiceTotalField.Confidence}");
       }
     }
   }
 }
}

Execute a sua aplicação

Escolha o botão verde Start ao lado de formRecognizer_quickstart para construir e executar o seu programa, ou pressione F5.

Captura de ecrã de executar o teu programa Visual Studio.

Documentação de referência | Código-fonte da biblioteca | Package (Maven) | Samples

Neste quickstart, utilizas as seguintes APIs para extrair dados estruturados de formulários e documentos:

Pré-requisitos

  • Azure subscrição - Cria uma gratuitamente.

  • Um Kit de Desenvolvimento de Java (JDK) versão 8 ou posterior. Para mais informações, vejaas versões Java suportadas e o cronograma de atualizações.

  • Um recurso de Ferramentas de Fabrico ou Inteligência de Documentos. Depois de ter a sua subscrição Azure, crie um recurso de Document Intelligence de serviço único ou multi-serviço no portal do Azure para obter a sua chave e endpoint. Podes usar o escalão de preços gratuito (F0) para experimentar o serviço, e depois fazer um upgrade para um nível pago para produção.

  • Depois de o seu recurso ser implementado, selecione Ir para o recurso. Precisa da chave e do ponto final do recurso que cria para ligar a sua aplicação à API de Inteligência de Documentos. Colas a tua chave e endpoint no código mais tarde no quickstart:

    Captura de ecrã das chaves e localização do endpoint no portal Azure.

Configuração

Criar um novo projeto Gradle

Numa janela de consola (como cmd, PowerShell ou Bash), crie um novo diretório para a sua aplicação chamado form-recognizer-app e navegue até lá.

mkdir form-recognizer-app && form-recognizer-app
  1. Executa o gradle init comando a partir do teu diretório de trabalho. Este comando cria ficheiros de compilação essenciais para o Gradle, incluindo build.gradle.kts, que é usado em tempo de execução para criar e configurar a sua aplicação.

    gradle init --type basic
    
  2. Quando solicitado a escolher um DSL, selecione Kotlin.

  3. Aceitar o nome padrão do projeto (form-recognizer-app)

Instalar a biblioteca cliente

Este quickstart utiliza o gestor de dependências do Gradle. Pode encontrar a biblioteca cliente e informações para outros gestores de dependências no Repositório Central Maven.

No ficheiro build.gradle.kts do seu projeto, inclua a biblioteca cliente como uma implementation instrução, juntamente com os plugins e definições necessárias.

plugins {
    java
    application
}
application {
    mainClass.set("FormRecognizer")
}
repositories {
    mavenCentral()
}
dependencies {
    implementation(group = "com.azure", name = "azure-ai-formrecognizer", version = "3.1.1")
}

Criar um ficheiro Java

A partir do seu diretório de trabalho, execute o seguinte comando:

mkdir -p src/main/java

Cria-se a seguinte estrutura de diretórios:

Captura de ecrã da estrutura de diretórios Java da aplicação.

Navegue até ao diretório Java e crie um ficheiro chamado FormRecognizer.java. Abra-o no seu editor ou IDE preferido e adicione a seguinte declaração e import instruções do pacote:

import com.azure.ai.formrecognizer.*;
import com.azure.ai.formrecognizer.models.*;

import java.util.concurrent.atomic.AtomicReference;
import java.util.List;
import java.util.Map;
import java.time.LocalDate;

import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.http.rest.PagedIterable;
import com.azure.core.util.Context;
import com.azure.core.util.polling.SyncPoller;

Selecione um exemplo de código para copiar e colar no método principal da sua aplicação:

Importante

Lembre-se de remover a chave do seu código quando terminar e nunca a publique publicamente. Para produção, usa uma forma segura de armazenar e aceder às tuas credenciais, como Azure Key Vault. Para mais informações, consulte a segurança das Ferramentas de Fundição.

Experimente: Modelo de layout

Extrai texto, marcas de seleção, estilos de texto e estruturas de tabelas de documentos, juntamente com as coordenadas das suas regiões delimitadoras.

  • Para este exemplo, vai precisar de um ficheiro de documento numa URI. Pode usar o nosso documento exemplo para este início rápido.
  • Para analisar um determinado ficheiro num URI, vais usar o beginRecognizeContentFromUrl método.
  • Adicionámos o valor do URI do ficheiro à formUrl variável no método principal.

Atualize a classe FormRecognizer da sua aplicação, com o seguinte código (certifique-se de atualizar as variáveis chave e endpoint com valores da sua instância de Document Intelligence do portal Azure):


static final String key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
static final String endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";

public static void main(String[] args) {FormRecognizerClient recognizerClient = new FormRecognizerClientBuilder()
                .credential(new AzureKeyCredential(key)).endpoint(endpoint).buildClient();

    String formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";

    System.out.println("Get form content...");
        GetContent(recognizerClient, formUrl);
  }
    private static void GetContent(FormRecognizerClient recognizerClient, String invoiceUri) {
        String analyzeFilePath = invoiceUri;
        SyncPoller<FormRecognizerOperationResult, List<FormPage>> recognizeContentPoller = recognizerClient
                .beginRecognizeContentFromUrl(analyzeFilePath);

        List<FormPage> contentResult = recognizeContentPoller.getFinalResult();
        // </snippet_getcontent_call>
        // <snippet_getcontent_print>
        contentResult.forEach(formPage -> {
            // Table information
            System.out.println("----Recognizing content ----");
            System.out.printf("Has width: %f and height: %f, measured with unit: %s.%n", formPage.getWidth(),
                    formPage.getHeight(), formPage.getUnit());
            formPage.getTables().forEach(formTable -> {
                System.out.printf("Table has %d rows and %d columns.%n", formTable.getRowCount(),
                        formTable.getColumnCount());
                formTable.getCells().forEach(formTableCell -> {
                    System.out.printf("Cell has text %s.%n", formTableCell.getText());
                });
                System.out.println();
            });
        });
    }

Experimenta: modelo pré-montado

Este exemplo demonstra como analisar dados de certos tipos de documentos comuns com modelos pré-treinados, usando uma fatura como exemplo.

  • Neste exemplo, vamos analisar um documento de fatura usando um modelo pré-construído. Pode usar o nosso documento exemplo de fatura para esta introdução rápida.
  • Para analisar um dado ficheiro num URI, irá usar o beginRecognizeInvoicesFromUrl.
  • Adicionámos o valor do URI do ficheiro à invoiceUrl variável no método principal.
  • Para simplificar, todos os campos que o serviço devolve não são mostrados aqui. Para ver a lista de todos os campos suportados e tipos correspondentes, consulte a nossa página de conceitos de fatura .

Escolha um modelo pré-montado

Não está limitado a faturas — existem vários modelos pré-definidos para escolher, cada um com o seu próprio conjunto de campos suportados. O modelo a utilizar para a analyze operação depende do tipo de documento a analisar. Aqui estão os modelos pré-construídos atualmente suportados pelo serviço de Inteligência Documental:

  • Fatura: extrai texto, marcas de seleção, tabelas, campos e informações chave das faturas.
  • Recibo: extrai texto e informações chave dos recibos.
  • Documento de identificação: extrai texto e informações essenciais das cartas de condução e passaportes internacionais.
  • Cartão de visita: extrai texto e informações importantes de cartões de visita.

Atualize a classe FormRecognizer da sua aplicação, com o seguinte código (certifique-se de atualizar as variáveis chave e endpoint com valores da sua instância de Document Intelligence do portal Azure):


static final String key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
static final String endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";

public static void main(String[] args) {
    FormRecognizerClient recognizerClient = new FormRecognizerClientBuilder().credential(new AzureKeyCredential(key)).endpoint(endpoint).buildClient();

    String invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";

    System.out.println("Analyze invoice...");
        AnalyzeInvoice(recognizerClient, invoiceUrl);
  }
    private static void AnalyzeInvoice(FormRecognizerClient recognizerClient, String invoiceUrl) {
      SyncPoller < FormRecognizerOperationResult,
        List < RecognizedForm >> recognizeInvoicesPoller = recognizerClient.beginRecognizeInvoicesFromUrl(invoiceUrl);
      List < RecognizedForm > recognizedInvoices = recognizeInvoicesPoller.getFinalResult();

      for (int i = 0; i < recognizedInvoices.size(); i++) {
        RecognizedForm recognizedInvoice = recognizedInvoices.get(i);
        Map < String,
        FormField > recognizedFields = recognizedInvoice.getFields();
        System.out.printf("----------- Recognized invoice info for page %d -----------%n", i);
        FormField vendorNameField = recognizedFields.get("VendorName");
        if (vendorNameField != null) {
            if (FieldValueType.STRING == vendorNameField.getValue().getValueType()) {
                String merchantName = vendorNameField.getValue().asString();
                System.out.printf("Vendor Name: %s, confidence: %.2f%n", merchantName, vendorNameField.getConfidence());
            }
        }

        FormField vendorAddressField = recognizedFields.get("VendorAddress");
        if (vendorAddressField != null) {
            if (FieldValueType.STRING == vendorAddressField.getValue().getValueType()) {
                String merchantAddress = vendorAddressField.getValue().asString();
                System.out.printf("Vendor address: %s, confidence: %.2f%n", merchantAddress, vendorAddressField.getConfidence());
            }
        }

        FormField customerNameField = recognizedFields.get("CustomerName");
        if (customerNameField != null) {
            if (FieldValueType.STRING == customerNameField.getValue().getValueType()) {
                String merchantAddress = customerNameField.getValue().asString();
                System.out.printf("Customer Name: %s, confidence: %.2f%n", merchantAddress, customerNameField.getConfidence());
            }
        }

        FormField customerAddressRecipientField = recognizedFields.get("CustomerAddressRecipient");
        if (customerAddressRecipientField != null) {
            if (FieldValueType.STRING == customerAddressRecipientField.getValue().getValueType()) {
                String customerAddr = customerAddressRecipientField.getValue().asString();
                System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n", customerAddr, customerAddressRecipientField.getConfidence());
            }
        }

        FormField invoiceIdField = recognizedFields.get("InvoiceId");
        if (invoiceIdField != null) {
            if (FieldValueType.STRING == invoiceIdField.getValue().getValueType()) {
                String invoiceId = invoiceIdField.getValue().asString();
                System.out.printf("Invoice Id: %s, confidence: %.2f%n", invoiceId, invoiceIdField.getConfidence());
            }
        }

        FormField invoiceDateField = recognizedFields.get("InvoiceDate");
        if (customerNameField != null) {
            if (FieldValueType.DATE == invoiceDateField.getValue().getValueType()) {
                LocalDate invoiceDate = invoiceDateField.getValue().asDate();
                System.out.printf("Invoice Date: %s, confidence: %.2f%n", invoiceDate, invoiceDateField.getConfidence());
            }
        }

        FormField invoiceTotalField = recognizedFields.get("InvoiceTotal");
        if (customerAddressRecipientField != null) {
            if (FieldValueType.FLOAT == invoiceTotalField.getValue().getValueType()) {
                Float invoiceTotal = invoiceTotalField.getValue().asFloat();
                System.out.printf("Invoice Total: %.2f, confidence: %.2f%n", invoiceTotal, invoiceTotalField.getConfidence());
            }
        }
    }
}

Constrói e executa a tua aplicação

Navegue de volta ao diretório principal do seu projeto — form-recognizer-app.

  1. Constrói a tua aplicação com o build comando:
gradle build
  1. Execute a sua aplicação com o run comando:
gradle run

Documentação de referência | código-fonte da biblioteca | Package (npm) | Samples

Neste quickstart, utilizas as seguintes APIs para extrair dados estruturados de formulários e documentos:

Pré-requisitos

  • Azure subscrição - Cria uma gratuitamente.

  • A versão mais recente do Visual Studio Code ou o seu IDE preferido.

  • A versão mais recente LTS do Node.js

  • Um recurso de Ferramentas de Fabrico ou Inteligência de Documentos. Depois de ter a sua subscrição Azure, crie um recurso de Document Intelligence de serviço único ou multi-serviço no portal do Azure para obter a sua chave e endpoint. Podes usar o escalão de preços gratuito (F0) para experimentar o serviço, e depois fazer um upgrade para um nível pago para produção.

    Dica

    Crie um recurso Foundry se pretender aceder a várias Ferramentas Foundry através de um único ponto de acesso ou chave. Para acesso apenas à Inteligência Documental, crie um recurso de Inteligência Documental. Por favor, note que vai precisar de um recurso de serviço único se pretende usar autenticação Microsoft Entra.

  • Depois de o seu recurso ser implementado, selecione Ir para o recurso. Precisa da chave e do ponto final do recurso que cria para ligar a sua aplicação à API de Inteligência de Documentos. Colas a tua chave e endpoint no código mais tarde no quickstart:

    Captura de ecrã das chaves e localização do endpoint no portal Azure.

Configuração

  1. Crie uma nova Node.js aplicação. Numa janela de consola (como cmd, PowerShell ou Bash), crie um novo diretório para a sua aplicação e navegue até lá.

    mkdir form-recognizer-app && cd form-recognizer-app
    
  2. Execute o comando npm init para criar uma aplicação Node.js com um ficheiro package.json.

    npm init
    
  3. Instale o ai-form-recognizer pacote npm da biblioteca cliente:

    npm install @azure/ai-form-recognizer
    

    O ficheiro package.json da tua aplicação foi atualizado com as dependências.

  4. Crie um ficheiro chamado index.js, abre-o e importe as seguintes bibliotecas:

    const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");
    
  5. Crie variáveis para o endpoint e chave do Azure do seu recurso:

    const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
    const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
    
  6. Neste ponto, a sua aplicação JavaScript deve conter as seguintes linhas de código:

    
    const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");
    
    const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
    const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
    

Selecione um exemplo de código para copiar e colar na sua aplicação:

Importante

Lembre-se de remover a chave do seu código quando terminar e nunca a publique publicamente. Para produção, usa uma forma segura de armazenar e aceder às tuas credenciais, como Azure Key Vault. Para mais informações, consulte a segurança das Ferramentas de Fundição.

Experimente: Modelo de layout

  • Para este exemplo, vai precisar de um ficheiro de documento numa URI. Pode usar o nosso documento exemplo para este início rápido.
  • Adicionámos o valor do URI do ficheiro à formUrl variável perto do topo do ficheiro.
  • Para analisar um determinado ficheiro num URI, vais usar o beginRecognizeContent método.

Adicione o seguinte código à sua aplicação de layout na linha abaixo da key variável

const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";

const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";

async function recognizeContent() {
    const client = new FormRecognizerClient(endpoint, new AzureKeyCredential(key));
    const poller = await client.beginRecognizeContentFromUrl(formUrl);
    const pages = await poller.pollUntilDone();

    if (!pages || pages.length === 0) {
        throw new Error("Expecting non-empty list of pages!");
    }

    for (const page of pages) {
        console.log(
            `Page ${page.pageNumber}: width ${page.width} and height ${page.height} with unit ${page.unit}`
        );
        for (const table of page.tables) {
            for (const cell of table.cells) {
                console.log(`cell [${cell.rowIndex},${cell.columnIndex}] has text ${cell.text}`);
            }
        }
    }
}

recognizeContent().catch((err) => {
    console.error("The sample encountered an error:", err);
});

Experimenta: modelo pré-montado

Este exemplo demonstra como analisar dados de certos tipos de documentos comuns com modelos pré-treinados, usando uma fatura como exemplo. Consulte a nossa página de conceitos pré-definidos para uma listagem detalhada de campos de fatura

  • Neste exemplo, vamos analisar um documento de fatura usando um modelo pré-construído. Pode usar o nosso documento exemplo de fatura para esta introdução rápida.
  • Adicionámos o valor do URI do ficheiro à invoiceUrl variável no topo do ficheiro.
  • Para analisar um determinado ficheiro num URI, vais usar o beginRecognizeInvoices método.
  • Para simplificar, todos os campos que o serviço devolve não são mostrados aqui. Para ver a lista de todos os campos suportados e tipos correspondentes, consulte a nossa página de conceitos de fatura .

Escolha um modelo pré-montado

Não está limitado a faturas — existem vários modelos pré-definidos para escolher, cada um com o seu próprio conjunto de campos suportados. O modelo a utilizar para a analyze operação depende do tipo de documento a analisar. Aqui estão os modelos pré-construídos atualmente suportados pelo serviço de Inteligência Documental:

  • Fatura: extrai texto, marcas de seleção, tabelas, campos e informações chave das faturas.
  • Recibo: extrai texto e informações chave dos recibos.
  • Documento de identificação: extrai texto e informações essenciais das cartas de condução e passaportes internacionais.
  • Cartão de visita: extrai texto e informações importantes de cartões de visita.

Adicione o seguinte código à sua aplicação de faturação pré-construída abaixo da key variável


const invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";

async function recognizeInvoices() {

    const client = new FormRecognizerClient(endpoint, new AzureKeyCredential(key));

    const poller = await client.beginRecognizeInvoicesFromUrl(invoiceUrl);
    const [invoice] = await poller.pollUntilDone();

    if (invoice === undefined) {
        throw new Error("Failed to extract data from at least one invoice.");
    }

    /**
     * This is a helper function for printing a simple field with an elemental type.
     */
    function fieldToString(field) {
        const {
            name,
            valueType,
            value,
            confidence
        } = field;
        return `${name} (${valueType}): '${value}' with confidence ${confidence}'`;
    }

    console.log("Invoice fields:");

    /**
     * Invoices contain a lot of optional fields, but they are all of elemental types
     * such as strings, numbers, and dates, so we will just enumerate them all.
     */
    for (const [name, field] of Object.entries(invoice.fields)) {
        if (field.valueType !== "array" && field.valueType !== "object") {
            console.log(`- ${name} ${fieldToString(field)}`);
        }
    }

    // Invoices also support nested line items, so we can iterate over them.
    let idx = 0;

    console.log("- Items:");

    const items = invoice.fields["Items"]?.value;
    for (const item of items ?? []) {
        const value = item.value;

        // Each item has several subfields that are nested within the item. We'll
        // map over this list of the subfields and filter out any fields that
        // weren't found. Not all fields will be returned every time, only those
        // that the service identified for the particular document in question.

        const subFields = [
                "Description",
                "Quantity",
                "Unit",
                "UnitPrice",
                "ProductCode",
                "Date",
                "Tax",
                "Amount"
            ]
            .map((fieldName) => value[fieldName])
            .filter((field) => field !== undefined);

        console.log(
            [
                `  - Item #${idx}`,
                // Now we will convert those fields into strings to display
                ...subFields.map((field) => `    - ${fieldToString(field)}`)
            ].join("\n")
        );
    }
}

recognizeInvoices().catch((err) => {
    console.error("The sample encountered an error:", err);
});

Documentação de referência | Código-fonte da biblioteca | Package (PyPi) | Samples

Neste quickstart, utilizas as seguintes APIs para extrair dados estruturados de formulários e documentos:

Pré-requisitos

  • Azure subscrição - Criar uma gratuitamente

  • Python 3.x

    • A sua instalação Python deve incluir pip. Podes verificar se tens pip instalado correndo pip --version na linha de comandos. Obtenha pip instalando a versão mais recente do Python.
  • Um recurso de Ferramentas de Fabrico ou Inteligência de Documentos. Depois de ter a sua subscrição Azure, crie um recurso de Document Intelligence de serviço único ou multi-serviço no portal do Azure para obter a sua chave e endpoint. Podes usar o escalão de preços gratuito (F0) para experimentar o serviço, e depois fazer um upgrade para um nível pago para produção.

    Dica

    Crie um recurso Foundry se pretender aceder a várias Ferramentas Foundry através de um único ponto de acesso ou chave. Para acesso apenas à Inteligência Documental, crie um recurso de Inteligência Documental. Por favor, note que vai precisar de um recurso de serviço único se pretende usar autenticação Microsoft Entra.

  • Depois de o seu recurso ser implementado, selecione Ir para o recurso. Precisa da chave e do ponto final do recurso que cria para ligar a sua aplicação à API de Inteligência de Documentos. Colas a tua chave e endpoint no código mais tarde no quickstart:

    Captura de ecrã das chaves e localização do endpoint no portal Azure.

Configuração

Abra uma janela de terminal no seu ambiente local e instale a biblioteca cliente Azure Document Intelligence no Foundry Tools para Python com pip:

pip install azure-ai-formrecognizer

Criar uma nova aplicação Python

Crie uma nova aplicação Python chamada form_recognizer_quickstart.py no seu editor ou IDE preferido. Depois importa as seguintes bibliotecas:

import os
from azure.ai.formrecognizer import FormRecognizerClient
from azure.core.credentials import AzureKeyCredential

Crie variáveis para o endpoint e chave do seu recurso Azure

endpoint = "YOUR_FORM_RECOGNIZER_ENDPOINT"
key = "YOUR_FORM_RECOGNIZER_KEY"

Neste ponto, a sua aplicação em Python deve conter as seguintes linhas de código:

import os
from azure.core.exceptions import ResourceNotFoundError
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential

endpoint = "YOUR_FORM_RECOGNIZER_ENDPOINT"
key = "YOUR_FORM_RECOGNIZER_KEY"

Selecione um exemplo de código para copiar e colar na sua aplicação:

Importante

Lembre-se de remover a chave do seu código quando terminar e nunca a publique publicamente. Para produção, usa uma forma segura de armazenar e aceder às tuas credenciais, como Azure Key Vault. Para mais informações, consulte a segurança das Ferramentas de Fundição.

Experimente: Modelo de layout

  • Para este exemplo, vai precisar de um ficheiro de documento numa URI. Pode usar o nosso documento exemplo para este início rápido.
  • Adicionámos o valor do URI do ficheiro à formUrl variável perto do topo do ficheiro.
  • Para analisar um determinado ficheiro num URI, vais usar o begin_recognize_content_from_url método.

Adicione o seguinte código à sua aplicação de layout na linha abaixo da key variável


  def format_bounding_box(bounding_box):
    if not bounding_box:
        return "N/A"
    return ", ".join(["[{}, {}]".format(p.x, p.y) for p in bounding_box])

 def recognize_content():
    # sample document
    formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"

    form_recognizer_client = FormRecognizerClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )

    poller = form_recognizer_client.begin_recognize_content_from_url(formUrl)
    form_pages = poller.result()

    for idx, content in enumerate(form_pages):
        print(
            "Page has width: {} and height: {}, measured with unit: {}".format(
                content.width, content.height, content.unit
            )
        )
        for table_idx, table in enumerate(content.tables):
            print(
                "Table # {} has {} rows and {} columns".format(
                    table_idx, table.row_count, table.column_count
                )
            )
            print(
                "Table # {} location on page: {}".format(
                    table_idx, format_bounding_box(table.bounding_box)
                )
            )
            for cell in table.cells:
                print(
                    "...Cell[{}][{}] has text '{}' within bounding box '{}'".format(
                        cell.row_index,
                        cell.column_index,
                        cell.text,
                        format_bounding_box(cell.bounding_box),
                    )
                )

        for line_idx, line in enumerate(content.lines):
            print(
                "Line # {} has word count '{}' and text '{}' within bounding box '{}'".format(
                    line_idx,
                    len(line.words),
                    line.text,
                    format_bounding_box(line.bounding_box),
                )
            )
            if line.appearance:
                if (
                    line.appearance.style_name == "handwriting"
                    and line.appearance.style_confidence > 0.8
                ):
                    print(
                        "Text line '{}' is handwritten and might be a signature.".format(
                            line.text
                        )
                    )
            for word in line.words:
                print(
                    "...Word '{}' has a confidence of {}".format(
                        word.text, word.confidence
                    )
                )

        for selection_mark in content.selection_marks:
            print(
                "Selection mark is '{}' within bounding box '{}' and has a confidence of {}".format(
                    selection_mark.state,
                    format_bounding_box(selection_mark.bounding_box),
                    selection_mark.confidence,
                )
            )
        print("----------------------------------------")


if __name__ == "__main__":
    recognize_content()

Experimenta: modelo pré-montado

Este exemplo demonstra como analisar dados de certos tipos de documentos comuns com modelos pré-treinados, usando uma fatura como exemplo. Consulte a nossa página de conceitos pré-definidos para uma listagem detalhada de campos de fatura

  • Neste exemplo, vamos analisar um documento de fatura usando um modelo pré-construído. Pode usar o nosso documento exemplo de fatura para esta introdução rápida.
  • Adicionámos o valor do URI do ficheiro à variável 'formUrl' no topo do ficheiro.
  • Para analisar um determinado ficheiro num URI, usará o método ``begin_recognize_invoices_from_url``.
  • Para simplificar, todos os campos que o serviço devolve não são mostrados aqui. Para ver a lista de todos os campos suportados e tipos correspondentes, consulte a nossa página de conceitos de fatura .

Escolha um modelo pré-montado

Não está limitado a faturas — existem vários modelos pré-definidos para escolher, cada um com o seu próprio conjunto de campos suportados. O modelo a utilizar para a analyze operação depende do tipo de documento a analisar. Aqui estão os modelos pré-construídos atualmente suportados pelo serviço de Inteligência Documental:

  • Fatura: extrai texto, marcas de seleção, tabelas, campos e informações chave das faturas.
  • Recibo: extrai texto e informações chave dos recibos.
  • Documento de identificação: extrai texto e informações essenciais das cartas de condução e passaportes internacionais.
  • Cartão de visita: extrai texto e informações importantes de cartões de visita.

Adicione o seguinte código à sua aplicação de faturação pré-construída abaixo da key variável


def recognize_invoice():

    invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"

    form_recognizer_client = FormRecognizerClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )

    poller = form_recognizer_client.begin_recognize_invoices_from_url(
        invoiceUrl, locale="en-US"
    )
    invoices = poller.result()

    for idx, invoice in enumerate(invoices):
        vendor_name = invoice.fields.get("VendorName")
        if vendor_name:
            print(
                "Vendor Name: {} has confidence: {}".format(
                    vendor_name.value, vendor_name.confidence
                )
            )
        vendor_address = invoice.fields.get("VendorAddress")
        if vendor_address:
            print(
                "Vendor Address: {} has confidence: {}".format(
                    vendor_address.value, vendor_address.confidence
                )
            )
        vendor_address_recipient = invoice.fields.get("VendorAddressRecipient")
        if vendor_address_recipient:
            print(
                "Vendor Address Recipient: {} has confidence: {}".format(
                    vendor_address_recipient.value, vendor_address_recipient.confidence
                )
            )
        customer_name = invoice.fields.get("CustomerName")
        if customer_name:
            print(
                "Customer Name: {} has confidence: {}".format(
                    customer_name.value, customer_name.confidence
                )
            )
        customer_id = invoice.fields.get("CustomerId")
        if customer_id:
            print(
                "Customer Id: {} has confidence: {}".format(
                    customer_id.value, customer_id.confidence
                )
            )
        customer_address = invoice.fields.get("CustomerAddress")
        if customer_address:
            print(
                "Customer Address: {} has confidence: {}".format(
                    customer_address.value, customer_address.confidence
                )
            )
        customer_address_recipient = invoice.fields.get("CustomerAddressRecipient")
        if customer_address_recipient:
            print(
                "Customer Address Recipient: {} has confidence: {}".format(
                    customer_address_recipient.value,
                    customer_address_recipient.confidence,
                )
            )
        invoice_id = invoice.fields.get("InvoiceId")
        if invoice_id:
            print(
                "Invoice Id: {} has confidence: {}".format(
                    invoice_id.value, invoice_id.confidence
                )
            )
        invoice_date = invoice.fields.get("InvoiceDate")
        if invoice_date:
            print(
                "Invoice Date: {} has confidence: {}".format(
                    invoice_date.value, invoice_date.confidence
                )
            )
        invoice_total = invoice.fields.get("InvoiceTotal")
        if invoice_total:
            print(
                "Invoice Total: {} has confidence: {}".format(
                    invoice_total.value, invoice_total.confidence
                )
            )
        due_date = invoice.fields.get("DueDate")
        if due_date:
            print(
                "Due Date: {} has confidence: {}".format(
                    due_date.value, due_date.confidence
                )
            )
        purchase_order = invoice.fields.get("PurchaseOrder")
        if purchase_order:
            print(
                "Purchase Order: {} has confidence: {}".format(
                    purchase_order.value, purchase_order.confidence
                )
            )
        billing_address = invoice.fields.get("BillingAddress")
        if billing_address:
            print(
                "Billing Address: {} has confidence: {}".format(
                    billing_address.value, billing_address.confidence
                )
            )
        billing_address_recipient = invoice.fields.get("BillingAddressRecipient")
        if billing_address_recipient:
            print(
                "Billing Address Recipient: {} has confidence: {}".format(
                    billing_address_recipient.value,
                    billing_address_recipient.confidence,
                )
            )
        shipping_address = invoice.fields.get("ShippingAddress")
        if shipping_address:
            print(
                "Shipping Address: {} has confidence: {}".format(
                    shipping_address.value, shipping_address.confidence
                )
            )
        shipping_address_recipient = invoice.fields.get("ShippingAddressRecipient")
        if shipping_address_recipient:
            print(
                "Shipping Address Recipient: {} has confidence: {}".format(
                    shipping_address_recipient.value,
                    shipping_address_recipient.confidence,
                )
            )
        print("Invoice items:")
        for idx, item in enumerate(invoice.fields.get("Items").value):
            item_description = item.value.get("Description")
            if item_description:
                print(
                    "......Description: {} has confidence: {}".format(
                        item_description.value, item_description.confidence
                    )
                )
            item_quantity = item.value.get("Quantity")
            if item_quantity:
                print(
                    "......Quantity: {} has confidence: {}".format(
                        item_quantity.value, item_quantity.confidence
                    )
                )
            unit = item.value.get("Unit")
            if unit:
                print(
                    "......Unit: {} has confidence: {}".format(
                        unit.value, unit.confidence
                    )
                )
            unit_price = item.value.get("UnitPrice")
            if unit_price:
                print(
                    "......Unit Price: {} has confidence: {}".format(
                        unit_price.value, unit_price.confidence
                    )
                )
            product_code = item.value.get("ProductCode")
            if product_code:
                print(
                    "......Product Code: {} has confidence: {}".format(
                        product_code.value, product_code.confidence
                    )
                )
            item_date = item.value.get("Date")
            if item_date:
                print(
                    "......Date: {} has confidence: {}".format(
                        item_date.value, item_date.confidence
                    )
                )
            tax = item.value.get("Tax")
            if tax:
                print(
                    "......Tax: {} has confidence: {}".format(tax.value, tax.confidence)
                )
            amount = item.value.get("Amount")
            if amount:
                print(
                    "......Amount: {} has confidence: {}".format(
                        amount.value, amount.confidence
                    )
                )
        subtotal = invoice.fields.get("SubTotal")
        if subtotal:
            print(
                "Subtotal: {} has confidence: {}".format(
                    subtotal.value, subtotal.confidence
                )
            )
        total_tax = invoice.fields.get("TotalTax")
        if total_tax:
            print(
                "Total Tax: {} has confidence: {}".format(
                    total_tax.value, total_tax.confidence
                )
            )
        previous_unpaid_balance = invoice.fields.get("PreviousUnpaidBalance")
        if previous_unpaid_balance:
            print(
                "Previous Unpaid Balance: {} has confidence: {}".format(
                    previous_unpaid_balance.value, previous_unpaid_balance.confidence
                )
            )
        amount_due = invoice.fields.get("AmountDue")
        if amount_due:
            print(
                "Amount Due: {} has confidence: {}".format(
                    amount_due.value, amount_due.confidence
                )
            )
        service_start_date = invoice.fields.get("ServiceStartDate")
        if service_start_date:
            print(
                "Service Start Date: {} has confidence: {}".format(
                    service_start_date.value, service_start_date.confidence
                )
            )
        service_end_date = invoice.fields.get("ServiceEndDate")
        if service_end_date:
            print(
                "Service End Date: {} has confidence: {}".format(
                    service_end_date.value, service_end_date.confidence
                )
            )
        service_address = invoice.fields.get("ServiceAddress")
        if service_address:
            print(
                "Service Address: {} has confidence: {}".format(
                    service_address.value, service_address.confidence
                )
            )
        service_address_recipient = invoice.fields.get("ServiceAddressRecipient")
        if service_address_recipient:
            print(
                "Service Address Recipient: {} has confidence: {}".format(
                    service_address_recipient.value,
                    service_address_recipient.confidence,
                )
            )
        remittance_address = invoice.fields.get("RemittanceAddress")
        if remittance_address:
            print(
                "Remittance Address: {} has confidence: {}".format(
                    remittance_address.value, remittance_address.confidence
                )
            )
        remittance_address_recipient = invoice.fields.get("RemittanceAddressRecipient")
        if remittance_address_recipient:
            print(
                "Remittance Address Recipient: {} has confidence: {}".format(
                    remittance_address_recipient.value,
                    remittance_address_recipient.confidence,
                )
            )


if __name__ == "__main__":
    recognize_invoice()

Execute a sua aplicação

  1. Navega até à pasta onde tens o ficheiro form_recognizer_quickstart.py .

  2. Digite o seguinte comando no seu terminal:

python form_recognizer_quickstart.py

| Document Intelligence REST API | Azure REST API reference |

Neste quickstart, utilizas as seguintes APIs para extrair dados estruturados de formulários e documentos:

Pré-requisitos

  • Azure subscrição - Criar uma gratuitamente

  • cURL instalado.

  • PowerShell versão 6.0+, ou uma aplicação semelhante de linha de comandos.

  • Um recurso de Ferramentas de Fabrico ou Inteligência de Documentos. Depois de ter a sua subscrição Azure, crie um recurso de Document Intelligence de serviço único ou multi-serviço no portal do Azure para obter a sua chave e endpoint. Podes usar o escalão de preços gratuito (F0) para experimentar o serviço, e depois fazer um upgrade para um nível pago para produção.

    Dica

    Crie um recurso Foundry se pretender aceder a várias Ferramentas Foundry através de um único ponto de acesso ou chave. Para acesso apenas à Inteligência Documental, crie um recurso de Inteligência Documental. Por favor, note que vai precisar de um recurso de serviço único se pretende usar autenticação Microsoft Entra.

  • Depois de o seu recurso ser implementado, selecione Ir para o recurso. Precisa da chave e do ponto final do recurso que cria para ligar a sua aplicação à API de Inteligência de Documentos. Colas a tua chave e endpoint no código mais tarde no quickstart:

    Captura de ecrã das chaves e localização do endpoint no portal Azure.

Selecione um exemplo de código para copiar e colar na sua aplicação:

Importante

Lembre-se de remover a chave do seu código quando terminar e nunca a publique publicamente. Para produção, usa uma forma segura de armazenar e aceder às tuas credenciais, como Azure Key Vault. Para mais informações, consulte a segurança das Ferramentas de Fundição.

Experimente: Modelo de layout

  • Para este exemplo, vai precisar de um ficheiro de documento numa URI. Pode usar o nosso documento exemplo para este início rápido.
  1. Substitua {endpoint} pelo endpoint que obteve com a sua subscrição do Document Intelligence.
  2. Substitui {key} pela chave que copiaste do passo anterior.
  3. Substitua \"{your-document-url} por um exemplo de URL de documento:
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf

Pedido

curl -v -i POST "https://{endpoint}/formrecognizer/v2.1/layout/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{​​​​​​​'urlSource': '{your-document-url}'}​​​​​​​​"

Localização da Operação

Recebe uma 202 (Success) resposta que inclui um cabeçalho Operation-Location . O valor deste cabeçalho contém um ID de resultado que pode usar para consultar o estado da operação assíncrona e obter os resultados:

https:// cognitiveservice/formrecognizer/v2.1/layout/analyzeResults/{resultId}.

No exemplo seguinte, como parte do URL, a string seguinte analyzeResults/ é o ID do resultado.

https://cognitiveservice/formrecognizer/v2/layout/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb

Obter resultados do layout

Depois de chamar a Analyze Layout API, chama a API Get Analyze Layout Result para obter o estado da operação e os dados extraídos. Antes de executares o comando, faz estas alterações:

  1. Substitua {endpoint} pelo endpoint que obteve com a sua subscrição do Document Intelligence.
  2. Substitui {key} pela chave que copiaste do passo anterior.
  3. Substitua {resultId} pelo ID do resultado do passo anterior.

Pedido

curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/layout/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {key}"

Analise os resultados

Recebes uma 200 (success) resposta com conteúdo JSON.

Veja a seguinte imagem da fatura e a sua correspondente saída em JSON.

  • O "readResults" nó contém cada linha de texto com a sua respetiva posição na caixa delimitadora da página.
  • O nó selectionMarks mostra todas as opções de seleção (caixa de seleção, botão de opção) e indica se o seu estado é selected ou unselected.
  • A "pageResults" secção inclui as tabelas extraídas. Para cada tabela, são extraídos o texto, o índice de linhas e colunas, a abrangência de linhas e colunas, a caixa delimitadora e mais.

Documento de instrução do projeto Contoso com uma tabela.

Órgão de resposta

Pode ver a saída completa da amostra no GitHub.

Experimenta: modelo pré-montado

  • Neste exemplo, vamos analisar um documento de fatura usando um modelo pré-construído. Pode usar o nosso documento exemplo de fatura para esta introdução rápida.

Escolha um modelo pré-montado

Não está limitado a faturas — existem vários modelos pré-definidos para escolher, cada um com o seu próprio conjunto de campos suportados. O modelo a utilizar para a analyze operação depende do tipo de documento a analisar. Aqui estão os modelos pré-construídos atualmente suportados pelo serviço de Inteligência Documental:

  • Fatura: extrai texto, marcas de seleção, tabelas, campos e informações chave das faturas.
  • Recibo: extrai texto e informações chave dos recibos.
  • Documento de identificação: extrai texto e informações essenciais das cartas de condução e passaportes internacionais.
  • Cartão de visita: extrai texto e informações importantes de cartões de visita.

Antes de executares o comando, faz estas alterações:

  1. Substitua {endpoint} pelo endpoint que obteve com a sua subscrição do Document Intelligence.

  2. Substitui {key} pela chave que copiaste do passo anterior.

  3. Substitua \"{your-document-url} por um exemplo de URL de fatura:

    https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf
    

Pedido

curl -v -i POST https://{endpoint}/formrecognizer/v2.1/prebuilt/invoice/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key:  {key}" --data-ascii "{​​​​​​​'urlSource': '{your invoice URL}'}​​​​​​​​"

Localização da Operação

Recebe uma 202 (Success) resposta que inclui um cabeçalho Operation-Location . O valor deste cabeçalho contém um ID de resultado que pode usar para consultar o estado da operação assíncrona e obter os resultados:

https:// cognitiveservice/formrecognizer/v2.1/prebuilt/receipt/analyzeResults/{resultId}

No exemplo seguinte, como parte da URL, a string seguinte analyzeResults/ é o ID do resultado:

https://cognitiveservice/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb

Obtenha resultados de faturas

Depois de ligares à Analyze Invoice API, ligas à API Get Analyze Invoice Result para obter o estado da operação e os dados extraídos. Antes de executares o comando, faz estas alterações:

  1. Substitua {endpoint} pelo endpoint que obteve com a sua chave de Inteligência de Documentos. Pode encontrá-lo no separador de Visão Geral de Recursos de Inteligência Documental.
  2. Substitua {resultId} pelo ID do resultado do passo anterior.
  3. Substitui {key} pela tua chave.

Pedido

curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {key}"

Analise a resposta

Recebes uma 200 (Success) resposta com saída JSON.

  • O "readResults" campo contém todas as linhas de texto extraídas da fatura.
  • As "pageResults" inclui as tabelas e marcações de seleção extraídas da fatura.
  • O "documentResults" campo contém informações-chave/valor para as partes mais relevantes da fatura.

Consulte o documento Modelo de fatura.

Órgão de resposta

Veja a saída da amostra completa no GitHub.

É isso, muito bem!

Próximos passos

  • Para uma experiência melhorada e qualidade de modelo avançada, experimente o Document Intelligence Studio.

    • O Studio suporta qualquer modelo treinado com dados rotulados v2.1.

    • Os registos de alterações fornecem informações detalhadas sobre a migração da v3.1 para a v4.0.