Rychlý start: Sada SDK klientské knihovny pro jazyk C# verze 3.0 | Náhled

Poznámka

Rozpoznávání formulářů verze 3.0 je aktuálně ve verzi Public Preview. Některé funkce nemusí být podporované nebo mají omezené možnosti.

Referenční dokumentace | Zdrojový kód knihovny | Ukázky balíčků (NuGet) |

Začínáme s Azure Rozpoznávání formulářů s využitím programovacího jazyka C#. Azure Rozpoznávání formulářů je cloudová služba Azure Applied AI Service, která pomocí strojového učení extrahuje a analyzuje pole formuláře, text a tabulky z vašich dokumentů. Můžete snadno volat Rozpoznávání formulářů integrací našich klientských knihoven SDK do vašich pracovních postupů a aplikací. Doporučujeme používat bezplatnou službu, když se s technologií učíte. Nezapomeňte, že počet bezplatných stránek je omezený na 500 za měsíc.

Další informace o funkcích Rozpoznávání formulářů a možnostech vývoje najdete na naší stránce Přehled.

V tomto rychlém startu použijete následující funkce k analýze a extrahování dat a hodnot z formulářů a dokumentů:

  • 🆕 obecný dokument– analýza a extrahování textu, tabulek, struktury, párů klíč-hodnota a pojmenovaných entit

  • Rozložení– analyzujte a extrahujte tabulky, řádky, slova a značky výběru, jako jsou přepínače a zaškrtávací políčka ve formulářích dokumentů, aniž byste trénovali model.

  • Předem připravený model (faktura) Analyzujte a extrahujte běžná pole z faktur pomocí předem natrénovaných modelů faktur.

Požadavky

  • Předplatné Azure – Vytvořte si ho zdarma.

  • Aktuální verze integrovaného vývojového Visual Studio .

  • Prostředek Cognitive Services nebo Rozpoznávání formulářů. Jakmile máte předplatné Azure, vytvořte prostředek služby s jednou nebo více Rozpoznávání formulářů ve službě Azure Portal a získejte svůj klíč a koncový bod. K vyzkoušejí služby můžete použít bezplatnou cenovou úroveň ( ) a později upgradovat F0 na placenou úroveň pro produkční prostředí.

Tip

Pokud plánujete Cognitive Services více kognitivních služeb v rámci jednoho koncového bodu nebo klíče, vytvořte nový prostředek. Pro Rozpoznávání formulářů přístup vytvořte prostředek Rozpoznávání formulářů. Upozorňujeme, že pokud chcete použít ověřování pomocí služby , budete potřebovat Azure Active Directory službu.

  • Po nasazení prostředku vyberte Přejít k prostředku. Klíč a koncový bod z prostředku, který vytvoříte, potřebujete pro připojení aplikace k Rozpoznávání formulářů API. Klíč a koncový bod vložíte do kódu níže v pozdější části tohoto rychlého startu:

    Snímek obrazovky: Klíče a umístění koncového bodu v Azure Portal

Nastavení

  1. Spusťte Visual Studio 2019.

  2. Na úvodní stránce zvolte Vytvořit nový projekt.

    Snímek obrazovky: Visual Studio úvodní okno

  3. Na stránce Vytvořit nový projekt zadejte do vyhledávacího pole console. Zvolte šablonu Konzolová aplikace a pak zvolte Další.

    Snímek obrazovky: Visual Studio vytvořit nový projekt

  4. V dialogovém okně Konfigurovat nový projekt zadejte formRecognizer_quickstart do pole Project název projektu. Pak zvolte Další.

    Snímek obrazovky: Visual Studio dialogového okna Konfigurace nového projektu

  5. V dialogovém okně Další informace vyberte .NET 5.0 (Aktuální) a pak vyberte Vytvořit.

    Snímek obrazovky Visual Studio dialogové okno s dalšími informacemi

Instalace klientské knihovny pomocí NuGet

  1. Klikněte pravým tlačítkem na projekt formRecognizer_quickstart a vyberte Spravovat NuGet balíčky... .

    Snímek obrazovky: select-nuget-package.png

  2. Vyberte kartu Procházet a zadejte Azure.AI.FormRecognizer.

    Snímek obrazovky: select-form-recognizer-package.png

  3. Zaškrtněte políčko Zahrnout předběžné verze.

  4. V rozevírací nabídce vyberte verzi 4.0.0-beta.1 a vyberte Nainstalovat.

    {alt-text}

Sestavení aplikace

Pokud chcete Rozpoznávání formulářů službou, budete muset vytvořit instanci DocumentAnalysisClient třídy . K tomu vytvoříte objekt s AzureKeyCredential apiKey a instancí s objektem a vaší DocumentAnalysisClient instancí Rozpoznávání formulářů AzureKeyCredential endpoint .

  1. Otevřete soubor Program.cs.

  2. Zahrnte následující direktivy using:

    using System;
    using System.Threading.Tasks;
    using Azure;
    using Azure.AI.FormRecognizer;
    using Azure.AI.FormRecognizer.DocumentAnalysis;
    
  3. Nastavte endpoint proměnné prostředí a a vytvořte instanci a apiKey AzureKeyCredential DocumentAnalysisClient :

    string endpoint = "<your-endpoint>";
    string apiKey = "<your-apiKey>";
    AzureKeyCredential credential = new AzureKeyCredential(apiKey);
    DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);
    
  4. Odstraňte řádek a přidejte jednu ze ukázek kódu Try It do Console.Writeline("Hello World!"); metody Main v souboru Program.cs:

    Snímek obrazovky: Přidejte ukázkový kód do metody Main.

Vyberte vzorový kód, který chcete zkopírovat a vložit do metody Main vaší aplikace:

Důležité

Až budete hotovi, nezapomeňte klíč z kódu odebrat a nikdy ho veřejně ne zveřejníte. V produkčním prostředí použijte zabezpečené metody pro ukládání přihlašovacích údajů a přístup k přihlašovacím údajům. Další informace najdete Cognitive Services zabezpečení sítě.

Vyzkoušet: Obecný model dokumentu

  • V tomto příkladu budete potřebovat soubor dokumentu formuláře s identifikátorem URI. Pro tento rychlý start můžete použít náš ukázkový dokument formuláře.
  • K analýze daného souboru s identifikátorem URI použijete StartAnalyzeDocumentFromUri metodu . Vrácená hodnota je objekt AnalyzeResult obsahující data o odeslaném dokumentu.
  • Do proměnné v horní části metody Main jsme přidali string fileUri hodnotu identifikátoru URI souboru.
  • Pro zjednodušení se zde nezobrazí všechna pole entity, která služba vrací. Seznam všech podporovaných polí a odpovídajících typů najdete na naší stránce Koncepty obecného dokumentu.

Do metody Main obecné dokumentové aplikace přidejte následující kód.

// 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}'.");
    }
}

Vyzkoušet: Model rozložení

Extrahujte text, značky výběru, styly textu a struktury tabulek spolu s jejich souřadnicemi ohraničující oblasti z dokumentů.

  • V tomto příkladu budete potřebovat soubor dokumentu formuláře s identifikátorem URI. Pro tento rychlý start můžete použít náš ukázkový dokument formuláře.
  • Do proměnné v horní části metody Main jsme přidali string fileUri hodnotu identifikátoru URI souboru.
  • Pokud chcete extrahovat rozložení z daného souboru s identifikátorem URI, použijte metodu a StartAnalyzeDocumentFromUri jako prebuilt-layout ID modelu předejte . Vrácenou hodnotou je AnalyzeResult objekt obsahující data z odeslaného dokumentu.

Do hlavní metody aplikace rozložení přidejte následující kód.

// 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}'.");
    }
}

Vyzkoušet: Předem připravený model

Tato ukázka ukazuje, jak analyzovat data z určitých běžných typů dokumentů s předem natrénovaný model a jako příklad použít fakturu.

  • V tomto příkladu analyzujeme dokument faktury pomocí předem sestavených modelů. Pro tento rychlý start můžete použít náš ukázkový dokument faktury.
  • Do proměnné v horní části metody Main jsme přidali string fileUri hodnotu identifikátoru URI souboru.
  • Pokud chcete analyzovat daný soubor s identifikátorem URI, použijte metodu a StartAnalyzeDocumentFromUri prebuilt-invoice předejte ji jako ID modelu. Vrácenou hodnotou je AnalyzeResult objekt obsahující data z odeslaného dokumentu.
  • Pro zjednodušení se tady nezobrazí všechny páry klíč-hodnota, které služba vrací. Pokud chcete zobrazit seznam všech podporovaných polí a odpovídajících typů, podívejte se na naši stránku konceptu faktury.

Volba ID modelu předem sestavené faktury

Nejste omezeni na faktury – existuje několik předem připravených modelů, ze kterých si můžete vybrat, z nichž každý má vlastní sadu podporovaných polí. Model, který se má použít pro operaci analýzy, závisí na typu dokumentu, který se má analyzovat. Tady jsou ID modelů pro předem sestavené modely, které aktuálně podporuje Rozpoznávání formulářů služby:

  • prebuilt-invoice: Extrahuje text, značky výběru, tabulky, páry klíč-hodnota a klíčové informace z faktur.
  • prebuilt-receipt: Extrahuje z účtenek textové a klíčové informace.
  • prebuilt-idDocument:Extrahuje textové a klíčové informace z řidičský průkazů a mezinárodních pasů.
  • prebuilt-businessCard:Extrahuje textové a klíčové informace z vizitek.

Do metody Main vaší předem sestavené aplikace faktur přidejte následující kód.

// 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}");
        }
    }
}

Spusťte aplikaci

Zvolte zelené tlačítko Start vedle formRecognizer_quickstart pro sestavování a spouštění programu nebo stiskněte klávesu F5.

snímek obrazovky: spusťte Visual Studio program.

Gratulujeme! V tomto rychlém startu jste použili sadu pro rozpoznávání formulářů C# SDK k analýze různých formulářů a dokumentů různými způsoby. Dále si Prozkoumejte referenční dokumentaci, kde najdete další informace o rozhraní API pro rozpoznávání formulářů.

Další kroky