Hızlı Başlangıç: C# istemci kitaplığı SDK v3.0 | Önizleme

Not

Form Tanıma v3.0 şu anda genel önizlemededir. Bazı özellikler desteklenmiyor veya sınırlı özelliklere sahip olabilir.

Başvuru belgeleri | Kitaplık kaynak kodu | Paket (NuGet) | Örnekleri

Kullanmaya başlayın C# Form Tanıma kullanarak Azure Form Tanıma ile birlikte kullanın. Azure Form Tanıma, belgelerinizin form alanlarını, metinlerini ve tablolarını ayıklamak ve analiz etmek için makine öğrenmesini kullanan bulut tabanlı bir Azure Uygulamalı AI Hizmetidir. İstemci kitaplığı SDK'larımızı iş akışlarınıza ve uygulamalarınıza tümleştirerek Form Tanıma modellerini kolayca çağırabilirsiniz. Teknolojiyi öğrenerek ücretsiz hizmeti kullanmalarını öneririz. Ücretsiz sayfa sayısının aylık 500 ile sınırlı olduğunu unutmayın.

Özellikleri ve geliştirme seçeneklerini Form Tanıma daha fazla bilgi edinmek için Genel Bakış sayfamızı ziyaret edin.

Bu hızlı başlangıçta formlardan ve belgelerden verileri ve değerleri analiz etmek ve ayıklamak için aşağıdaki özellikleri kullanacağız:

  • 🆕 - Metin,tablo, yapı, anahtar-değer çiftleri ve adlandırılmış varlıkları analiz edip ayıklar.

  • Düzen—Model eğitmeden tabloları, satırları, sözcükleri ve radyo düğmeleri ve form belgelerinden onay kutuları gibi seçim işaretlerini analiz edip ayıklar.

  • Önceden oluşturulmuş model (fatura) Önceden eğitilmiş bir fatura modelini kullanarak faturalardan yaygın alanları analiz etme ve ayıklama.

Önkoşullar

  • Azure aboneliği - Ücretsiz bir abonelik oluşturun.

  • IDE'nin Visual Studio sürümü.

  • Bilişsel Hizmetler veya Form Tanıma. Azure aboneliğinize sahip olduktan sonra, anahtarınızı ve uç noktanızı almak için Form Tanıma tek hizmetli veya çok hizmetli bir Azure portal kaynak oluşturun. Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek üzere ücretsiz fiyatlandırma katmanını ( F0 ) kullanabilirsiniz.

İpucu

Tek bir uç nokta/anahtar altında birden çok bilişsel hizmetlere erişmeyi planlıyorsanız Bilişsel Hizmetler kaynağı oluşturun. Yalnızca Form Tanıma erişim için bir Form Tanıma oluşturun. Kimlik doğrulamasını kullanmak için tek hizmetli bir kaynağa ihtiyacınız Azure Active Directory unutmayın.

  • Kaynağınız dağıt edildikten sonra Kaynağa git'i seçin. Uygulamanıza api'sini bağlamak için, kaynakta yer alan anahtara ve uç Form Tanıma gerekir. Hızlı başlangıçta anahtarınızı ve uç noktanızı aşağıdaki koda yapıştırabilirsiniz:

    Ekran görüntüsü: Anahtarlar ve uç nokta konumu Azure portal.

Kurulum

  1. Visual Studio 2019’u başlatın.

  2. Başlangıç sayfasında Yeni proje oluştur'a tıklayın.

    Ekran görüntüsü: Visual Studio penceresi.

  3. Yeni proje oluştur sayfasında, arama kutusuna konsolu girin. Konsol Uygulaması şablonunu ve ardından Sonraki'yi seçin.

    Ekran görüntüsü: Visual Studio proje oluştur sayfası.

  4. Yeni projenizi yapılandır iletişim kutusuna Yeni formRecognizer_quickstart projenizin Project girin. Ardından, Sonraki'yi seçin.

    Ekran görüntüsü: Visual Studio proje yapılandır iletişim kutusu.

  5. Ek bilgiler iletişim kutusunda .NET 5.0 (Geçerli) seçeneğini ve ardından Oluştur'a tıklayın.

    Ekran görüntüsü: Visual Studio fazla bilgi iletişim kutusu penceresi.

İstemci kitaplığını NuGet

  1. FormRecognizer_quickstart projenize sağ tıklayın ve Paketleri Yönet... NuGet seçin.

    Ekran görüntüsü: select-nuget-package.png

  2. Gözat sekmesini seçin ve Azure.AI.FormRecognizer yazın.

    Ekran görüntüsü: select-form-recognizer-package.png

  3. Önserlik dahil edin onay kutusunu seçin.

  4. Açılan menüden sürüm 4.0.0-beta.1'i seçin ve Yükle'yi seçin.

    {alternatif-metin}

Uygulamanızı derleme

Form Tanıma için sınıfının bir örneğini oluşturmanız DocumentAnalysisClient gerekir. Bunu yapmak için apiKey'iniz ile bir örneği ve ile birlikte bir AzureKeyCredential DocumentAnalysisClient örneği AzureKeyCredential endpoint Form Tanıma.

  1. Program.cs dosyasını açın.

  2. Aşağıdaki using yönergelerini içerir:

    using System;
    using System.Threading.Tasks;
    using Azure;
    using Azure.AI.FormRecognizer;
    using Azure.AI.FormRecognizer.DocumentAnalysis;
    
  3. ve ortam endpoint apiKey değişkenlerinizi ayarlayın ve ve AzureKeyCredential örneğinizi DocumentAnalysisClient oluşturun:

    string endpoint = "<your-endpoint>";
    string apiKey = "<your-apiKey>";
    AzureKeyCredential credential = new AzureKeyCredential(apiKey);
    DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);
    
  4. satırı olan dosyasını silin ve Try It kod örneklerinden Console.Writeline("Hello World!"); birini Program.cs dosyasındaki Main yöntemine ekleyin:

    Ekran görüntüsü: Örnek kodu Main yöntemine ekleyin.

Kopyalayıp uygulamanın Main yöntemine yapıştırmak için bir kod örneği seçin:

Önemli

Bitirilen anahtarı kodunuzdan kaldırmayı unutmayın ve hiçbir zaman herkese açık şekilde yayınlayamayabilirsiniz. Üretim için, kimlik bilgilerinizi depolamak ve erişmek için güvenli yöntemler kullanın. Daha fazla bilgi için Bilişsel Hizmetler güvenliği makalesine bakın.

Deneyin: Genel belge modeli

  • Bu örnekte, URI'de bir form belgesi dosyası gerekir. Bu hızlı başlangıç için örnek form belgemizi kullanabilirsiniz.
  • URI'de verilen bir dosyayı analiz etmek için yöntemini StartAnalyzeDocumentFromUri kullanabilirsiniz. Döndürülen değer, gönderilen AnalyzeResult belgeyle ilgili verileri içeren bir nesnedir.
  • Main yönteminin en üstünde yer alan string fileUri değişkenine dosya URI'sı değerini ekledik.
  • Kolaylık olması için hizmetin döndürtt olduğu tüm varlık alanları burada gösterilmez. Desteklenen tüm alanların ve karşılık gelen türlerin listesini görmek için Genel belge kavramı sayfamıza bakın.

Genel belge uygulaması Main yönteminize aşağıdaki kodu ekleyin

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

Deneyin: Düzen modeli

Belgelerden sınırlayıcı bölge koordinatlarıyla birlikte metin, seçim işaretleri, metin stilleri ve tablo yapılarını ayıklar.

  • Bu örnekte, URI'de bir form belgesi dosyası gerekir. Bu hızlı başlangıç için örnek form belgemizi kullanabilirsiniz.
  • Main yönteminin en üstünde yer alan string fileUri değişkenine dosya URI'sı değerini ekledik.
  • URI'de verilen bir dosyadan düzeni ayıklamak için yöntemini StartAnalyzeDocumentFromUri kullanın ve model kimliği olarak prebuilt-layout geçişini kullanın. Döndürülen değer, gönderilen AnalyzeResult belgeden verileri içeren bir nesnedir.

Düzen uygulaması Main yönteminize aşağıdaki kodu ekleyin

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

Deneyin: Önceden oluşturulmuş model

Bu örnekte, örnek olarak fatura kullanılarak önceden eğitilmiş bir modelle belirli ortak belge türlerinden gelen verilerin nasıl analiz edilir?

  • Bu örnekte önceden oluşturulmuş bir modeli kullanarak fatura belgesini analiz edersiniz. Bu hızlı başlangıç için örnek fatura belgemizi kullanabilirsiniz.
  • Main yönteminin en üstünde yer alan string fileUri değişkenine dosya URI'sı değerini ekledik.
  • URI'de verilen bir dosyayı analiz etmek için yöntemini StartAnalyzeDocumentFromUri kullanın ve model kimliği olarak prebuilt-invoice geçişin. Döndürülen değer, gönderilen AnalyzeResult belgeden verileri içeren bir nesnedir.
  • Kolaylık olması için hizmetin döndürtt olduğu tüm anahtar-değer çiftleri burada gösterilmez. Desteklenen tüm alanların ve karşılık gelen türlerin listesini görmek için Fatura kavramı sayfamıza bakın.

Fatura önceden oluşturulmuş model kimliğini seçme

Faturalar sınırlı değildir; her biri kendi desteklenen alan kümesine sahip olan, önceden oluşturulmuş birkaç modelden birini seçebilirsiniz. Analiz işlemi için kullanılan model, analiz için belgenin türüne bağlıdır. Şu anda Form Tanıma hizmeti tarafından desteklenen önceden oluşturulmuş modellerin model kimlikleri:

Önceden oluşturulmuş fatura uygulaması Main yönteminize aşağıdaki kodu ekleyin

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

Uygulamanızı çalıştırma

Programınızı derlemek ve çalıştırmak için formRecognizer_quickstart yanındaki yeşil Başlat düğmesini seçin veya F5 tuşuna basın.

Ekran görüntüsü: Visual Studio programınızı çalıştırın.

Tebrikler! Bu hızlı başlangıçta, çeşitli formları ve belgeleri farklı Form Tanıma analiz etmek için Form Tanıma C# SDK'sı kullandık. Daha sonra, api'ler hakkında daha ayrıntılı bilgi Form Tanıma başvuru belgelerini inceleyin.

Sonraki adımlar