public async Task BadRequestSnippet() { string endpoint = TestEnvironment.Endpoint; string apiKey = TestEnvironment.ApiKey; var credential = new AzureKeyCredential(apiKey); var client = new DocumentAnalysisClient(new Uri(endpoint), credential); #region Snippet:DocumentAnalysisBadRequest try { AnalyzeDocumentOperation operation = await client.StartAnalyzeDocumentFromUriAsync("prebuilt-receipt", new Uri("http://invalid.uri")); await operation.WaitForCompletionAsync(); } catch (RequestFailedException e) { Console.WriteLine(e.ToString()); } #endregion }
public async Task AnalyzePrebuiltDocumentFromUriAsync() { string endpoint = TestEnvironment.Endpoint; string apiKey = TestEnvironment.ApiKey; DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), new AzureKeyCredential(apiKey)); #region Snippet:FormRecognizerAnalyzePrebuiltDocumentFromUriAsync #if SNIPPET Uri fileUri = new Uri("<fileUri>"); #else Uri fileUri = DocumentAnalysisTestEnvironment.CreateUri("Form_1.jpg"); #endif AnalyzeDocumentOperation operation = await client.StartAnalyzeDocumentFromUriAsync("prebuilt-document", fileUri); await operation.WaitForCompletionAsync(); AnalyzeResult result = operation.Value; Console.WriteLine("Detected key-value pairs:"); foreach (DocumentKeyValuePair kvp in result.KeyValuePairs) { if (kvp.Value == 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}'"); } } 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}'."); } } 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}'."); } } #endregion }
public async Task ExtractLayoutFromUriAsync() { string endpoint = TestEnvironment.Endpoint; string apiKey = TestEnvironment.ApiKey; DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), new AzureKeyCredential(apiKey)); #region Snippet:FormRecognizerExtractLayoutFromUriAsync #if SNIPPET Uri fileUri = new Uri("<fileUri>"); #else Uri fileUri = DocumentAnalysisTestEnvironment.CreateUri("Form_1.jpg"); #endif 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 polygon (points ordered clockwise):"); for (int j = 0; j < line.BoundingPolygon.Points.Length; j++) { Console.WriteLine($" Point {j} => X: {line.BoundingPolygon[j].X}, Y: {line.BoundingPolygon[j].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 polygon (points ordered clockwise):"); for (int j = 0; j < selectionMark.BoundingPolygon.Points.Length; j++) { Console.WriteLine($" Point {j} => X: {selectionMark.BoundingPolygon[j].X}, Y: {selectionMark.BoundingPolygon[j].Y}"); } } } Console.WriteLine("Paragraphs:"); foreach (DocumentParagraph paragraph in result.Paragraphs) { Console.WriteLine($" Paragraph content: {paragraph.Content}"); if (paragraph.Role != null) { Console.WriteLine($" Role: {paragraph.Role}"); } } 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}'."); } } #endregion }
public async Task AnalyzePrebuiltReadFromUriAsync() { string endpoint = TestEnvironment.Endpoint; string apiKey = TestEnvironment.ApiKey; DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), new AzureKeyCredential(apiKey)); #region Snippet:FormRecognizerAnalyzePrebuiltReadFromUriAsync #if SNIPPET Uri fileUri = new Uri("<fileUri>"); #else Uri fileUri = DocumentAnalysisTestEnvironment.CreateUri("Form_1.jpg"); #endif AnalyzeDocumentOperation operation = await client.StartAnalyzeDocumentFromUriAsync("prebuilt-read", fileUri); await operation.WaitForCompletionAsync(); AnalyzeResult result = operation.Value; Console.WriteLine("Detected languages:"); foreach (DocumentLanguage language in result.Languages) { Console.WriteLine($" Found language '{language.LanguageCode}' with confidence {language.Confidence}."); } 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}"); } } 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)}"); } } } #endregion }
public async Task AnalyzeWithCustomModelFromUriAsync() { string endpoint = TestEnvironment.Endpoint; string apiKey = TestEnvironment.ApiKey; Uri trainingFileUri = new Uri(TestEnvironment.BlobContainerSasUrl); // Firstly, create a custom built model we can use to recognize the custom document. Please note // that models can also be built using a graphical user interface such as the Form Recognizer // Labeling Tool found here: // https://aka.ms/azsdk/formrecognizer/labelingtool var adminClient = new DocumentModelAdministrationClient(new Uri(endpoint), new AzureKeyCredential(apiKey)); BuildModelOperation buildOperation = await adminClient.StartBuildModelAsync(trainingFileUri); await buildOperation.WaitForCompletionAsync(); DocumentModel customModel = buildOperation.Value; // Proceed with the custom document recognition. DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), new AzureKeyCredential(apiKey)); #region Snippet:FormRecognizerAnalyzeWithCustomModelFromUriAsync #if SNIPPET string modelId = "<modelId>"; string fileUri = "<fileUri>"; #else Uri fileUri = DocumentAnalysisTestEnvironment.CreateUri("Form_1.jpg"); string modelId = customModel.ModelId; #endif AnalyzeDocumentOperation operation = await client.StartAnalyzeDocumentFromUriAsync(modelId, fileUri); await operation.WaitForCompletionAsync(); AnalyzeResult result = operation.Value; Console.WriteLine($"Document was analyzed with model with ID: {result.ModelId}"); foreach (AnalyzedDocument document in result.Documents) { Console.WriteLine($"Document of type: {document.DocType}"); foreach (KeyValuePair <string, DocumentField> fieldKvp in document.Fields) { string fieldName = fieldKvp.Key; DocumentField field = fieldKvp.Value; Console.WriteLine($"Field '{fieldName}': "); Console.WriteLine($" Content: '{field.Content}'"); Console.WriteLine($" Confidence: '{field.Confidence}'"); } } #endregion // Iterate over lines and selection marks on each page foreach (DocumentPage page in result.Pages) { Console.WriteLine($"Lines found on page {page.PageNumber}"); foreach (var line in page.Lines) { Console.WriteLine($" {line.Content}"); } Console.WriteLine($"Selection marks found on page {page.PageNumber}"); foreach (var selectionMark in page.SelectionMarks) { Console.WriteLine($" Selection mark is '{selectionMark.State}' with confidence {selectionMark.Confidence}"); } } // Iterate over the document tables for (int i = 0; i < result.Tables.Count; i++) { Console.WriteLine($"Table {i + 1}"); foreach (var cell in result.Tables[i].Cells) { Console.WriteLine($" Cell[{cell.RowIndex}][{cell.ColumnIndex}] has content '{cell.Content}' with kind '{cell.Kind}'"); } } // Delete the model on completion to clean environment. await adminClient.DeleteModelAsync(customModel.ModelId); }
public async Task AnalyzeWithPrebuiltModelFromUriAsync() { string endpoint = TestEnvironment.Endpoint; string apiKey = TestEnvironment.ApiKey; DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), new AzureKeyCredential(apiKey)); #region Snippet:FormRecognizerAnalyzeWithPrebuiltModelFromUriAsync #if SNIPPET string fileUri = "<fileUri>"; #else Uri fileUri = DocumentAnalysisTestEnvironment.CreateUri("Form_1.jpg"); #endif AnalyzeDocumentOperation operation = await client.StartAnalyzeDocumentFromUriAsync("prebuilt-invoice", fileUri); await operation.WaitForCompletionAsync(); AnalyzeResult result = operation.Value; // To see the list of all the supported fields returned by service and its corresponding types for the // prebuilt-invoice model, consult: // https://aka.ms/azsdk/formrecognizer/invoicefieldschema 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}"); } } } #endregion }