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
F0na 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:
Nastavení
Spusťte Visual Studio 2019.
Na úvodní stránce zvolte Vytvořit nový projekt.
Na stránce Vytvořit nový projekt zadejte do vyhledávacího pole console. Zvolte šablonu Konzolová aplikace a pak zvolte Další.
V dialogovém okně Konfigurovat nový projekt zadejte
formRecognizer_quickstartdo pole Project název projektu. Pak zvolte Další.
V dialogovém okně Další informace vyberte .NET 5.0 (Aktuální) a pak vyberte Vytvořit.
Instalace klientské knihovny pomocí NuGet
Klikněte pravým tlačítkem na projekt formRecognizer_quickstart a vyberte Spravovat NuGet balíčky... .
Vyberte kartu Procházet a zadejte Azure.AI.FormRecognizer.
Zaškrtněte políčko Zahrnout předběžné verze.
V rozevírací nabídce vyberte verzi 4.0.0-beta.1 a vyberte Nainstalovat.
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 .
Otevřete soubor Program.cs.
Zahrnte následující direktivy using:
using System; using System.Threading.Tasks; using Azure; using Azure.AI.FormRecognizer; using Azure.AI.FormRecognizer.DocumentAnalysis;Nastavte
endpointproměnné prostředí a a vytvořte instanci aapiKeyAzureKeyCredentialDocumentAnalysisClient:string endpoint = "<your-endpoint>"; string apiKey = "<your-apiKey>"; AzureKeyCredential credential = new AzureKeyCredential(apiKey); DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);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:
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
StartAnalyzeDocumentFromUrimetodu . Vrácená hodnota je objektAnalyzeResultobsahující data o odeslaném dokumentu. - Do proměnné v horní části metody Main jsme přidali
string fileUrihodnotu 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 fileUrihodnotu identifikátoru URI souboru. - Pokud chcete extrahovat rozložení z daného souboru s identifikátorem URI, použijte metodu a
StartAnalyzeDocumentFromUrijakoprebuilt-layoutID modelu předejte . Vrácenou hodnotou jeAnalyzeResultobjekt 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 fileUrihodnotu identifikátoru URI souboru. - Pokud chcete analyzovat daný soubor s identifikátorem URI, použijte metodu a
StartAnalyzeDocumentFromUriprebuilt-invoicepředejte ji jako ID modelu. Vrácenou hodnotou jeAnalyzeResultobjekt 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.
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ářů.