From 640476c9999a8c77a60b962fa3d03780a4640c63 Mon Sep 17 00:00:00 2001 From: Caio Saldanha Date: Thu, 4 Jun 2020 10:07:21 -0700 Subject: [PATCH 1/8] Missing samples --- .../src/AccountProperties.cs | 4 +- .../src/CustomFormSubmodel.cs | 6 +- .../Azure.AI.FormRecognizer/src/FormField.cs | 8 +- .../src/FormField{T}.cs | 63 -------- .../Azure.AI.FormRecognizer/src/FormLine.cs | 2 +- .../src/FormRecognizerError.cs | 4 +- .../src/ReceiptExtensions.cs | 22 --- .../src/RecognizedReceipt.cs | 83 +--------- .../src/TrainingDocumentInfo.cs | 2 +- .../Azure.AI.FormRecognizer/src/USReceipt.cs | 152 ------------------ .../src/USReceiptItem.cs | 39 ----- .../src/USReceiptType.cs | 41 ----- .../FormRecognizerClientLiveTests.cs | 72 ++++++--- 13 files changed, 61 insertions(+), 437 deletions(-) delete mode 100644 sdk/formrecognizer/Azure.AI.FormRecognizer/src/FormField{T}.cs delete mode 100644 sdk/formrecognizer/Azure.AI.FormRecognizer/src/ReceiptExtensions.cs delete mode 100644 sdk/formrecognizer/Azure.AI.FormRecognizer/src/USReceipt.cs delete mode 100644 sdk/formrecognizer/Azure.AI.FormRecognizer/src/USReceiptItem.cs delete mode 100644 sdk/formrecognizer/Azure.AI.FormRecognizer/src/USReceiptType.cs diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/AccountProperties.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/src/AccountProperties.cs index 3c8ef96595dd1..8bf20a1465842 100644 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/AccountProperties.cs +++ b/sdk/formrecognizer/Azure.AI.FormRecognizer/src/AccountProperties.cs @@ -20,11 +20,11 @@ internal AccountProperties(ModelsSummary_internal summary) /// /// The current count of trained custom models. /// - public int CustomModelCount { get; internal set; } + public int CustomModelCount { get; } /// /// The maximum number of models that can be trained for this subscription. /// - public int CustomModelLimit { get; internal set; } + public int CustomModelLimit { get; } } } diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/CustomFormSubmodel.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/src/CustomFormSubmodel.cs index 3e447da0b1662..ea70a84941e4c 100644 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/CustomFormSubmodel.cs +++ b/sdk/formrecognizer/Azure.AI.FormRecognizer/src/CustomFormSubmodel.cs @@ -20,13 +20,13 @@ internal CustomFormSubmodel(string formType, float? accuracy, IReadOnlyDictionar /// /// The type of form this submodel recognizes. /// - public string FormType { get; internal set; } + public string FormType { get; } /// /// The mean of the accuracies of this model's /// instances. /// - public float? Accuracy { get; internal set; } + public float? Accuracy { get; } /// /// A dictionary of the fields that this submodel will recognize from the @@ -35,6 +35,6 @@ internal CustomFormSubmodel(string formType, float? accuracy, IReadOnlyDictionar /// label of the field. For models trained with forms only, a unique name is /// generated for each field. /// - public IReadOnlyDictionary Fields { get; internal set; } + public IReadOnlyDictionary Fields { get; } } } diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/FormField.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/src/FormField.cs index 3c663735a27cb..e98459efb294a 100644 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/FormField.cs +++ b/sdk/formrecognizer/Azure.AI.FormRecognizer/src/FormField.cs @@ -53,22 +53,22 @@ internal FormField(string name, FieldValue_internal fieldValue, IReadOnlyList /// Canonical name; uniquely identifies a field within the form. /// - public string Name { get; internal set; } + public string Name { get; } /// /// Contains the text, bounding box and content of the label of the field in the form. /// - public FieldText LabelText { get; internal set; } + public FieldText LabelText { get; } /// /// Contains the text, bounding box and content of the value of the field in the form. /// - public FieldText ValueText { get; internal set; } + public FieldText ValueText { get; } /// /// The strongly-typed value of this . /// - public FieldValue Value { get; internal set; } + public FieldValue Value { get; } /// /// Measures the degree of certainty of the recognition result. Value is between [0.0, 1.0]. diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/FormField{T}.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/src/FormField{T}.cs deleted file mode 100644 index e5effd42060cb..0000000000000 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/FormField{T}.cs +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -namespace Azure.AI.FormRecognizer.Models -{ - /// - /// Represents a field recognized in the input form, where the field's value is of a known type. - /// - /// The type of the value in the field this instance represents. - /// - /// This class is used in place of a generic when its value - /// has a known type. - /// - public class FormField - { - internal FormField(T value) - { - Value = value; - } - - internal FormField(FormField field, T value) - { - Confidence = field.Confidence; - LabelText = field.LabelText; - Name = field.Name; - ValueText = field.ValueText; - Value = value; - } - - /// - /// Canonical name; uniquely identifies a field within the form. - /// - public string Name { get; internal set; } - - /// - /// Contains the text, bounding box and content of the label of the field in the form. - /// - public FieldText LabelText { get; internal set; } - - /// - /// Contains the text, bounding box and content of the value of the field in the form. - /// - public FieldText ValueText { get; internal set; } - - /// - /// The strongly-typed value of this . - /// - public T Value { get; internal set; } - - /// - /// Measures the degree of certainty of the recognition result. Value is between [0.0, 1.0]. - /// - public float Confidence { get; } - - /// - /// Implicitly converts a instance into a , using the - /// value returned by . - /// - /// The instance to be converted into a . - /// The corresponding to the value of the specified instance. - public static implicit operator T(FormField field) => field.Value; - } -} diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/FormLine.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/src/FormLine.cs index da1a506df9f40..f4f69f67cbf44 100644 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/FormLine.cs +++ b/sdk/formrecognizer/Azure.AI.FormRecognizer/src/FormLine.cs @@ -19,7 +19,7 @@ internal FormLine(TextLine_internal textLine, int pageNumber) /// /// A list of the words that make up the line. /// - public IReadOnlyList Words { get; internal set; } + public IReadOnlyList Words { get; } private static IReadOnlyList ConvertWords(IReadOnlyList textWords, int pageNumber) { diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/FormRecognizerError.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/src/FormRecognizerError.cs index 0964573acc3d5..1f1575d416700 100644 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/FormRecognizerError.cs +++ b/sdk/formrecognizer/Azure.AI.FormRecognizer/src/FormRecognizerError.cs @@ -16,12 +16,12 @@ public partial class FormRecognizerError /// The error code. /// [CodeGenMember("Code")] - public string ErrorCode { get; internal set; } + public string ErrorCode { get; } /// /// The error message. /// [CodeGenMember("Message")] - public string Message { get; internal set; } + public string Message { get; } } } diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/ReceiptExtensions.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/src/ReceiptExtensions.cs deleted file mode 100644 index 84bfdde9d1171..0000000000000 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/ReceiptExtensions.cs +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -namespace Azure.AI.FormRecognizer.Models -{ - /// - /// The set of extension methods for the class. - /// - public static class ReceiptExtensions - { - /// - /// Converts a instance with an "en-US" - /// into a . - /// - /// The instance that this method was invoked on. - /// A new instance generated from the original receipt. - public static USReceipt AsUSReceipt(this RecognizedReceipt receipt) - { - return new USReceipt(receipt); - } - } -} diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/RecognizedReceipt.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/src/RecognizedReceipt.cs index cce18bcd9edf9..0ff17748c8021 100644 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/RecognizedReceipt.cs +++ b/sdk/formrecognizer/Azure.AI.FormRecognizer/src/RecognizedReceipt.cs @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -using System; using System.Collections.Generic; namespace Azure.AI.FormRecognizer.Models @@ -13,93 +12,13 @@ public class RecognizedReceipt { internal RecognizedReceipt(DocumentResult_internal documentResult, IReadOnlyList pageResults, IReadOnlyList readResults) { - // Hard-coding locale for v2.0. - ReceiptLocale = "en-US"; RecognizedForm = new RecognizedForm(documentResult, pageResults, readResults); } - internal RecognizedReceipt(RecognizedReceipt receipt) - { - ReceiptLocale = receipt.ReceiptLocale; - RecognizedForm = receipt.RecognizedForm; - } - - /// - /// A culture name representing the location in which the receipt has been issued. Currently only - /// "en-US" is supported. - /// - public string ReceiptLocale { get; internal set; } - /// /// Contains detailed form information about the recognized receipt, such as fields, form type and /// form content elements. /// - public RecognizedForm RecognizedForm { get; internal set; } - - internal static FormField ConvertStringField(string fieldName, IReadOnlyDictionary fields) - { - FormField field; - if (fields.TryGetValue(fieldName, out field)) - { - return new FormField(field, field.Value.AsString()); - } - - return null; - } - - internal static FormField ConvertPhoneNumberField(string fieldName, IReadOnlyDictionary fields) - { - FormField field; - if (fields.TryGetValue(fieldName, out field)) - { - return new FormField(field, field.Value.AsPhoneNumber()); - } - - return null; - } - - internal static FormField ConvertInt64Field(string fieldName, IReadOnlyDictionary fields) - { - FormField field; - if (fields.TryGetValue(fieldName, out field)) - { - return new FormField(field, field.Value.AsInt64()); - } - - return null; - } - - internal static FormField ConvertFloatField(string fieldName, IReadOnlyDictionary fields) - { - FormField field; - if (fields.TryGetValue(fieldName, out field)) - { - return new FormField(field, field.Value.AsFloat()); - } - - return null; - } - - internal static FormField ConvertDateField(string fieldName, IReadOnlyDictionary fields) - { - FormField field; - if (fields.TryGetValue(fieldName, out field)) - { - return new FormField(field, field.Value.AsDate()); - } - - return null; - } - - internal static FormField ConvertTimeField(string fieldName, IReadOnlyDictionary fields) - { - FormField field; - if (fields.TryGetValue(fieldName, out field)) - { - return new FormField(field, field.Value.AsTime()); - } - - return null; - } + public RecognizedForm RecognizedForm { get; } } } diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/TrainingDocumentInfo.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/src/TrainingDocumentInfo.cs index 28416202127cd..392048f86949c 100644 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/TrainingDocumentInfo.cs +++ b/sdk/formrecognizer/Azure.AI.FormRecognizer/src/TrainingDocumentInfo.cs @@ -15,6 +15,6 @@ public partial class TrainingDocumentInfo /// The number of pages the document has. /// [CodeGenMember("pages")] - public int PageCount { get; internal set; } + public int PageCount { get; } } } diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/USReceipt.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/src/USReceipt.cs deleted file mode 100644 index a0d50e153406e..0000000000000 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/USReceipt.cs +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Diagnostics; - -namespace Azure.AI.FormRecognizer.Models -{ - /// - /// Represents a receipt recognized from the input document and provides members - /// for accessing common fields present in US sales receipts. - /// - public class USReceipt : RecognizedReceipt - { - internal USReceipt(RecognizedReceipt receipt) - : base(receipt) - { - float receiptTypeConfidence; - ReceiptType = ConvertUSReceiptType(out receiptTypeConfidence); - ReceiptTypeConfidence = receiptTypeConfidence; - - MerchantAddress = ConvertStringField("MerchantAddress", RecognizedForm.Fields); - MerchantName = ConvertStringField("MerchantName", RecognizedForm.Fields); - MerchantPhoneNumber = ConvertPhoneNumberField("MerchantPhoneNumber", RecognizedForm.Fields); - Subtotal = ConvertFloatField("Subtotal", RecognizedForm.Fields); - Tax = ConvertFloatField("Tax", RecognizedForm.Fields); - Tip = ConvertFloatField("Tip", RecognizedForm.Fields); - Total = ConvertFloatField("Total", RecognizedForm.Fields); - TransactionDate = ConvertDateField("TransactionDate", RecognizedForm.Fields); - TransactionTime = ConvertTimeField("TransactionTime", RecognizedForm.Fields); - - Items = ConvertReceiptItems(); - } - - /// - /// The type of receipt the service identified the submitted receipt to be. - /// - public USReceiptType ReceiptType { get; internal set; } - - /// - /// Measures the degree of certainty of the attribution. Value - /// is between [0.0, 1.0]. - /// - public float ReceiptTypeConfidence { get; internal set; } - - /// - /// A list of purchased items present in the recognized receipt. - /// - // TODO: Can we make this nullable in case a value isn't present or - // isn't read by the learner? - // https://github.com/Azure/azure-sdk-for-net/issues/10361 - public IReadOnlyList Items { get; internal set; } - - /// - /// The merchant's address. - /// - public FormField MerchantAddress { get; internal set; } - - /// - /// The merchant's name. - /// - public FormField MerchantName { get; internal set; } - - /// - /// The merchant's phone number. - /// - public FormField MerchantPhoneNumber { get; internal set; } - - /// - /// The subtotal price. - /// - public FormField Subtotal { get; internal set; } - - /// - /// The tax price. - /// - public FormField Tax { get; internal set; } - - /// - /// The tip price. - /// - public FormField Tip { get; internal set; } - - /// - /// The total price. - /// - public FormField Total { get; internal set; } - - /// - /// The transaction date. - /// - public FormField TransactionDate { get; internal set; } - - /// - /// The transaction time. - /// - public FormField TransactionTime { get; internal set; } - - private USReceiptType ConvertUSReceiptType(out float receiptTypeConfidence) - { - USReceiptType receiptType = USReceiptType.Unrecognized; - receiptTypeConfidence = Constants.DefaultConfidenceValue; - - FormField value; - if (RecognizedForm.Fields.TryGetValue("ReceiptType", out value)) - { - receiptTypeConfidence = value.Confidence; - - receiptType = value.Value.AsString() switch - { - "Itemized" => USReceiptType.Itemized, - "CreditCard" => USReceiptType.CreditCard, - "Gas" => USReceiptType.Gas, - "Parking" => USReceiptType.Parking, - "Other" => USReceiptType.Other, - _ => USReceiptType.Unrecognized, - }; - } - - return receiptType; - } - - private IReadOnlyList ConvertReceiptItems() - { - List items = new List(); - - FormField value; - if (RecognizedForm.Fields.TryGetValue("Items", out value)) - { - Debug.Assert(value.Value.Type == FieldValueType.List); - - IReadOnlyList itemList = value.Value.AsList(); - foreach (var item in itemList) - { - Debug.Assert(item.Value.Type == FieldValueType.Dictionary); - - IReadOnlyDictionary itemFields = item.Value.AsDictionary(); - - items.Add(new USReceiptItem( - ConvertStringField("Name", itemFields), - ConvertFloatField("Quantity", itemFields), - ConvertFloatField("Price", itemFields), - ConvertFloatField("TotalPrice", itemFields) - )); - } - } - - return items; - } - } -} diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/USReceiptItem.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/src/USReceiptItem.cs deleted file mode 100644 index 1e82a7bf3fa0c..0000000000000 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/USReceiptItem.cs +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -namespace Azure.AI.FormRecognizer.Models -{ - /// - /// Represents an item in a recognized US sales receipt. - /// - public class USReceiptItem - { - internal USReceiptItem(FormField name, FormField quantity, FormField price, FormField totalPrice) - { - Name = name; - Quantity = quantity; - Price = price; - TotalPrice = totalPrice; - } - - /// - /// The field for the name of this item. - /// - public FormField Name { get; } - - /// - /// The field for the quantity associated with this item. - /// - public FormField Quantity { get; } - - /// - /// The field for the price of a single unit of this item. - /// - public FormField Price { get; } - - /// - /// The field for the total price of this item, taking the quantity into account. - /// - public FormField TotalPrice { get; } - } -} diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/USReceiptType.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/src/USReceiptType.cs deleted file mode 100644 index 232fd06806260..0000000000000 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/USReceiptType.cs +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -namespace Azure.AI.FormRecognizer.Models -{ - /// - /// The receipt type of recognized instances. - /// - public enum USReceiptType - { - /// - /// Used for receipts whose type couldn't be recognized. - /// - Unrecognized, - - /// - /// Used for other types of US sales receipts. - /// - Other, - - /// - /// Used for receipts with an item list. - /// - Itemized, - - /// - /// Used for credit card purchases. - /// - CreditCard, - - /// - /// Used for gas receipts. - /// - Gas, - - /// - /// Used for parking receipts. - /// - Parking, - } -} diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/FormRecognizerClient/FormRecognizerClientLiveTests.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/FormRecognizerClient/FormRecognizerClientLiveTests.cs index 827a2646e55ba..5326d0ce1edd6 100644 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/FormRecognizerClient/FormRecognizerClientLiveTests.cs +++ b/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/FormRecognizerClient/FormRecognizerClientLiveTests.cs @@ -295,26 +295,38 @@ public async Task StartRecognizeReceiptsPopulatesExtractedReceipt(bool useStream Assert.IsTrue(operation.HasValue); - var receipt = operation.Value.Single().AsUSReceipt(); + var form = operation.Value.Single().RecognizedForm; + + Assert.NotNull(form); // The expected values are based on the values returned by the service, and not the actual // values present in the receipt. We are not testing the service here, but the SDK. - Assert.AreEqual(USReceiptType.Itemized, receipt.ReceiptType); - Assert.That(receipt.ReceiptTypeConfidence, Is.EqualTo(0.66).Within(0.01)); + Assert.AreEqual("prebuilt:receipt", form.FormType); + + Assert.AreEqual(1, form.PageRange.FirstPageNumber); + Assert.AreEqual(1, form.PageRange.LastPageNumber); - Assert.AreEqual(1, receipt.RecognizedForm.PageRange.FirstPageNumber); - Assert.AreEqual(1, receipt.RecognizedForm.PageRange.LastPageNumber); + Assert.NotNull(form.Fields); - Assert.AreEqual("Contoso Contoso", (string)receipt.MerchantName); - Assert.AreEqual("123 Main Street Redmond, WA 98052", (string)receipt.MerchantAddress); - Assert.AreEqual("123-456-7890", (string)receipt.MerchantPhoneNumber.ValueText); + Assert.True(form.Fields.ContainsKey("ReceiptType")); + Assert.True(form.Fields.ContainsKey("MerchantAddress")); + Assert.True(form.Fields.ContainsKey("MerchantName")); + Assert.True(form.Fields.ContainsKey("MerchantPhoneNumber")); + Assert.True(form.Fields.ContainsKey("TransactionDate")); + Assert.True(form.Fields.ContainsKey("TransactionTime")); + Assert.True(form.Fields.ContainsKey("Items")); + Assert.True(form.Fields.ContainsKey("Subtotal")); + Assert.True(form.Fields.ContainsKey("Tax")); + Assert.True(form.Fields.ContainsKey("Total")); - Assert.IsNotNull(receipt.TransactionDate); - Assert.IsNotNull(receipt.TransactionTime); + Assert.AreEqual("Itemized", form.Fields["ReceiptType"].Value.AsString()); + Assert.AreEqual("Contoso Contoso", form.Fields["MerchantName"].Value.AsString()); + Assert.AreEqual("123 Main Street Redmond, WA 98052", form.Fields["MerchantAddress"].Value.AsString()); + Assert.AreEqual("123-456-7890", form.Fields["MerchantPhoneNumber"].ValueText.Text); - var date = receipt.TransactionDate.Value; - var time = receipt.TransactionTime.Value; + var date = form.Fields["TransactionDate"].Value.AsDate(); + var time = form.Fields["TransactionTime"].Value.AsTime(); Assert.AreEqual(10, date.Day); Assert.AreEqual(6, date.Month); @@ -332,23 +344,35 @@ public async Task StartRecognizeReceiptsPopulatesExtractedReceipt(bool useStream // Include a bit of tolerance when comparing float types. - Assert.AreEqual(expectedItems.Count, receipt.Items.Count); + var items = form.Fields["Items"].Value.AsList(); - for (var itemIndex = 0; itemIndex < receipt.Items.Count; itemIndex++) + Assert.AreEqual(expectedItems.Count, items.Count); + + for (var itemIndex = 0; itemIndex < items.Count; itemIndex++) { - var receiptItem = receipt.Items[itemIndex]; + var receiptItemInfo = items[itemIndex].Value.AsDictionary(); + + receiptItemInfo.TryGetValue("Quantity", out var quantityField); + receiptItemInfo.TryGetValue("Name", out var nameField); + receiptItemInfo.TryGetValue("Price", out var priceField); + receiptItemInfo.TryGetValue("TotalPrice", out var totalPriceField); + + var quantity = quantityField == null ? null : (float?)quantityField.Value.AsFloat(); + var name = nameField == null ? null : nameField.Value.AsString(); + var price = priceField == null ? null : (float?)priceField.Value.AsFloat(); + var totalPrice = totalPriceField == null ? null : (float?)totalPriceField.Value.AsFloat(); + var expectedItem = expectedItems[itemIndex]; - Assert.AreEqual(expectedItem.Quantity, receiptItem.Quantity == null? null : (float?)receiptItem.Quantity, $"{receiptItem.Quantity} mismatch in item with index {itemIndex}."); - Assert.AreEqual(expectedItem.Name, (string)receiptItem.Name, $"{receiptItem.Name} mismatch in item with index {itemIndex}."); - Assert.That(receiptItem.Price == null? null : (float?)receiptItem.Price, Is.EqualTo(expectedItem.Price).Within(0.0001), $"{receiptItem.Price} mismatch in item with index {itemIndex}."); - Assert.That(receiptItem.TotalPrice == null? null: (float?)receiptItem.TotalPrice, Is.EqualTo(expectedItem.TotalPrice).Within(0.0001), $"{receiptItem.TotalPrice} mismatch in item with index {itemIndex}."); + Assert.AreEqual(expectedItem.Quantity, quantity, $"Quantity mismatch in item with index {itemIndex}."); + Assert.AreEqual(expectedItem.Name, name, $"Name mismatch in item with index {itemIndex}."); + Assert.That(price, Is.EqualTo(expectedItem.Price).Within(0.0001), $"Price mismatch in item with index {itemIndex}."); + Assert.That(totalPrice, Is.EqualTo(expectedItem.TotalPrice).Within(0.0001), $"Total price mismatch in item with index {itemIndex}."); } - Assert.That((float?)receipt.Subtotal, Is.EqualTo(1098.99).Within(0.0001)); - Assert.That((float?)receipt.Tax, Is.EqualTo(104.40).Within(0.0001)); - Assert.IsNull(receipt.Tip); - Assert.That((float?)receipt.Total, Is.EqualTo(1203.39).Within(0.0001)); + Assert.That(form.Fields["Subtotal"].Value.AsFloat(), Is.EqualTo(1098.99).Within(0.0001)); + Assert.That(form.Fields["Tax"].Value.AsFloat(), Is.EqualTo(104.40).Within(0.0001)); + Assert.That(form.Fields["Total"].Value.AsFloat(), Is.EqualTo(1203.39).Within(0.0001)); } [Test] @@ -383,7 +407,6 @@ public async Task StartRecognizeReceiptsCanParseMultipageForm(bool useStream) var recognizedReceipt = recognizedReceipts[receiptIndex]; var expectedPageNumber = receiptIndex + 1; - Assert.AreEqual("en-US", recognizedReceipt.ReceiptLocale); Assert.NotNull(recognizedReceipt.RecognizedForm); ValidateRecognizedForm(recognizedReceipt.RecognizedForm, includeTextContent: true, @@ -421,7 +444,6 @@ public async Task StartRecognizeReceiptsCanParseMultipageFormWithBlankPage() var recognizedReceipt = recognizedReceipts[receiptIndex]; var expectedPageNumber = receiptIndex + 1; - Assert.AreEqual("en-US", recognizedReceipt.ReceiptLocale); Assert.NotNull(recognizedReceipt.RecognizedForm); ValidateRecognizedForm(recognizedReceipt.RecognizedForm, includeTextContent: true, From dbc18896871288bbe80e2fe53fcaeb8064845ea6 Mon Sep 17 00:00:00 2001 From: Caio Saldanha Date: Thu, 4 Jun 2020 10:17:53 -0700 Subject: [PATCH 2/8] Updated samples --- .../Sample2_RecognizeReceiptsFromFile.cs | 83 ++++++++++++++----- .../Sample2_RecognizeReceiptsFromUri.cs | 83 ++++++++++++++----- 2 files changed, 128 insertions(+), 38 deletions(-) diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromFile.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromFile.cs index 43c0df0a57f12..7ed94c792c399 100644 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromFile.cs +++ b/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromFile.cs @@ -30,33 +30,78 @@ public async Task RecognizeReceiptsFromFile() using (FileStream stream = new FileStream(receiptPath, FileMode.Open)) { RecognizedReceiptCollection receipts = await client.StartRecognizeReceipts(stream).WaitForCompletionAsync(); + foreach (var receipt in receipts) { - USReceipt usReceipt = receipt.AsUSReceipt(); + FormField merchantNameField; + if (receipt.RecognizedForm.Fields.TryGetValue("MerchantName", out merchantNameField)) + { + if (merchantNameField.Value.Type == FieldValueType.String) + { + string merchantName = merchantNameField.Value.AsString(); - string merchantName = usReceipt.MerchantName?.Value ?? default; - DateTime transactionDate = usReceipt.TransactionDate?.Value ?? default; - IReadOnlyList items = usReceipt.Items ?? default; - float subtotal = usReceipt.Subtotal?.Value ?? default; - float tax = usReceipt.Tax?.Value ?? default; - float tip = usReceipt.Tip?.Value ?? default; - float total = usReceipt.Total?.Value ?? default; + Console.WriteLine($" Merchant Name: '{merchantName}', with confidence {merchantNameField.Confidence}"); + } + } - Console.WriteLine($"Recognized USReceipt fields:"); - Console.WriteLine($" Merchant Name: '{merchantName}', with confidence {usReceipt.MerchantName.Confidence}"); - Console.WriteLine($" Transaction Date: '{transactionDate}', with confidence {usReceipt.TransactionDate.Confidence}"); + FormField transactionDateField; + if (receipt.RecognizedForm.Fields.TryGetValue("TransactionDate", out transactionDateField)) + { + if (transactionDateField.Value.Type == FieldValueType.Date) + { + DateTime transactionDate = transactionDateField.Value.AsDate(); - for (int i = 0; i < items.Count; i++) + Console.WriteLine($" Transaction Date: '{transactionDate}', with confidence {transactionDateField.Confidence}"); + } + } + + FormField itemsField; + if (receipt.RecognizedForm.Fields.TryGetValue("Items", out itemsField)) { - USReceiptItem item = usReceipt.Items[i]; - Console.WriteLine($" Item {i}: Name: '{item.Name.Value}', Quantity: '{item.Quantity?.Value}', Price: '{item.Price?.Value}'"); - Console.WriteLine($" TotalPrice: '{item.TotalPrice.Value}'"); + if (itemsField.Value.Type == FieldValueType.List) + { + foreach (FormField itemField in itemsField.Value.AsList()) + { + if (itemField.Value.Type == FieldValueType.Dictionary) + { + IReadOnlyDictionary itemFields = itemField.Value.AsDictionary(); + + FormField itemNameField; + if (itemFields.TryGetValue("MerchantName", out itemNameField)) + { + if (itemNameField.Value.Type == FieldValueType.String) + { + string itemName = itemNameField.Value.AsString(); + + Console.WriteLine($" Merchant Name: '{itemName}', with confidence {itemNameField.Confidence}"); + } + } + + FormField itemTotalPriceField; + if (itemFields.TryGetValue("TotalPriceField", out itemTotalPriceField)) + { + if (itemTotalPriceField.Value.Type == FieldValueType.Float) + { + float itemTotalPrice = itemTotalPriceField.Value.AsFloat(); + + Console.WriteLine($" Merchant Name: '{itemTotalPrice}', with confidence {itemTotalPriceField.Confidence}"); + } + } + } + } + } } - Console.WriteLine($" Subtotal: '{subtotal}', with confidence '{usReceipt.Subtotal.Confidence}'"); - Console.WriteLine($" Tax: '{tax}', with confidence '{usReceipt.Tax.Confidence}'"); - Console.WriteLine($" Tip: '{tip}', with confidence '{usReceipt.Tip?.Confidence ?? 0.0f}'"); - Console.WriteLine($" Total: '{total}', with confidence '{usReceipt.Total.Confidence}'"); + FormField totalField; + if (receipt.RecognizedForm.Fields.TryGetValue("Total", out totalField)) + { + if (totalField.Value.Type == FieldValueType.Float) + { + float total = totalField.Value.AsFloat(); + + Console.WriteLine($" Total: '{total}', with confidence '{totalField.Confidence}'"); + } + } } } #endregion diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromUri.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromUri.cs index f2255691ce6b1..580e169aeb05d 100644 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromUri.cs +++ b/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromUri.cs @@ -25,33 +25,78 @@ public async Task RecognizeReceiptsFromUri() #region Snippet:FormRecognizerSampleRecognizeReceiptFileFromUri RecognizedReceiptCollection receipts = await client.StartRecognizeReceiptsFromUri(new Uri(receiptUri)).WaitForCompletionAsync(); + foreach (var receipt in receipts) { - USReceipt usReceipt = receipt.AsUSReceipt(); + FormField merchantNameField; + if (receipt.RecognizedForm.Fields.TryGetValue("MerchantName", out merchantNameField)) + { + if (merchantNameField.Value.Type == FieldValueType.String) + { + string merchantName = merchantNameField.Value.AsString(); - string merchantName = usReceipt.MerchantName?.Value ?? default; - DateTime transactionDate = usReceipt.TransactionDate?.Value ?? default; - IReadOnlyList items = usReceipt.Items ?? default; - float subtotal = usReceipt.Subtotal?.Value ?? default; - float tax = usReceipt.Tax?.Value ?? default; - float tip = usReceipt.Tip?.Value ?? default; - float total = usReceipt.Total?.Value ?? default; + Console.WriteLine($" Merchant Name: '{merchantName}', with confidence {merchantNameField.Confidence}"); + } + } - Console.WriteLine($"Recognized USReceipt fields:"); - Console.WriteLine($" Merchant Name: '{merchantName}', with confidence {usReceipt.MerchantName.Confidence}"); - Console.WriteLine($" Transaction Date: '{transactionDate}', with confidence {usReceipt.TransactionDate.Confidence}"); + FormField transactionDateField; + if (receipt.RecognizedForm.Fields.TryGetValue("TransactionDate", out transactionDateField)) + { + if (transactionDateField.Value.Type == FieldValueType.Date) + { + DateTime transactionDate = transactionDateField.Value.AsDate(); - for (int i = 0; i < items.Count; i++) + Console.WriteLine($" Transaction Date: '{transactionDate}', with confidence {transactionDateField.Confidence}"); + } + } + + FormField itemsField; + if (receipt.RecognizedForm.Fields.TryGetValue("Items", out itemsField)) { - USReceiptItem item = usReceipt.Items[i]; - Console.WriteLine($" Item {i}: Name: '{item.Name.Value}', Quantity: '{item.Quantity?.Value}', Price: '{item.Price?.Value}'"); - Console.WriteLine($" TotalPrice: '{item.TotalPrice.Value}'"); + if (itemsField.Value.Type == FieldValueType.List) + { + foreach (FormField itemField in itemsField.Value.AsList()) + { + if (itemField.Value.Type == FieldValueType.Dictionary) + { + IReadOnlyDictionary itemFields = itemField.Value.AsDictionary(); + + FormField itemNameField; + if (itemFields.TryGetValue("MerchantName", out itemNameField)) + { + if (itemNameField.Value.Type == FieldValueType.String) + { + string itemName = itemNameField.Value.AsString(); + + Console.WriteLine($" Merchant Name: '{itemName}', with confidence {itemNameField.Confidence}"); + } + } + + FormField itemTotalPriceField; + if (itemFields.TryGetValue("TotalPriceField", out itemTotalPriceField)) + { + if (itemTotalPriceField.Value.Type == FieldValueType.Float) + { + float itemTotalPrice = itemTotalPriceField.Value.AsFloat(); + + Console.WriteLine($" Merchant Name: '{itemTotalPrice}', with confidence {itemTotalPriceField.Confidence}"); + } + } + } + } + } } - Console.WriteLine($" Subtotal: '{subtotal}', with confidence '{usReceipt.Subtotal.Confidence}'"); - Console.WriteLine($" Tax: '{tax}', with confidence '{usReceipt.Tax.Confidence}'"); - Console.WriteLine($" Tip: '{tip}', with confidence '{usReceipt.Tip?.Confidence ?? 0.0f}'"); - Console.WriteLine($" Total: '{total}', with confidence '{usReceipt.Total.Confidence}'"); + FormField totalField; + if (receipt.RecognizedForm.Fields.TryGetValue("Total", out totalField)) + { + if (totalField.Value.Type == FieldValueType.Float) + { + float total = totalField.Value.AsFloat(); + + Console.WriteLine($" Total: '{total}', with confidence '{totalField.Confidence}'"); + } + } } #endregion } From 3ad2935aad634cf46d26e687edffabfc4b4d0077 Mon Sep 17 00:00:00 2001 From: Caio Saldanha Date: Thu, 4 Jun 2020 11:46:13 -0700 Subject: [PATCH 3/8] Updated snippets --- .../Azure.AI.FormRecognizer/README.md | 83 ++++++++++++++----- .../samples/Sample2_RecognizeReceipts.md | 83 ++++++++++++++----- 2 files changed, 128 insertions(+), 38 deletions(-) diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/README.md b/sdk/formrecognizer/Azure.AI.FormRecognizer/README.md index d793a0e59b6e4..6f2cb03e26cb9 100644 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/README.md +++ b/sdk/formrecognizer/Azure.AI.FormRecognizer/README.md @@ -137,33 +137,78 @@ Recognize data from US sales receipts using a prebuilt model. using (FileStream stream = new FileStream(receiptPath, FileMode.Open)) { RecognizedReceiptCollection receipts = await client.StartRecognizeReceipts(stream).WaitForCompletionAsync(); + foreach (var receipt in receipts) { - USReceipt usReceipt = receipt.AsUSReceipt(); + FormField merchantNameField; + if (receipt.RecognizedForm.Fields.TryGetValue("MerchantName", out merchantNameField)) + { + if (merchantNameField.Value.Type == FieldValueType.String) + { + string merchantName = merchantNameField.Value.AsString(); - string merchantName = usReceipt.MerchantName?.Value ?? default; - DateTime transactionDate = usReceipt.TransactionDate?.Value ?? default; - IReadOnlyList items = usReceipt.Items ?? default; - float subtotal = usReceipt.Subtotal?.Value ?? default; - float tax = usReceipt.Tax?.Value ?? default; - float tip = usReceipt.Tip?.Value ?? default; - float total = usReceipt.Total?.Value ?? default; + Console.WriteLine($" Merchant Name: '{merchantName}', with confidence {merchantNameField.Confidence}"); + } + } - Console.WriteLine($"Recognized USReceipt fields:"); - Console.WriteLine($" Merchant Name: '{merchantName}', with confidence {usReceipt.MerchantName.Confidence}"); - Console.WriteLine($" Transaction Date: '{transactionDate}', with confidence {usReceipt.TransactionDate.Confidence}"); + FormField transactionDateField; + if (receipt.RecognizedForm.Fields.TryGetValue("TransactionDate", out transactionDateField)) + { + if (transactionDateField.Value.Type == FieldValueType.Date) + { + DateTime transactionDate = transactionDateField.Value.AsDate(); - for (int i = 0; i < items.Count; i++) + Console.WriteLine($" Transaction Date: '{transactionDate}', with confidence {transactionDateField.Confidence}"); + } + } + + FormField itemsField; + if (receipt.RecognizedForm.Fields.TryGetValue("Items", out itemsField)) { - USReceiptItem item = usReceipt.Items[i]; - Console.WriteLine($" Item {i}: Name: '{item.Name.Value}', Quantity: '{item.Quantity?.Value}', Price: '{item.Price?.Value}'"); - Console.WriteLine($" TotalPrice: '{item.TotalPrice.Value}'"); + if (itemsField.Value.Type == FieldValueType.List) + { + foreach (FormField itemField in itemsField.Value.AsList()) + { + if (itemField.Value.Type == FieldValueType.Dictionary) + { + IReadOnlyDictionary itemFields = itemField.Value.AsDictionary(); + + FormField itemNameField; + if (itemFields.TryGetValue("MerchantName", out itemNameField)) + { + if (itemNameField.Value.Type == FieldValueType.String) + { + string itemName = itemNameField.Value.AsString(); + + Console.WriteLine($" Merchant Name: '{itemName}', with confidence {itemNameField.Confidence}"); + } + } + + FormField itemTotalPriceField; + if (itemFields.TryGetValue("TotalPriceField", out itemTotalPriceField)) + { + if (itemTotalPriceField.Value.Type == FieldValueType.Float) + { + float itemTotalPrice = itemTotalPriceField.Value.AsFloat(); + + Console.WriteLine($" Merchant Name: '{itemTotalPrice}', with confidence {itemTotalPriceField.Confidence}"); + } + } + } + } + } } - Console.WriteLine($" Subtotal: '{subtotal}', with confidence '{usReceipt.Subtotal.Confidence}'"); - Console.WriteLine($" Tax: '{tax}', with confidence '{usReceipt.Tax.Confidence}'"); - Console.WriteLine($" Tip: '{tip}', with confidence '{usReceipt.Tip?.Confidence ?? 0.0f}'"); - Console.WriteLine($" Total: '{total}', with confidence '{usReceipt.Total.Confidence}'"); + FormField totalField; + if (receipt.RecognizedForm.Fields.TryGetValue("Total", out totalField)) + { + if (totalField.Value.Type == FieldValueType.Float) + { + float total = totalField.Value.AsFloat(); + + Console.WriteLine($" Total: '{total}', with confidence '{totalField.Confidence}'"); + } + } } } ``` diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/samples/Sample2_RecognizeReceipts.md b/sdk/formrecognizer/Azure.AI.FormRecognizer/samples/Sample2_RecognizeReceipts.md index cd9f31998ce44..f5a6a5ddb86c8 100644 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/samples/Sample2_RecognizeReceipts.md +++ b/sdk/formrecognizer/Azure.AI.FormRecognizer/samples/Sample2_RecognizeReceipts.md @@ -23,33 +23,78 @@ To recognize receipts from a URI, use the `StartRecognizeReceiptsFromUri` method ```C# Snippet:FormRecognizerSampleRecognizeReceiptFileFromUri RecognizedReceiptCollection receipts = await client.StartRecognizeReceiptsFromUri(new Uri(receiptUri)).WaitForCompletionAsync(); + foreach (var receipt in receipts) { - USReceipt usReceipt = receipt.AsUSReceipt(); + FormField merchantNameField; + if (receipt.RecognizedForm.Fields.TryGetValue("MerchantName", out merchantNameField)) + { + if (merchantNameField.Value.Type == FieldValueType.String) + { + string merchantName = merchantNameField.Value.AsString(); - string merchantName = usReceipt.MerchantName?.Value ?? default; - DateTime transactionDate = usReceipt.TransactionDate?.Value ?? default; - IReadOnlyList items = usReceipt.Items ?? default; - float subtotal = usReceipt.Subtotal?.Value ?? default; - float tax = usReceipt.Tax?.Value ?? default; - float tip = usReceipt.Tip?.Value ?? default; - float total = usReceipt.Total?.Value ?? default; + Console.WriteLine($" Merchant Name: '{merchantName}', with confidence {merchantNameField.Confidence}"); + } + } - Console.WriteLine($"Recognized USReceipt fields:"); - Console.WriteLine($" Merchant Name: '{merchantName}', with confidence {usReceipt.MerchantName.Confidence}"); - Console.WriteLine($" Transaction Date: '{transactionDate}', with confidence {usReceipt.TransactionDate.Confidence}"); + FormField transactionDateField; + if (receipt.RecognizedForm.Fields.TryGetValue("TransactionDate", out transactionDateField)) + { + if (transactionDateField.Value.Type == FieldValueType.Date) + { + DateTime transactionDate = transactionDateField.Value.AsDate(); - for (int i = 0; i < items.Count; i++) + Console.WriteLine($" Transaction Date: '{transactionDate}', with confidence {transactionDateField.Confidence}"); + } + } + + FormField itemsField; + if (receipt.RecognizedForm.Fields.TryGetValue("Items", out itemsField)) { - USReceiptItem item = usReceipt.Items[i]; - Console.WriteLine($" Item {i}: Name: '{item.Name.Value}', Quantity: '{item.Quantity?.Value}', Price: '{item.Price?.Value}'"); - Console.WriteLine($" TotalPrice: '{item.TotalPrice.Value}'"); + if (itemsField.Value.Type == FieldValueType.List) + { + foreach (FormField itemField in itemsField.Value.AsList()) + { + if (itemField.Value.Type == FieldValueType.Dictionary) + { + IReadOnlyDictionary itemFields = itemField.Value.AsDictionary(); + + FormField itemNameField; + if (itemFields.TryGetValue("MerchantName", out itemNameField)) + { + if (itemNameField.Value.Type == FieldValueType.String) + { + string itemName = itemNameField.Value.AsString(); + + Console.WriteLine($" Merchant Name: '{itemName}', with confidence {itemNameField.Confidence}"); + } + } + + FormField itemTotalPriceField; + if (itemFields.TryGetValue("TotalPriceField", out itemTotalPriceField)) + { + if (itemTotalPriceField.Value.Type == FieldValueType.Float) + { + float itemTotalPrice = itemTotalPriceField.Value.AsFloat(); + + Console.WriteLine($" Merchant Name: '{itemTotalPrice}', with confidence {itemTotalPriceField.Confidence}"); + } + } + } + } + } } - Console.WriteLine($" Subtotal: '{subtotal}', with confidence '{usReceipt.Subtotal.Confidence}'"); - Console.WriteLine($" Tax: '{tax}', with confidence '{usReceipt.Tax.Confidence}'"); - Console.WriteLine($" Tip: '{tip}', with confidence '{usReceipt.Tip?.Confidence ?? 0.0f}'"); - Console.WriteLine($" Total: '{total}', with confidence '{usReceipt.Total.Confidence}'"); + FormField totalField; + if (receipt.RecognizedForm.Fields.TryGetValue("Total", out totalField)) + { + if (totalField.Value.Type == FieldValueType.Float) + { + float total = totalField.Value.AsFloat(); + + Console.WriteLine($" Total: '{total}', with confidence '{totalField.Confidence}'"); + } + } } ``` From d28b219344d4e73d47685bf22608384623cb8aab Mon Sep 17 00:00:00 2001 From: Caio Saldanha Date: Thu, 4 Jun 2020 11:52:41 -0700 Subject: [PATCH 4/8] removed GetModelOptions --- .../Azure.AI.FormRecognizer/src/GetModelOptions.cs | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 sdk/formrecognizer/Azure.AI.FormRecognizer/src/GetModelOptions.cs diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/GetModelOptions.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/src/GetModelOptions.cs deleted file mode 100644 index b08692ea542f0..0000000000000 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/src/GetModelOptions.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using Azure.Core; - -namespace Azure.AI.FormRecognizer.Models -{ - [CodeGenModel("Enum0")] - internal partial struct GetModelOptions - { - } -} From 8c6eddcc3d8ee2aa6329529c73a5f88ab4fe83fe Mon Sep 17 00:00:00 2001 From: Caio Saldanha Date: Thu, 4 Jun 2020 14:12:47 -0700 Subject: [PATCH 5/8] docs --- sdk/formrecognizer/Azure.AI.FormRecognizer/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/CHANGELOG.md b/sdk/formrecognizer/Azure.AI.FormRecognizer/CHANGELOG.md index 840087b438dbc..c53ffb3eb7639 100644 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/CHANGELOG.md +++ b/sdk/formrecognizer/Azure.AI.FormRecognizer/CHANGELOG.md @@ -28,6 +28,7 @@ - The order of the values for `USReceiptType` have changed so that `Other` has now a value of `1`. - Parameter `useTrainingLabels` is now required for `FormTrainingClient.StartTraining`. - Protected constructors have been removed from `Operation` types, such as `TrainingOperation` or `RecognizeContentOperation`. +- `USReceipt`, `USReceiptItem` and `USReceiptType` types removed. Information about a `RecognizedReceipt` must now be extracted from its `RecognizedForm`. ### New Features From 904d8a4592ec93db400e8c4c0249a0ec45f34aa3 Mon Sep 17 00:00:00 2001 From: Caio Saldanha Date: Thu, 4 Jun 2020 14:17:58 -0700 Subject: [PATCH 6/8] fix --- sdk/formrecognizer/Azure.AI.FormRecognizer/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/CHANGELOG.md b/sdk/formrecognizer/Azure.AI.FormRecognizer/CHANGELOG.md index c53ffb3eb7639..e8f05c569ca16 100644 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/CHANGELOG.md +++ b/sdk/formrecognizer/Azure.AI.FormRecognizer/CHANGELOG.md @@ -28,7 +28,7 @@ - The order of the values for `USReceiptType` have changed so that `Other` has now a value of `1`. - Parameter `useTrainingLabels` is now required for `FormTrainingClient.StartTraining`. - Protected constructors have been removed from `Operation` types, such as `TrainingOperation` or `RecognizeContentOperation`. -- `USReceipt`, `USReceiptItem` and `USReceiptType` types removed. Information about a `RecognizedReceipt` must now be extracted from its `RecognizedForm`. +- `USReceipt`, `USReceiptItem`, `USReceiptType` and `FormField{T}` types removed. Information about a `RecognizedReceipt` must now be extracted from its `RecognizedForm`. ### New Features From 8b15c5f703ccd5c6a39ad3fda077ada1679aa77f Mon Sep 17 00:00:00 2001 From: Caio Saldanha Date: Fri, 5 Jun 2020 09:38:13 -0700 Subject: [PATCH 7/8] Fixed sample --- .../samples/Sample2_RecognizeReceiptsFromFile.cs | 16 +++++++++------- .../samples/Sample2_RecognizeReceiptsFromUri.cs | 16 +++++++++------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromFile.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromFile.cs index 7ed94c792c399..08f02d2e81c7e 100644 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromFile.cs +++ b/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromFile.cs @@ -40,7 +40,7 @@ public async Task RecognizeReceiptsFromFile() { string merchantName = merchantNameField.Value.AsString(); - Console.WriteLine($" Merchant Name: '{merchantName}', with confidence {merchantNameField.Confidence}"); + Console.WriteLine($"Merchant Name: '{merchantName}', with confidence {merchantNameField.Confidence}"); } } @@ -51,7 +51,7 @@ public async Task RecognizeReceiptsFromFile() { DateTime transactionDate = transactionDateField.Value.AsDate(); - Console.WriteLine($" Transaction Date: '{transactionDate}', with confidence {transactionDateField.Confidence}"); + Console.WriteLine($"Transaction Date: '{transactionDate}', with confidence {transactionDateField.Confidence}"); } } @@ -62,29 +62,31 @@ public async Task RecognizeReceiptsFromFile() { foreach (FormField itemField in itemsField.Value.AsList()) { + Console.WriteLine("Item:"); + if (itemField.Value.Type == FieldValueType.Dictionary) { IReadOnlyDictionary itemFields = itemField.Value.AsDictionary(); FormField itemNameField; - if (itemFields.TryGetValue("MerchantName", out itemNameField)) + if (itemFields.TryGetValue("Name", out itemNameField)) { if (itemNameField.Value.Type == FieldValueType.String) { string itemName = itemNameField.Value.AsString(); - Console.WriteLine($" Merchant Name: '{itemName}', with confidence {itemNameField.Confidence}"); + Console.WriteLine($" Name: '{itemName}', with confidence {itemNameField.Confidence}"); } } FormField itemTotalPriceField; - if (itemFields.TryGetValue("TotalPriceField", out itemTotalPriceField)) + if (itemFields.TryGetValue("TotalPrice", out itemTotalPriceField)) { if (itemTotalPriceField.Value.Type == FieldValueType.Float) { float itemTotalPrice = itemTotalPriceField.Value.AsFloat(); - Console.WriteLine($" Merchant Name: '{itemTotalPrice}', with confidence {itemTotalPriceField.Confidence}"); + Console.WriteLine($" Total Price: '{itemTotalPrice}', with confidence {itemTotalPriceField.Confidence}"); } } } @@ -99,7 +101,7 @@ public async Task RecognizeReceiptsFromFile() { float total = totalField.Value.AsFloat(); - Console.WriteLine($" Total: '{total}', with confidence '{totalField.Confidence}'"); + Console.WriteLine($"Total: '{total}', with confidence '{totalField.Confidence}'"); } } } diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromUri.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromUri.cs index 580e169aeb05d..d751bc0f34a55 100644 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromUri.cs +++ b/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromUri.cs @@ -35,7 +35,7 @@ public async Task RecognizeReceiptsFromUri() { string merchantName = merchantNameField.Value.AsString(); - Console.WriteLine($" Merchant Name: '{merchantName}', with confidence {merchantNameField.Confidence}"); + Console.WriteLine($"Merchant Name: '{merchantName}', with confidence {merchantNameField.Confidence}"); } } @@ -46,7 +46,7 @@ public async Task RecognizeReceiptsFromUri() { DateTime transactionDate = transactionDateField.Value.AsDate(); - Console.WriteLine($" Transaction Date: '{transactionDate}', with confidence {transactionDateField.Confidence}"); + Console.WriteLine($"Transaction Date: '{transactionDate}', with confidence {transactionDateField.Confidence}"); } } @@ -57,29 +57,31 @@ public async Task RecognizeReceiptsFromUri() { foreach (FormField itemField in itemsField.Value.AsList()) { + Console.WriteLine("Item:"); + if (itemField.Value.Type == FieldValueType.Dictionary) { IReadOnlyDictionary itemFields = itemField.Value.AsDictionary(); FormField itemNameField; - if (itemFields.TryGetValue("MerchantName", out itemNameField)) + if (itemFields.TryGetValue("Name", out itemNameField)) { if (itemNameField.Value.Type == FieldValueType.String) { string itemName = itemNameField.Value.AsString(); - Console.WriteLine($" Merchant Name: '{itemName}', with confidence {itemNameField.Confidence}"); + Console.WriteLine($" Name: '{itemName}', with confidence {itemNameField.Confidence}"); } } FormField itemTotalPriceField; - if (itemFields.TryGetValue("TotalPriceField", out itemTotalPriceField)) + if (itemFields.TryGetValue("TotalPrice", out itemTotalPriceField)) { if (itemTotalPriceField.Value.Type == FieldValueType.Float) { float itemTotalPrice = itemTotalPriceField.Value.AsFloat(); - Console.WriteLine($" Merchant Name: '{itemTotalPrice}', with confidence {itemTotalPriceField.Confidence}"); + Console.WriteLine($" Total Price: '{itemTotalPrice}', with confidence {itemTotalPriceField.Confidence}"); } } } @@ -94,7 +96,7 @@ public async Task RecognizeReceiptsFromUri() { float total = totalField.Value.AsFloat(); - Console.WriteLine($" Total: '{total}', with confidence '{totalField.Confidence}'"); + Console.WriteLine($"Total: '{total}', with confidence '{totalField.Confidence}'"); } } } From a25de93b45e781ce84104b9e614a096dec2eb5ca Mon Sep 17 00:00:00 2001 From: Caio Saldanha Date: Fri, 5 Jun 2020 13:49:50 -0700 Subject: [PATCH 8/8] Addressed comments --- .../Azure.AI.FormRecognizer/CHANGELOG.md | 1 + .../Azure.AI.FormRecognizer/README.md | 21 ++++++++++++------- .../samples/Sample2_RecognizeReceipts.md | 21 ++++++++++++------- .../Sample2_RecognizeReceiptsFromFile.cs | 5 ++++- .../Sample2_RecognizeReceiptsFromUri.cs | 5 ++++- 5 files changed, 35 insertions(+), 18 deletions(-) diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/CHANGELOG.md b/sdk/formrecognizer/Azure.AI.FormRecognizer/CHANGELOG.md index e8f05c569ca16..58a3a355178a6 100644 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/CHANGELOG.md +++ b/sdk/formrecognizer/Azure.AI.FormRecognizer/CHANGELOG.md @@ -29,6 +29,7 @@ - Parameter `useTrainingLabels` is now required for `FormTrainingClient.StartTraining`. - Protected constructors have been removed from `Operation` types, such as `TrainingOperation` or `RecognizeContentOperation`. - `USReceipt`, `USReceiptItem`, `USReceiptType` and `FormField{T}` types removed. Information about a `RecognizedReceipt` must now be extracted from its `RecognizedForm`. +- `ReceiptLocale` removed from `RecognizedReceipt`. ### New Features diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/README.md b/sdk/formrecognizer/Azure.AI.FormRecognizer/README.md index 6f2cb03e26cb9..41469de9ee9cc 100644 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/README.md +++ b/sdk/formrecognizer/Azure.AI.FormRecognizer/README.md @@ -138,7 +138,10 @@ using (FileStream stream = new FileStream(receiptPath, FileMode.Open)) { RecognizedReceiptCollection receipts = await client.StartRecognizeReceipts(stream).WaitForCompletionAsync(); - foreach (var receipt in receipts) + // To see the list of the supported fields returned by service and its corresponding types, consult: + // https://westus2.dev.cognitive.microsoft.com/docs/services/form-recognizer-api-v2-preview/operations/GetAnalyzeReceiptResult + + foreach (RecognizedReceipt receipt in receipts) { FormField merchantNameField; if (receipt.RecognizedForm.Fields.TryGetValue("MerchantName", out merchantNameField)) @@ -147,7 +150,7 @@ using (FileStream stream = new FileStream(receiptPath, FileMode.Open)) { string merchantName = merchantNameField.Value.AsString(); - Console.WriteLine($" Merchant Name: '{merchantName}', with confidence {merchantNameField.Confidence}"); + Console.WriteLine($"Merchant Name: '{merchantName}', with confidence {merchantNameField.Confidence}"); } } @@ -158,7 +161,7 @@ using (FileStream stream = new FileStream(receiptPath, FileMode.Open)) { DateTime transactionDate = transactionDateField.Value.AsDate(); - Console.WriteLine($" Transaction Date: '{transactionDate}', with confidence {transactionDateField.Confidence}"); + Console.WriteLine($"Transaction Date: '{transactionDate}', with confidence {transactionDateField.Confidence}"); } } @@ -169,29 +172,31 @@ using (FileStream stream = new FileStream(receiptPath, FileMode.Open)) { foreach (FormField itemField in itemsField.Value.AsList()) { + Console.WriteLine("Item:"); + if (itemField.Value.Type == FieldValueType.Dictionary) { IReadOnlyDictionary itemFields = itemField.Value.AsDictionary(); FormField itemNameField; - if (itemFields.TryGetValue("MerchantName", out itemNameField)) + if (itemFields.TryGetValue("Name", out itemNameField)) { if (itemNameField.Value.Type == FieldValueType.String) { string itemName = itemNameField.Value.AsString(); - Console.WriteLine($" Merchant Name: '{itemName}', with confidence {itemNameField.Confidence}"); + Console.WriteLine($" Name: '{itemName}', with confidence {itemNameField.Confidence}"); } } FormField itemTotalPriceField; - if (itemFields.TryGetValue("TotalPriceField", out itemTotalPriceField)) + if (itemFields.TryGetValue("TotalPrice", out itemTotalPriceField)) { if (itemTotalPriceField.Value.Type == FieldValueType.Float) { float itemTotalPrice = itemTotalPriceField.Value.AsFloat(); - Console.WriteLine($" Merchant Name: '{itemTotalPrice}', with confidence {itemTotalPriceField.Confidence}"); + Console.WriteLine($" Total Price: '{itemTotalPrice}', with confidence {itemTotalPriceField.Confidence}"); } } } @@ -206,7 +211,7 @@ using (FileStream stream = new FileStream(receiptPath, FileMode.Open)) { float total = totalField.Value.AsFloat(); - Console.WriteLine($" Total: '{total}', with confidence '{totalField.Confidence}'"); + Console.WriteLine($"Total: '{total}', with confidence '{totalField.Confidence}'"); } } } diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/samples/Sample2_RecognizeReceipts.md b/sdk/formrecognizer/Azure.AI.FormRecognizer/samples/Sample2_RecognizeReceipts.md index f5a6a5ddb86c8..834dffd7282d2 100644 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/samples/Sample2_RecognizeReceipts.md +++ b/sdk/formrecognizer/Azure.AI.FormRecognizer/samples/Sample2_RecognizeReceipts.md @@ -24,7 +24,10 @@ To recognize receipts from a URI, use the `StartRecognizeReceiptsFromUri` method ```C# Snippet:FormRecognizerSampleRecognizeReceiptFileFromUri RecognizedReceiptCollection receipts = await client.StartRecognizeReceiptsFromUri(new Uri(receiptUri)).WaitForCompletionAsync(); -foreach (var receipt in receipts) +// To see the list of the supported fields returned by service and its corresponding types, consult: +// https://westus2.dev.cognitive.microsoft.com/docs/services/form-recognizer-api-v2-preview/operations/GetAnalyzeReceiptResult + +foreach (RecognizedReceipt receipt in receipts) { FormField merchantNameField; if (receipt.RecognizedForm.Fields.TryGetValue("MerchantName", out merchantNameField)) @@ -33,7 +36,7 @@ foreach (var receipt in receipts) { string merchantName = merchantNameField.Value.AsString(); - Console.WriteLine($" Merchant Name: '{merchantName}', with confidence {merchantNameField.Confidence}"); + Console.WriteLine($"Merchant Name: '{merchantName}', with confidence {merchantNameField.Confidence}"); } } @@ -44,7 +47,7 @@ foreach (var receipt in receipts) { DateTime transactionDate = transactionDateField.Value.AsDate(); - Console.WriteLine($" Transaction Date: '{transactionDate}', with confidence {transactionDateField.Confidence}"); + Console.WriteLine($"Transaction Date: '{transactionDate}', with confidence {transactionDateField.Confidence}"); } } @@ -55,29 +58,31 @@ foreach (var receipt in receipts) { foreach (FormField itemField in itemsField.Value.AsList()) { + Console.WriteLine("Item:"); + if (itemField.Value.Type == FieldValueType.Dictionary) { IReadOnlyDictionary itemFields = itemField.Value.AsDictionary(); FormField itemNameField; - if (itemFields.TryGetValue("MerchantName", out itemNameField)) + if (itemFields.TryGetValue("Name", out itemNameField)) { if (itemNameField.Value.Type == FieldValueType.String) { string itemName = itemNameField.Value.AsString(); - Console.WriteLine($" Merchant Name: '{itemName}', with confidence {itemNameField.Confidence}"); + Console.WriteLine($" Name: '{itemName}', with confidence {itemNameField.Confidence}"); } } FormField itemTotalPriceField; - if (itemFields.TryGetValue("TotalPriceField", out itemTotalPriceField)) + if (itemFields.TryGetValue("TotalPrice", out itemTotalPriceField)) { if (itemTotalPriceField.Value.Type == FieldValueType.Float) { float itemTotalPrice = itemTotalPriceField.Value.AsFloat(); - Console.WriteLine($" Merchant Name: '{itemTotalPrice}', with confidence {itemTotalPriceField.Confidence}"); + Console.WriteLine($" Total Price: '{itemTotalPrice}', with confidence {itemTotalPriceField.Confidence}"); } } } @@ -92,7 +97,7 @@ foreach (var receipt in receipts) { float total = totalField.Value.AsFloat(); - Console.WriteLine($" Total: '{total}', with confidence '{totalField.Confidence}'"); + Console.WriteLine($"Total: '{total}', with confidence '{totalField.Confidence}'"); } } } diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromFile.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromFile.cs index 08f02d2e81c7e..d5640911b9d28 100644 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromFile.cs +++ b/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromFile.cs @@ -31,7 +31,10 @@ public async Task RecognizeReceiptsFromFile() { RecognizedReceiptCollection receipts = await client.StartRecognizeReceipts(stream).WaitForCompletionAsync(); - foreach (var receipt in receipts) + // To see the list of the supported fields returned by service and its corresponding types, consult: + // https://westus2.dev.cognitive.microsoft.com/docs/services/form-recognizer-api-v2-preview/operations/GetAnalyzeReceiptResult + + foreach (RecognizedReceipt receipt in receipts) { FormField merchantNameField; if (receipt.RecognizedForm.Fields.TryGetValue("MerchantName", out merchantNameField)) diff --git a/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromUri.cs b/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromUri.cs index d751bc0f34a55..597ee86c4d72b 100644 --- a/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromUri.cs +++ b/sdk/formrecognizer/Azure.AI.FormRecognizer/tests/samples/Sample2_RecognizeReceiptsFromUri.cs @@ -26,7 +26,10 @@ public async Task RecognizeReceiptsFromUri() #region Snippet:FormRecognizerSampleRecognizeReceiptFileFromUri RecognizedReceiptCollection receipts = await client.StartRecognizeReceiptsFromUri(new Uri(receiptUri)).WaitForCompletionAsync(); - foreach (var receipt in receipts) + // To see the list of the supported fields returned by service and its corresponding types, consult: + // https://westus2.dev.cognitive.microsoft.com/docs/services/form-recognizer-api-v2-preview/operations/GetAnalyzeReceiptResult + + foreach (RecognizedReceipt receipt in receipts) { FormField merchantNameField; if (receipt.RecognizedForm.Fields.TryGetValue("MerchantName", out merchantNameField))