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.
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:
Kurulum
Visual Studio 2019’u başlatın.
Başlangıç sayfasında Yeni proje oluştur'a tıklayın.
Yeni proje oluştur sayfasında, arama kutusuna konsolu girin. Konsol Uygulaması şablonunu ve ardından Sonraki'yi seçin.
Yeni projenizi yapılandır iletişim kutusuna Yeni
formRecognizer_quickstartprojenizin Project girin. Ardından, Sonraki'yi seçin.
Ek bilgiler iletişim kutusunda .NET 5.0 (Geçerli) seçeneğini ve ardından Oluştur'a tıklayın.
İstemci kitaplığını NuGet
FormRecognizer_quickstart projenize sağ tıklayın ve Paketleri Yönet... NuGet seçin.
Gözat sekmesini seçin ve Azure.AI.FormRecognizer yazın.
Önserlik dahil edin onay kutusunu seçin.
Açılan menüden sürüm 4.0.0-beta.1'i seçin ve Yükle'yi seçin.
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.
Program.cs dosyasını açın.
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;ve ortam
endpointapiKeydeğişkenlerinizi ayarlayın ve veAzureKeyCredentialörneğiniziDocumentAnalysisClientoluşturun:string endpoint = "<your-endpoint>"; string apiKey = "<your-apiKey>"; AzureKeyCredential credential = new AzureKeyCredential(apiKey); DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);satırı olan dosyasını silin ve Try It kod örneklerinden
Console.Writeline("Hello World!");birini Program.cs dosyasındaki 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
StartAnalyzeDocumentFromUrikullanabilirsiniz. Döndürülen değer, gönderilenAnalyzeResultbelgeyle ilgili verileri içeren bir nesnedir. - Main yönteminin en üstünde yer alan
string fileUrideğ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 fileUrideğişkenine dosya URI'sı değerini ekledik. - URI'de verilen bir dosyadan düzeni ayıklamak için yöntemini
StartAnalyzeDocumentFromUrikullanın ve model kimliği olarakprebuilt-layoutgeçişini kullanın. Döndürülen değer, gönderilenAnalyzeResultbelgeden 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 fileUrideğişkenine dosya URI'sı değerini ekledik. - URI'de verilen bir dosyayı analiz etmek için yöntemini
StartAnalyzeDocumentFromUrikullanın ve model kimliği olarakprebuilt-invoicegeçişin. Döndürülen değer, gönderilenAnalyzeResultbelgeden 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:
- prebuilt-invoice:Faturalardan metin, seçim işaretleri, tablolar, anahtar-değer çiftleri ve anahtar bilgilerini ayıklar.
- önceden oluşturulmuş makbuz:Makbuzlardan metin ve anahtar bilgilerini ayıklar.
- prebuilt-idDocument:Sürücü lisanslarından ve uluslararası passportlardan metin ve anahtar bilgilerini ayıklar.
- prebuilt-businessCard:kartvizitlerden metin ve anahtar bilgilerini ayıklar.
Ö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.
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.