Quickstart: SDK voor C#-clientbibliotheek v3.0 | Voorbeeld

Notitie

Form Recognizer versie 3.0 is momenteel beschikbaar als openbare preview. Sommige functies worden mogelijk niet ondersteund of hebben beperkte mogelijkheden.

Referentiedocumentatie | Broncode van bibliotheek | Pakket (NuGet) | Voorbeelden

Aan de slag met Azure Form Recognizer de programmeertaal C#. Azure Form Recognizer is een cloudgebaseerde, door Azure toegepaste AI-service die gebruikmaakt van machine learning voor het extraheren en analyseren van formuliervelden, tekst en tabellen uit uw documenten. U kunt eenvoudig de Form Recognizer aanroepen door onze clientbibliotheek-SDK's te integreren in uw werkstromen en toepassingen. U wordt aangeraden de gratis service te gebruiken wanneer u de technologie leert. Houd er rekening mee dat het aantal gratis pagina's beperkt is tot 500 per maand.

Ga naar onze overzichtspagina Form Recognizer meer informatie over de functies en ontwikkelingsopties.

In deze quickstart gebruikt u de volgende functies om gegevens en waarden uit formulieren en documenten te analyseren en te extraheren:

  • 🆕 document :tekst, tabellen, structuur, sleutel-waardeparen en benoemde entiteiten analyseren en extraheren.

  • Indeling:tabellen, lijnen, woorden en selectiemarkeringen zoals keuzerondjes en selectievakjes in formulierendocumenten analyseren en extraheren, zonder dat u een model hoeft te trainen.

  • Vooraf gebouwd model (factuur) Algemene velden analyseren en extraheren uit facturen met behulp van een vooraf getraind factuurmodel.

Vereisten

Tip

Maak een Cognitive Services als u van plan bent toegang te krijgen tot meerdere cognitieve services onder één eindpunt/sleutel. Als Form Recognizer alleen toegang hebt, maakt u een Form Recognizer resource. Houd er rekening mee dat u een resource voor één service nodig hebt als u van plan bent om Azure Active Directory gebruiken.

  • Nadat uw resource is geïmplementeerd, selecteert u Ga naar resource. U hebt de sleutel en het eindpunt nodig van de resource die u maakt om uw toepassing te verbinden met Form Recognizer API. U plakt uw sleutel en eindpunt later in de onderstaande code in de quickstart:

    Schermopname: sleutels en eindpuntlocatie in de Azure Portal.

Instellen

  1. Start Visual Studio 2019.

  2. Kies op de startpagina De optie Een nieuw project maken.

    Schermopname: Visual Studio startvenster.

  3. Voer op de pagina Een nieuw project maken de console in het zoekvak in. Kies de sjabloon Consoletoepassing en kies vervolgens Volgende.

    Schermopname: de Visual Studio nieuwe projectpagina maken.

  4. Voer in het dialoogvenster Uw nieuwe project configureren in het vak Project naam formRecognizer_quickstart in. Kies vervolgens Volgende.

    Schermopname: het dialoogvenster Visual Studio nieuw project configureren.

  5. Selecteer in het dialoogvenster Aanvullende informatie .NET 5.0 (huidig) en selecteer vervolgens Maken.

    Schermopname: Visual Studio dialoogvenster met aanvullende informatie.

De clientbibliotheek installeren met NuGet

  1. Klik met de rechtermuisknop op uw formRecognizer_quickstart project en selecteer NuGet-pakketten beheren... .

    Schermopname: select-nuget-package.png

  2. Selecteer het tabblad Bladeren en typ Azure.AI.FormRecognizer.

    Schermopname: select-form-recognizer-package.png

  3. Kies het selectievakje Prerelease opnemen.

  4. Selecteer versie 4.0.0-beta.1 in de vervolgkeuzelijst en selecteer Installeren.

    {alt-text}

Uw toepassing bouwen

Als u wilt Form Recognizer service, moet u een exemplaar van de klasse DocumentAnalysisClient maken. Om dit te doen, maakt u een AzureKeyCredential met uw apiKey en een DocumentAnalysisClient exemplaar met de en uw Form Recognizer AzureKeyCredential endpoint .

  1. Open het bestand Program.cs.

  2. Neem de volgende using-instructies op:

    using System;
    using System.Threading.Tasks;
    using Azure;
    using Azure.AI.FormRecognizer;
    using Azure.AI.FormRecognizer.DocumentAnalysis;
    
  3. Stel uw endpoint apiKey omgevingsvariabelen en uw instantie en AzureKeyCredential DocumentAnalysisClient in:

    string endpoint = "<your-endpoint>";
    string apiKey = "<your-apiKey>";
    AzureKeyCredential credential = new AzureKeyCredential(apiKey);
    DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);
    
  4. Verwijder de regel , en voeg een van de try it-codevoorbeelden toe aan de Console.Writeline("Hello World!"); methode Main in het bestand Program.cs:

    Schermopname: voeg de voorbeeldcode toe aan de methode Main.

Selecteer een codevoorbeeld om de Main-methode van uw toepassing te kopiëren en plakken:

Belangrijk

Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en plaats deze sleutel nooit in het openbaar. Gebruik voor productie beveiligde methoden om uw referenties op te slaan en te openen. Zie het artikel Cognitive Services Beveiliging voor meer informatie.

Probeer het: Algemeen documentmodel

  • Voor dit voorbeeld hebt u een formulierdocumentbestand op een URI nodig. U kunt ons voorbeeldformulierdocument gebruiken voor deze quickstart.
  • Als u een bepaald bestand op een URI wilt analyseren, gebruikt u de StartAnalyzeDocumentFromUri methode . De geretourneerde waarde is AnalyzeResult een object met gegevens over het ingediende document.
  • We hebben de bestands-URI-waarde toegevoegd aan de string fileUri variabele boven aan de methode Main.
  • Ter vereenvoudiging worden alle entiteitsvelden die de service retourneert, hier niet weergegeven. Zie de pagina Algemeen documentconcept voor een overzicht van alle ondersteunde velden en bijbehorende typen.

Voeg de volgende code toe aan de main-methode van uw algemene documenttoepassing

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

AnalyzeDocumentOperation operation = await client.StartAnalyzeDocumentFromUriAsync("prebuilt-document", fileUri);

await operation.WaitForCompletionAsync();

AnalyzeResult result = operation.Value;

Console.WriteLine("Detected entities:");

foreach (DocumentEntity entity in result.Entities)
{
    if (entity.SubCategory == null)
    {
        Console.WriteLine($"  Found entity '{entity.Content}' with category '{entity.Category}'.");
    }
    else
    {
        Console.WriteLine($"  Found entity '{entity.Content}' with category '{entity.Category}' and sub-category '{entity.SubCategory}'.");
    }
}

Console.WriteLine("Detected key-value pairs:");

foreach (DocumentKeyValuePair kvp in result.KeyValuePairs)
{
    if (kvp.Value.Content == null)
    {
        Console.WriteLine($"  Found key with no value: '{kvp.Key.Content}'");
    }
    else
    {
        Console.WriteLine($"  Found key-value pair: '{kvp.Key.Content}' and '{kvp.Value.Content}'");
    }
}

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.BoundingBox[0].X}, Y= {line.BoundingBox[0].Y}");
        Console.WriteLine($"      Upper right => X: {line.BoundingBox[1].X}, Y= {line.BoundingBox[1].Y}");
        Console.WriteLine($"      Lower right => X: {line.BoundingBox[2].X}, Y= {line.BoundingBox[2].Y}");
        Console.WriteLine($"      Lower left => X: {line.BoundingBox[3].X}, Y= {line.BoundingBox[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.BoundingBox[0].X}, Y= {selectionMark.BoundingBox[0].Y}");
        Console.WriteLine($"      Upper right => X: {selectionMark.BoundingBox[1].X}, Y= {selectionMark.BoundingBox[1].Y}");
        Console.WriteLine($"      Lower right => X: {selectionMark.BoundingBox[2].X}, Y= {selectionMark.BoundingBox[2].Y}");
        Console.WriteLine($"      Lower left => X: {selectionMark.BoundingBox[3].X}, Y= {selectionMark.BoundingBox[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.Offset, 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}'.");
    }
}

Probeer het: Indelingsmodel

Extraheren van tekst, selectiemarkeringen, tekststijlen en tabelstructuren, samen met de coördinaten van de begrenzingsregio uit documenten.

  • Voor dit voorbeeld hebt u een formulierdocumentbestand op een URI nodig. U kunt ons voorbeeldformulierdocument gebruiken voor deze quickstart.
  • We hebben de bestands-URI-waarde toegevoegd aan de string fileUri variabele boven aan de methode Main.
  • Als u de indeling van een bepaald bestand op een URI wilt extraheren, gebruikt u de StartAnalyzeDocumentFromUri methode en door te geven als de prebuilt-layout model-id. De geretourneerde waarde is AnalyzeResult een object dat gegevens uit het ingediende document bevat.

Voeg de volgende code toe aan de main-methode van uw indelingstoepassing

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

AnalyzeDocumentOperation operation = await client.StartAnalyzeDocumentFromUriAsync("prebuilt-layout", fileUri);

await operation.WaitForCompletionAsync();

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.BoundingBox[0].X}, Y= {line.BoundingBox[0].Y}");
        Console.WriteLine($"      Upper right => X: {line.BoundingBox[1].X}, Y= {line.BoundingBox[1].Y}");
        Console.WriteLine($"      Lower right => X: {line.BoundingBox[2].X}, Y= {line.BoundingBox[2].Y}");
        Console.WriteLine($"      Lower left => X: {line.BoundingBox[3].X}, Y= {line.BoundingBox[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.BoundingBox[0].X}, Y= {selectionMark.BoundingBox[0].Y}");
        Console.WriteLine($"      Upper right => X: {selectionMark.BoundingBox[1].X}, Y= {selectionMark.BoundingBox[1].Y}");
        Console.WriteLine($"      Lower right => X: {selectionMark.BoundingBox[2].X}, Y= {selectionMark.BoundingBox[2].Y}");
        Console.WriteLine($"      Lower left => X: {selectionMark.BoundingBox[3].X}, Y= {selectionMark.BoundingBox[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.Offset, 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}'.");
    }
}

Probeer het: Vooraf gebouwd model

In dit voorbeeld wordt gedemonstreerd hoe u gegevens van bepaalde algemene documenttypen kunt analyseren met een vooraf getraind model, met behulp van een factuur als voorbeeld.

  • In dit voorbeeld analyseren we een factuurdocument met behulp van een vooraf gebouwd model. U kunt ons voorbeeld van een factuurdocument gebruiken voor deze quickstart.
  • We hebben de bestands-URI-waarde toegevoegd aan de string fileUri variabele boven aan de methode Main.
  • Als u een bepaald bestand op een URI wilt analyseren, gebruikt u de StartAnalyzeDocumentFromUri methode en door te geven als de prebuilt-invoice model-id. De geretourneerde waarde is AnalyzeResult een object dat gegevens uit het ingediende document bevat.
  • Ter vereenvoudiging worden alle sleutel-waardeparen die de service retourneert, hier niet weergegeven. Zie onze pagina Factuurconcept voor een overzicht van alle ondersteunde velden en bijbehorende typen.

De vooraf gebouwde model-id voor facturen kiezen

U bent niet beperkt tot facturen: er zijn verschillende vooraf gebouwde modellen waaruit u kunt kiezen, die elk een eigen set ondersteunde velden hebben. Het model dat voor de analysebewerking moet worden gebruikt, is afhankelijk van het type document dat moet worden geanalyseerd. Dit zijn de model-ID's voor de vooraf gebouwde modellen die momenteel worden ondersteund door de Form Recognizer service:

Voeg de volgende code toe aan de main-methode van uw vooraf gebouwde factuurtoepassing

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

using var stream = new FileStream(filePath, FileMode.Open);

AnalyzeDocumentOperation operation = await client.StartAnalyzeDocumentAsync("prebuilt-invoice", stream);

await operation.WaitForCompletionAsync();

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.ValueType == DocumentFieldType.String)
        {
            string vendorName = vendorNameField.AsString();
            Console.WriteLine($"Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
        }
    }

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

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

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

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

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

                    if (itemFields.TryGetValue("Amount", out DocumentField itemAmountField))
                    {
                        if (itemAmountField.ValueType == DocumentFieldType.Double)
                        {
                            double itemAmount = itemAmountField.AsDouble();

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

    if (document.Fields.TryGetValue("SubTotal", out DocumentField subTotalField))
    {
        if (subTotalField.ValueType == DocumentFieldType.Double)
        {
            double subTotal = subTotalField.AsDouble();
            Console.WriteLine($"Sub Total: '{subTotal}', with confidence {subTotalField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("TotalTax", out DocumentField totalTaxField))
    {
        if (totalTaxField.ValueType == DocumentFieldType.Double)
        {
            double totalTax = totalTaxField.AsDouble();
            Console.WriteLine($"Total Tax: '{totalTax}', with confidence {totalTaxField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("InvoiceTotal", out DocumentField invoiceTotalField))
    {
        if (invoiceTotalField.ValueType == DocumentFieldType.Double)
        {
            double invoiceTotal = invoiceTotalField.AsDouble();
            Console.WriteLine($"Invoice Total: '{invoiceTotal}', with confidence {invoiceTotalField.Confidence}");
        }
    }
}

Uw toepassing uitvoeren

Kies de groene knop Start naast formRecognizer_quickstart om uw programma te bouwen en uit te voeren, of druk op F5.

Schermopname: voer uw Visual Studio uit.

Gefeliciteerd In deze quickstart hebt u de Form Recognizer C# SDK gebruikt om verschillende formulieren en documenten op verschillende manieren te analyseren. Bekijk vervolgens de referentiedocumentatie voor meer informatie over Form Recognizer API.

Volgende stappen