From bc1995afd553760d72ffff7799e542171e36f7c8 Mon Sep 17 00:00:00 2001 From: Sameeksha Vaity Date: Sun, 21 Jun 2020 19:52:55 -0700 Subject: [PATCH 1/9] receipt design update --- .../azure-ai-formrecognizer/README.md | 82 ++++--- .../FormRecognizerAsyncClient.java | 14 +- .../formrecognizer/FormRecognizerClient.java | 7 +- .../azure/ai/formrecognizer/Transforms.java | 93 +++----- .../ai/formrecognizer/models/FieldValue.java | 215 ------------------ .../formrecognizer/models/FieldValueType.java | 64 ------ .../ai/formrecognizer/models/FormField.java | 8 +- .../formrecognizer/models/RecognizedForm.java | 6 +- .../models/RecognizedReceipt.java | 36 --- .../ai/formrecognizer/Authentication.java | 95 ++++---- ...ognizerAsyncClientJavaDocCodeSnippets.java | 173 +++++++------- ...rmRecognizerClientJavaDocCodeSnippets.java | 89 ++++---- .../ai/formrecognizer/ReadmeSamples.java | 55 +++-- .../ai/formrecognizer/ReceiptExtensions.java | 129 +++++++++++ .../ai/formrecognizer/RecognizeReceipts.java | 73 +++--- .../RecognizeReceiptsAsync.java | 13 +- .../RecognizeReceiptsFromUrl.java | 78 ++++--- .../RecognizeReceiptsFromUrlAsync.java | 82 +++---- .../StronglyTypedRecognizedFormUSReceipt.java | 78 +++++++ .../azure/ai/formrecognizer/USReceipt.java | 209 +++++++++++++++++ .../ai/formrecognizer/USReceiptItem.java | 85 +++++++ .../ai/formrecognizer/USReceiptType.java | 51 +++++ .../FormRecognizerAsyncClientTest.java | 26 +-- .../FormRecognizerClientTest.java | 1 - .../FormRecognizerClientTestBase.java | 82 ++++--- 25 files changed, 1062 insertions(+), 782 deletions(-) delete mode 100644 sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValue.java delete mode 100644 sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValueType.java delete mode 100644 sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/RecognizedReceipt.java create mode 100644 sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReceiptExtensions.java create mode 100644 sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/StronglyTypedRecognizedFormUSReceipt.java create mode 100644 sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/USReceipt.java create mode 100644 sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/USReceiptItem.java create mode 100644 sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/USReceiptType.java diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/README.md b/sdk/formrecognizer/azure-ai-formrecognizer/README.md index 1ba2bd54919b..70e96016c495 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/README.md +++ b/sdk/formrecognizer/azure-ai-formrecognizer/README.md @@ -99,6 +99,10 @@ FormTrainingClient formTrainingClient = new FormTrainingClientBuilder() The Azure Form Recognizer client library provides a way to **rotate the existing key**. +<<<<<<< HEAD +======= +>>>>>>> 66b3ab9031... receipt design update +>>>>>>> 407953ed61... receipt design update ```java AzureKeyCredential credential = new AzureKeyCredential("{key}"); FormRecognizerClient formRecognizerClient = new FormRecognizerClientBuilder() @@ -195,7 +199,11 @@ The following section provides several code snippets covering some of the most c ### Recognize Forms Using a Custom Model Recognize name/value pairs and table data from forms. These models are trained with your own data, so they're tailored to your forms. You should only recognize forms of the same form type that the custom model was trained on. +<<<<<<< HEAD +======= + +>>>>>>> 407953ed61... receipt design update ```java String formUrl = "{form_url}"; String modelId = "{custom_trained_model_id}"; @@ -208,7 +216,7 @@ for (int i = 0; i < recognizedForms.size(); i++) { RecognizedForm form = recognizedForms.get(i); System.out.printf("----------- Recognized Form %d-----------%n", i); System.out.printf("Form type: %s%n", form.getFormType()); - form.getFields().forEach((label, formField) -> { + form.getFields().forEach((label, formField) -> System.out.printf("Field %s has value %s with confidence score of %f.%n", label, formField.getValueData().getText(), formField.getConfidence()); @@ -219,7 +227,11 @@ for (int i = 0; i < recognizedForms.size(); i++) { ### Recognize Content Recognize text and table structures, along with their bounding box coordinates, from documents. +<<<<<<< HEAD +======= + +>>>>>>> 407953ed61... receipt design update ```java // recognize form content using file input stream File form = new File("local/file_path/filename.png"); @@ -241,10 +253,8 @@ for (int i = 0; i < contentPageResults.size(); i++) { formPage.getTables().forEach(formTable -> { System.out.printf("Table has %d rows and %d columns.%n", formTable.getRowCount(), formTable.getColumnCount()); - formTable.getCells().forEach(formTableCell -> { - System.out.printf("Cell has text %s.%n", formTableCell.getText()); - }); - System.out.println(); + formTable.getCells().forEach(formTableCell -> + System.out.printf("Cell has text %s.%n", formTableCell.getText())); }); } ``` @@ -252,48 +262,52 @@ for (int i = 0; i < contentPageResults.size(); i++) { ### Recognize receipts Recognize data from a USA sales receipts using a prebuilt model. [Here][service_recognize_receipt] are the fields the service returns for a recognized receipt. +<<<<<<< HEAD +======= + +>>>>>>> 407953ed61... receipt design update ```java String receiptUrl = "https://docs.microsoft.com/en-us/azure/cognitive-services/form-recognizer/media" + "/contoso-allinone.jpg"; -SyncPoller> syncPoller = +SyncPoller> syncPoller = formRecognizerClient.beginRecognizeReceiptsFromUrl(receiptUrl); -List receiptPageResults = syncPoller.getFinalResult(); +List receiptPageResults = syncPoller.getFinalResult(); for (int i = 0; i < receiptPageResults.size(); i++) { - RecognizedReceipt recognizedReceipt = receiptPageResults.get(i); - Map recognizedFields = recognizedReceipt.getRecognizedForm().getFields(); + RecognizedForm recognizedReceipt = receiptPageResults.get(i); + Map> recognizedFields = recognizedReceipt.getFields(); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); - FormField merchantNameField = recognizedFields.get("MerchantName"); - if (merchantNameField.getFieldValue().getType() == FieldValueType.STRING) { + FormField merchantNameField = recognizedFields.get("MerchantName"); + if (merchantNameField.getFieldValue() instanceof String) { System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantNameField.getFieldValue().asString(), + merchantNameField.getFieldValue(), merchantNameField.getConfidence()); } - FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField.getFieldValue().getType() == FieldValueType.DATE) { + FormField transactionDateField = recognizedFields.get("TransactionDate"); + if (transactionDateField.getFieldValue() instanceof LocalDate) { System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDateField.getFieldValue().asDate(), + transactionDateField.getFieldValue(), transactionDateField.getConfidence()); } - FormField receiptItemsField = recognizedFields.get("Items"); + FormField receiptItemsField = recognizedFields.get("Items"); System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getFieldValue().getType() == FieldValueType.LIST) { - List receiptItems = receiptItemsField.getFieldValue().asList(); + if (receiptItemsField.getFieldValue() instanceof List) { + List> receiptItems = (List>) receiptItemsField.getFieldValue(); receiptItems.forEach(receiptItem -> { - if (receiptItem.getFieldValue().getType() == FieldValueType.MAP) { - receiptItem.getFieldValue().asMap().forEach((key, formField) -> { - if (key.equals("Name")) { - if (formField.getFieldValue().getType() == FieldValueType.STRING) { + if (receiptItem.getFieldValue() instanceof Map) { + ((Map>) receiptItem.getFieldValue()).forEach((key, formField) -> { + if ("Name".equals(key)) { + if (formField.getFieldValue() instanceof String) { System.out.printf("Name: %s, confidence: %.2fs%n", - formField.getFieldValue().asString(), + formField.getFieldValue(), formField.getConfidence()); } } - if (key.equals("Quantity")) { - if (formField.getFieldValue().getType() == FieldValueType.INTEGER) { + if ("Quantity".equals(key)) { + if (formField.getFieldValue() instanceof Integer) { System.out.printf("Quantity: %d, confidence: %.2f%n", - formField.getFieldValue().asInteger(), formField.getConfidence()); + formField.getFieldValue(), formField.getConfidence()); } } }); @@ -307,7 +321,11 @@ for (int i = 0; i < receiptPageResults.size(); i++) { Train a machine-learned model on your own form type. The resulting model will be able to recognize values from the types of forms it was trained on. Provide a container SAS url to your Azure Storage Blob container where you're storing the training documents. See details on setting this up in the [service quickstart documentation][quickstart_training]. +<<<<<<< HEAD +======= + +>>>>>>> 407953ed61... receipt design update ```java String trainingFilesUrl = "{SAS-URL-of-your-container-in-blob-storage}"; SyncPoller trainingPoller = @@ -334,7 +352,11 @@ customFormModel.getSubmodels().forEach(customFormSubmodel -> { ### Manage your models Manage the custom models attached to your account. +<<<<<<< HEAD +======= + +>>>>>>> 407953ed61... receipt design update ```java AtomicReference modelId = new AtomicReference<>(); // First, we see how many custom models we have, and what our limit is @@ -376,7 +398,11 @@ to provide an invalid file source URL an `HttpResponseException` would be raised In the following code snippet, the error is handled gracefully by catching the exception and display the additional information about the error. +<<<<<<< HEAD +======= + +>>>>>>> 407953ed61... receipt design update ```java try { formRecognizerClient.beginRecognizeContentFromUrl("invalidSourceUrl"); @@ -414,7 +440,11 @@ These code samples show common scenario operations with the Azure Form Recognize #### Async APIs All the examples shown so far have been using synchronous APIs, but we provide full support for async APIs as well. You'll need to use `FormRecognizerAsyncClient` +<<<<<<< HEAD +======= + +>>>>>>> 407953ed61... receipt design update ```java FormRecognizerAsyncClient formRecognizerAsyncClient = new FormRecognizerClientBuilder() .credential(new AzureKeyCredential("{key}")) diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClient.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClient.java index 6f35bf31af36..9dacc70ecf4b 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClient.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClient.java @@ -16,7 +16,6 @@ import com.azure.ai.formrecognizer.models.OperationResult; import com.azure.ai.formrecognizer.models.RecognizeOptions; import com.azure.ai.formrecognizer.models.RecognizedForm; -import com.azure.ai.formrecognizer.models.RecognizedReceipt; import com.azure.core.annotation.ReturnType; import com.azure.core.annotation.ServiceClient; import com.azure.core.annotation.ServiceMethod; @@ -38,7 +37,6 @@ import java.util.UUID; import java.util.function.Function; -import static com.azure.ai.formrecognizer.Transforms.toReceipt; import static com.azure.ai.formrecognizer.Transforms.toRecognizedForm; import static com.azure.ai.formrecognizer.Transforms.toRecognizedLayout; import static com.azure.ai.formrecognizer.implementation.Utility.detectContentType; @@ -339,13 +337,13 @@ public PollerFlux> beginRecognizeContent(Flux> + public PollerFlux> beginRecognizeReceiptsFromUrl(String receiptUrl) { return beginRecognizeReceiptsFromUrl(receiptUrl, null); } @@ -403,7 +401,7 @@ public PollerFlux> beginRecognizeContent(Flux> beginRecognizeReceip * analyzing a receipt. * * @return A {@link PollerFlux} that polls the recognize receipt operation until it has completed, has failed, - * or has been cancelled. The completed operation returns a List of {@link RecognizedReceipt}. + * or has been cancelled. The completed operation returns a List of {@link RecognizedForm}. * @throws FormRecognizerException If recognize operation fails and the {@link AnalyzeOperationResult} returned with * an {@link OperationStatus#FAILED}. * @throws NullPointerException If {@code recognizeOptions} is {@code null}. @@ -514,7 +512,7 @@ private Function, Mono> receipt }; } - private Function, Mono>> + private Function, Mono>> fetchExtractReceiptResult(boolean includeFieldElements) { return (pollingContext) -> { try { @@ -522,7 +520,7 @@ private Function, Mono> receipt return service.getAnalyzeReceiptResultWithResponseAsync(resultUid) .map(modelSimpleResponse -> { throwIfAnalyzeStatusInvalid(modelSimpleResponse.getValue()); - return toReceipt(modelSimpleResponse.getValue().getAnalyzeResult(), includeFieldElements); + return toRecognizedForm(modelSimpleResponse.getValue().getAnalyzeResult(), includeFieldElements); }) .onErrorMap(Utility::mapToHttpResponseExceptionIfExist); } catch (RuntimeException ex) { diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/FormRecognizerClient.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/FormRecognizerClient.java index 2d0fcb6f8d42..eea9a9f857b6 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/FormRecognizerClient.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/FormRecognizerClient.java @@ -11,7 +11,6 @@ import com.azure.ai.formrecognizer.models.OperationResult; import com.azure.ai.formrecognizer.models.RecognizeOptions; import com.azure.ai.formrecognizer.models.RecognizedForm; -import com.azure.ai.formrecognizer.models.RecognizedReceipt; import com.azure.core.annotation.ReturnType; import com.azure.core.annotation.ServiceClient; import com.azure.core.annotation.ServiceMethod; @@ -257,7 +256,7 @@ public SyncPoller> beginRecognizeContent(InputSt * @param receiptUrl The URL of the receipt to analyze. * * @return A {@link SyncPoller} to poll the progress of the recognize receipt operation until it has completed, - * has failed, or has been cancelled. The completed operation returns a List of {@link RecognizedReceipt}. + * has failed, or has been cancelled. The completed operation returns a List of {@link RecognizedForm}. * @throws FormRecognizerException If recognize operation fails and the {@link AnalyzeOperationResult} returned with * an {@link OperationStatus#FAILED}. * @throws NullPointerException If {@code receiptUrl} is {@code null}. @@ -306,7 +305,7 @@ public SyncPoller> beginRecognizeReceip * @param length The exact length of the data. * * @return A {@link SyncPoller} that polls the recognize receipt operation until it has completed, - * has failed, or has been cancelled. The completed operation returns a List of {@link RecognizedReceipt}. + * has failed, or has been cancelled. The completed operation returns a List of {@link RecognizedForm}. * @throws FormRecognizerException If recognize operation fails and the {@link AnalyzeOperationResult} returned with * an {@link OperationStatus#FAILED}. * @throws NullPointerException If {@code receipt} is {@code null}. @@ -333,7 +332,7 @@ public SyncPoller> beginRecognizeReceip * analyzing a receipt. * * @return A {@link SyncPoller} that polls the recognize receipt operation until it has completed, has failed, - * or has been cancelled. The completed operation returns a List of {@link RecognizedReceipt}. + * or has been cancelled. The completed operation returns a List of {@link RecognizedForm}. * @throws FormRecognizerException If recognize operation fails and the {@link AnalyzeOperationResult} returned with * an {@link OperationStatus#FAILED}. * @throws NullPointerException If {@code recognizeOptions} is {@code null}. diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/Transforms.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/Transforms.java index 156c0a8f28ab..55f7d5e8e21b 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/Transforms.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/Transforms.java @@ -13,7 +13,8 @@ import com.azure.ai.formrecognizer.implementation.models.TextWord; import com.azure.ai.formrecognizer.models.BoundingBox; import com.azure.ai.formrecognizer.models.FieldData; -import com.azure.ai.formrecognizer.models.FieldValueType; +import com.azure.ai.formrecognizer.models.FieldText; +import com.azure.ai.formrecognizer.models.FormContent; import com.azure.ai.formrecognizer.models.FormElement; import com.azure.ai.formrecognizer.models.FormField; import com.azure.ai.formrecognizer.models.FormLine; @@ -25,7 +26,6 @@ import com.azure.ai.formrecognizer.models.LengthUnit; import com.azure.ai.formrecognizer.models.Point; import com.azure.ai.formrecognizer.models.RecognizedForm; -import com.azure.ai.formrecognizer.models.RecognizedReceipt; import com.azure.core.util.CoreUtils; import com.azure.core.util.logging.ClientLogger; @@ -80,7 +80,7 @@ static List toRecognizedForm(AnalyzeResult analyzeResult, boolea formPageRange = new FormPageRange(1, 1); } - Map extractedFieldMap = getUnlabeledFieldMap(documentResultItem, readResults, + Map> extractedFieldMap = getUnlabeledFieldMap(documentResultItem, readResults, includeFieldElements); extractedFormList.add(new RecognizedForm( extractedFieldMap, @@ -97,7 +97,7 @@ static List toRecognizedForm(AnalyzeResult analyzeResult, boolea if (clusterId != null) { formType.append(clusterId); } - Map extractedFieldMap = getLabeledFieldMap(includeFieldElements, readResults, + Map> extractedFieldMap = getLabeledFieldMap(includeFieldElements, readResults, pageResultItem, pageNumber); extractedFormList.add(new RecognizedForm( @@ -110,21 +110,6 @@ static List toRecognizedForm(AnalyzeResult analyzeResult, boolea return extractedFormList; } - /** - * Helper method to transform the service returned {@link AnalyzeResult} to SDK model {@link RecognizedReceipt}. - * - * @param analyzeResult The service returned result for analyze receipts. - * @param includeFieldElements Boolean to indicate if to set reference elements data on fields. - * - * @return The List of {@code RecognizedReceipt}. - */ - static List toReceipt(AnalyzeResult analyzeResult, boolean includeFieldElements) { - return toRecognizedForm(analyzeResult, includeFieldElements) - .stream() - .map(recognizedForm -> new RecognizedReceipt(recognizedForm)) - .collect(Collectors.toList()); - } - /** * Helper method to transform the service returned {@link AnalyzeResult} to SDK model {@link FormPage}. * @@ -213,9 +198,9 @@ static List getReadResultFormLines(ReadResult readResultItem) { * * @return The {@code RecognizedForm#getFields}. */ - private static Map getUnlabeledFieldMap(DocumentResult documentResultItem, + private static Map> getUnlabeledFieldMap(DocumentResult documentResultItem, List readResults, boolean includeFieldElements) { - Map extractedFieldMap = new TreeMap<>(); + Map> extractedFieldMap = new TreeMap<>(); // add receipt fields if (!CoreUtils.isNullOrEmpty(documentResultItem.getFields())) { documentResultItem.getFields().forEach((key, fieldValue) -> { @@ -232,8 +217,8 @@ private static Map getUnlabeledFieldMap(DocumentResult docume extractedFieldMap.put(key, setFormField(labelText, key, fieldValue, valueText, pageNumber, readResults)); } else { - FieldData labelText = new FieldData(key, null, null, null); - extractedFieldMap.put(key, new FormField(DEFAULT_CONFIDENCE_VALUE, labelText, + FieldText labelText = new FieldText(key, null, null, null); + extractedFieldMap.put(key, new FormField<>(DEFAULT_CONFIDENCE_VALUE, labelText, key, null, null)); } }); @@ -254,51 +239,43 @@ private static Map getUnlabeledFieldMap(DocumentResult docume * * @return The strongly typed {@link FormField} for the field input. */ - private static FormField setFormField(FieldData labelText, String key, FieldValue fieldValue, - FieldData valueText, Integer pageNumber, List readResults) { - FormField value; + private static FormField setFormField(FieldText labelText, String key, FieldValue fieldValue, + FieldText valueText, Integer pageNumber, List readResults) { + FormField value; switch (fieldValue.getType()) { case PHONE_NUMBER: - value = new FormField(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText, - key, new com.azure.ai.formrecognizer.models.FieldValue(FieldValueType.PHONE_NUMBER). - setFormFieldPhoneNumber(fieldValue.getValuePhoneNumber()), valueText); + value = new FormField<>(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText, + key, fieldValue.getValuePhoneNumber(), valueText); break; case STRING: - value = new FormField(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText, - key, new com.azure.ai.formrecognizer.models.FieldValue(FieldValueType.STRING) - .setFormFieldString(fieldValue.getValueString()), valueText); + value = new FormField<>(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText, + key, fieldValue.getValueString(), valueText); break; case TIME: LocalTime fieldTime = fieldValue.getValueTime() == null ? null : LocalTime .parse(fieldValue.getValueTime(), DateTimeFormatter.ofPattern("HH:mm:ss")); - value = new FormField(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText, - key, new com.azure.ai.formrecognizer.models.FieldValue(FieldValueType.TIME) - .setFormFieldTime(fieldTime), valueText); + value = new FormField<>(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText, + key, fieldTime, valueText); break; case DATE: - value = new FormField(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText, - key, new com.azure.ai.formrecognizer.models.FieldValue(FieldValueType.DATE) - .setFormFieldDate(fieldValue.getValueDate()), valueText); + value = new FormField<>(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText, + key, fieldValue.getValueDate(), valueText); break; case INTEGER: - value = new FormField(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText, - key, new com.azure.ai.formrecognizer.models.FieldValue(FieldValueType.INTEGER) - .setFormFieldInteger(fieldValue.getValueInteger()), valueText); + value = new FormField<>(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText, + key, fieldValue.getValueInteger(), valueText); break; case NUMBER: - value = new FormField(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText, - key, new com.azure.ai.formrecognizer.models.FieldValue(FieldValueType.FLOAT) - .setFormFieldFloat(fieldValue.getValueNumber()), valueText); + value = new FormField<>(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText, + key, fieldValue.getValueNumber(), valueText); break; case ARRAY: - value = new FormField(setDefaultConfidenceValue(fieldValue.getConfidence()), null, key, - new com.azure.ai.formrecognizer.models.FieldValue(FieldValueType.LIST) - .setFormFieldList(toFormFieldArray(fieldValue.getValueArray(), readResults)), null); + value = new FormField<>(setDefaultConfidenceValue(fieldValue.getConfidence()), null, key, + toFormFieldArray(fieldValue.getValueArray(), readResults), null); break; case OBJECT: - value = new FormField(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText, - key, new com.azure.ai.formrecognizer.models.FieldValue(FieldValueType.MAP) - .setFormFieldMap(toFormFieldObject(fieldValue.getValueObject(), pageNumber, readResults)), valueText + value = new FormField<>(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText, + key, toFormFieldObject(fieldValue.getValueObject(), pageNumber, readResults), valueText ); break; default: @@ -327,9 +304,9 @@ private static float setDefaultConfidenceValue(Float confidence) { * * @return The Map of {@link FormField}. */ - private static Map toFormFieldObject(Map valueObject, + private static Map> toFormFieldObject(Map valueObject, Integer pageNumber, List readResults) { - Map fieldValueObjectMap = new TreeMap<>(); + Map> fieldValueObjectMap = new TreeMap<>(); valueObject.forEach((key, fieldValue) -> fieldValueObjectMap.put(key, setFormField(null, key, fieldValue, new FieldData(fieldValue.getText(), @@ -350,7 +327,7 @@ private static Map toFormFieldObject(Map * * @return The List of {@link FormField}. */ - private static List toFormFieldArray(List valueArray, List readResults) { + private static List> toFormFieldArray(List valueArray, List readResults) { return valueArray.stream() .map(fieldValue -> setFormField(null, null, fieldValue, null, fieldValue.getPage(), readResults)) .collect(Collectors.toList()); @@ -388,10 +365,10 @@ private static FormPage getFormPage(ReadResult readResultItem, List p * * @return The fields populated on {@link RecognizedForm#getFields() fields}. */ - private static Map getLabeledFieldMap(boolean includeFieldElements, + private static Map> getLabeledFieldMap(boolean includeFieldElements, List readResults, PageResult pageResultItem, Integer pageNumber) { - Map formFieldMap = new TreeMap<>(); + Map> formFieldMap = new TreeMap<>(); List keyValuePairs = pageResultItem.getKeyValuePairs(); forEachWithIndex(keyValuePairs, ((index, keyValuePair) -> { List formKeyContentList = null; @@ -407,10 +384,8 @@ private static Map getLabeledFieldMap(boolean includeFieldEle toBoundingBox(keyValuePair.getValue().getBoundingBox()), pageNumber, formValueContentList); String fieldName = "field-" + index; - FormField formField = new FormField(setDefaultConfidenceValue(keyValuePair.getConfidence()), - labelFieldData, fieldName, - new com.azure.ai.formrecognizer.models.FieldValue(FieldValueType.STRING) - .setFormFieldString(keyValuePair.getValue().getText()), valueText); + FormField formField = new FormField<>(setDefaultConfidenceValue(keyValuePair.getConfidence()), + labelFieldText, fieldName, keyValuePair.getValue().getText(), valueText); formFieldMap.put(fieldName, formField); })); return formFieldMap; diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValue.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValue.java deleted file mode 100644 index 688930ce2439..000000000000 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValue.java +++ /dev/null @@ -1,215 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.ai.formrecognizer.models; - -import com.azure.core.annotation.Fluent; - -import java.time.LocalDate; -import java.time.LocalTime; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -/** - * The FieldValue model. - */ -@Fluent -public final class FieldValue { - private final FieldValueType type; - private Map formFieldMap; - private List formFieldList; - private Float formFieldFloat; - private Integer formFieldInteger; - private LocalDate formFieldDate; - private LocalTime formFieldTime; - private String formFieldString; - private String formFieldPhoneNumber; - - /** - * Constructs a FieldValue object - * - * @param type The type of the field. - */ - public FieldValue(final FieldValueType type) { - this.type = type; - } - - /** - * Set the map value of the field. - * - * @param formFieldMap the map value of the field. - * - * @return the FieldValue object itself. - */ - public FieldValue setFormFieldMap(final Map formFieldMap) { - this.formFieldMap = formFieldMap == null ? null : Collections.unmodifiableMap(formFieldMap); - return this; - } - - /** - * Set the list value of the field. - * - * @param formFieldList the list of the field. - * - * @return the FieldValue object itself. - */ - public FieldValue setFormFieldList(final List formFieldList) { - this.formFieldList = formFieldList == null ? null - : Collections.unmodifiableList(formFieldList); - return this; - } - - /** - * Set the float value of the field. - * - * @param formFieldFloat the float value of the field. - * - * @return the FieldValue object itself. - */ - public FieldValue setFormFieldFloat(final Float formFieldFloat) { - this.formFieldFloat = formFieldFloat; - return this; - } - - /** - * Set the integer value of the field. - * - * @param formFieldInteger the integer value of the field. - * - * @return the FieldValue object itself. - */ - public FieldValue setFormFieldInteger(final Integer formFieldInteger) { - this.formFieldInteger = formFieldInteger; - return this; - } - - /** - * Set the date value of the field. - * - * @param formFieldDate the date value of the field. - * - * @return the FieldValue object itself. - */ - public FieldValue setFormFieldDate(final LocalDate formFieldDate) { - this.formFieldDate = formFieldDate; - return this; - } - - /** - * Set the time value of the field. - * - * @param formFieldTime the time value of the field. - * - * @return the FieldValue object itself. - */ - public FieldValue setFormFieldTime(final LocalTime formFieldTime) { - this.formFieldTime = formFieldTime; - return this; - } - - /** - * Set the string value of the field. - * - * @param formFieldString the string value of the field. - * - * @return the FieldValue object itself. - */ - public FieldValue setFormFieldString(final String formFieldString) { - this.formFieldString = formFieldString; - return this; - } - - /** - * Set the phone number value of the field. - * - * @param formFieldPhoneNumber the phone number value of the field. - * - * @return the FieldValue object itself. - */ - public FieldValue setFormFieldPhoneNumber(final String formFieldPhoneNumber) { - this.formFieldPhoneNumber = formFieldPhoneNumber; - return this; - } - - /** - * Gets the type of the value of the field. - * - * @return the {@link FieldValueType type} of the field. - */ - public FieldValueType getType() { - return type; - } - - /** - * Gets the value of the field as a {@link String}. - * - * @return the value of the field as a {@link String}. - */ - public String asString() { - return this.formFieldString; - } - - /** - * Gets the value of the field as a {@link Integer}. - * - * @return the value of the field as a {@link Integer}. - */ - public Integer asInteger() { - return this.formFieldInteger; - } - - /** - * Gets the value of the field as a {@link Float}. - * - * @return the value of the field as a {@link Float}. - */ - public Float asFloat() { - return this.formFieldFloat; - } - - /** - * Gets the value of the field as a {@link LocalDate}. - * - * @return the value of the field as a {@link LocalDate}. - */ - public LocalDate asDate() { - return this.formFieldDate; - } - - /** - * Gets the value of the field as a {@link LocalTime}. - * - * @return the value of the field as a {@link LocalTime}. - */ - public LocalTime asTime() { - return this.formFieldTime; - } - - /** - * Gets the value of the field as a phone number. - * - * @return the value of the field as a phone number. - */ - public String asPhoneNumber() { - return this.formFieldPhoneNumber; - } - - /** - * Gets the value of the field as a {@link List}. - * - * @return the value of the field as an unmodifiable {@link List}. - */ - public List asList() { - return this.formFieldList; - } - - /** - * Gets the value of the field as a {@link Map}. - * - * @return the value of the field as an unmodifiable {@link Map}. - */ - public Map asMap() { - return this.formFieldMap; - } -} diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValueType.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValueType.java deleted file mode 100644 index 93e5f7dda8b0..000000000000 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValueType.java +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.ai.formrecognizer.models; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonValue; - -/** Defines values for FieldValueType. */ -public enum FieldValueType { - /** Enum value string. */ - STRING("string"), - - /** Enum value date. */ - DATE("date"), - - /** Enum value time. */ - TIME("time"), - - /** Enum value phoneNumber. */ - PHONE_NUMBER("phoneNumber"), - - /** Enum value number. */ - FLOAT("float"), - - /** Enum value integer. */ - INTEGER("integer"), - - /** Enum value array. */ - LIST("list"), - - /** Enum value object. */ - MAP("map"); - - /** The actual serialized value for a FieldValueType instance. */ - private final String value; - - FieldValueType(String value) { - this.value = value; - } - - /** - * Parses a serialized value to a FieldValueType instance. - * - * @param value the serialized value to parse. - * @return the parsed FieldValueType object, or null if unable to parse. - */ - @JsonCreator - public static FieldValueType fromString(String value) { - FieldValueType[] items = FieldValueType.values(); - for (FieldValueType item : items) { - if (item.toString().equalsIgnoreCase(value)) { - return item; - } - } - return null; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FormField.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FormField.java index 036bfbef2db2..fb32c069e933 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FormField.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FormField.java @@ -9,13 +9,13 @@ * The FormField model. */ @Immutable -public final class FormField { +public final class FormField { private final float confidence; private final FieldData labelData; private final String name; - private final FieldValue fieldValue; private final FieldData valueData; + private final T fieldValue; /** * Constructs a FormField object. @@ -26,7 +26,7 @@ public final class FormField { * @param fieldValue The value of the recognized field. * @param valueData The text, bounding box, and field elements for the field value. */ - public FormField(final float confidence, final FieldData labelData, final String name, final FieldValue fieldValue, + public FormField(final float confidence, final FieldData labelData, final String name, final T fieldValue, final FieldData valueData) { this.confidence = confidence; this.labelData = labelData; @@ -67,7 +67,7 @@ public String getName() { * * @return Value of the recognized field. */ - public FieldValue getFieldValue() { + public T getFieldValue() { return this.fieldValue; } diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/RecognizedForm.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/RecognizedForm.java index 5a8c11011ca7..9b775763a9f4 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/RecognizedForm.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/RecognizedForm.java @@ -20,7 +20,7 @@ public final class RecognizedForm { * For models trained with labels, this is the training-time label of the field. For models trained with forms * only, a unique name is generated for each field. */ - private final Map fields; + private final Map> fields; /* * Form type. @@ -45,7 +45,7 @@ public final class RecognizedForm { * @param formPageRange First and last page number where the document is found. * @param pages List of extracted pages from the form. */ - public RecognizedForm(final Map fields, final String formType, + public RecognizedForm(final Map> fields, final String formType, final FormPageRange formPageRange, final List pages) { this.fields = fields == null ? null : Collections.unmodifiableMap(fields); this.formType = formType; @@ -60,7 +60,7 @@ public RecognizedForm(final Map fields, final String formType * * @return the unmodifiable map of recognized fields. */ - public Map getFields() { + public Map> getFields() { return this.fields; } diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/RecognizedReceipt.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/RecognizedReceipt.java deleted file mode 100644 index 2f16596dfaca..000000000000 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/RecognizedReceipt.java +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.ai.formrecognizer.models; - -import com.azure.core.annotation.Immutable; - -/** - * The RecognizedReceipt model. - */ -@Immutable -public class RecognizedReceipt { - - /** - * The recognized form. - */ - private final RecognizedForm recognizedForm; - - /** - * Constructs a RecognizedReceipt object. - * - * @param recognizedForm The recognized form. - */ - public RecognizedReceipt(final RecognizedForm recognizedForm) { - this.recognizedForm = recognizedForm; - } - - /** - * Get the extracted field information form for the provided document. - * - * @return The extracted field information form for the provided document. - */ - public RecognizedForm getRecognizedForm() { - return this.recognizedForm; - } -} diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/Authentication.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/Authentication.java index a8ddc6396270..f8bb658c3ee0 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/Authentication.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/Authentication.java @@ -4,10 +4,9 @@ package com.azure.ai.formrecognizer; import com.azure.ai.formrecognizer.models.AccountProperties; -import com.azure.ai.formrecognizer.models.FieldValueType; import com.azure.ai.formrecognizer.models.FormField; import com.azure.ai.formrecognizer.models.OperationResult; -import com.azure.ai.formrecognizer.models.RecognizedReceipt; +import com.azure.ai.formrecognizer.models.RecognizedForm; import com.azure.ai.formrecognizer.training.FormTrainingClient; import com.azure.ai.formrecognizer.training.FormTrainingClientBuilder; import com.azure.core.credential.AzureKeyCredential; @@ -15,13 +14,14 @@ import com.azure.identity.DefaultAzureCredentialBuilder; import java.io.IOException; +import java.time.LocalDate; import java.util.List; import java.util.Map; /** * Samples for two supported methods of authentication in Form Recognizer and Form Training clients: - * 1) Use a Form Recognizer API key with AzureKeyCredential from azure.core.credentials - * 2) Use a token credential from azure-identity to authenticate with Azure Active Directory + * 1) Use a Form Recognizer API key with AzureKeyCredential from azure.core.credentials + * 2) Use a token credential from azure-identity to authenticate with Azure Active Directory */ public class Authentication { /** @@ -32,13 +32,13 @@ public class Authentication { * @throws IOException Exception thrown when there is an error in reading all the bytes from the File. */ public static void main(String[] args) { - /* - Set the environment variables with your own values before running the sample: + /** + * Set the environment variables with your own values before running the sample: + * AZURE_CLIENT_ID - the client ID of your active directory application. + * AZURE_TENANT_ID - the tenant ID of your active directory application. + * AZURE_CLIENT_SECRET - the secret of your active directory application. + */ - 1) AZURE_CLIENT_ID - the client ID of your active directory application. - 2) AZURE_TENANT_ID - the tenant ID of your active directory application. - 3) AZURE_CLIENT_SECRET - the secret of your active directory application. - */ // Form recognizer client: Key credential authenticationWithKeyCredentialFormRecognizerClient(); // Form recognizer client: Azure Active Directory @@ -81,53 +81,60 @@ private static void authenticationWithAzureActiveDirectoryFormTrainingClient() { getAccountProperties(formTrainingClient); } + @SuppressWarnings("unchecked") private static void beginRecognizeCustomFormsFromUrl(FormRecognizerClient formRecognizerClient) { - String receiptUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-java/master/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/sample-forms/receipts/contoso-allinone.jpg"; + String receiptUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-java/master/sdk/formrecognizer" + + "/azure-ai-formrecognizer/src/samples/java/sample-forms/receipts/contoso-allinone.jpg"; - SyncPoller> recognizeReceiptPoller = + SyncPoller> recognizeReceiptPoller = formRecognizerClient.beginRecognizeReceiptsFromUrl(receiptUrl); - List receiptPageResults = recognizeReceiptPoller.getFinalResult(); + List receiptPageResults = recognizeReceiptPoller.getFinalResult(); for (int i = 0; i < receiptPageResults.size(); i++) { - RecognizedReceipt recognizedReceipt = receiptPageResults.get(i); - Map recognizedFields = recognizedReceipt.getRecognizedForm().getFields(); + RecognizedForm recognizedReceipt = receiptPageResults.get(i); + Map> recognizedFields = recognizedReceipt.getFields(); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); - FormField merchantNameField = recognizedFields.get("MerchantName"); - if (merchantNameField.getFieldValue().getType() == FieldValueType.STRING) { + FormField merchantNameField = recognizedFields.get("MerchantName"); + Object merchantNameFieldValue = recognizedFields.get("MerchantName").getFieldValue(); + if (merchantNameFieldValue instanceof String) { System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantNameField.getFieldValue().asString(), - merchantNameField.getConfidence()); + merchantNameFieldValue, merchantNameField.getConfidence()); } - FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField.getFieldValue().getType() == FieldValueType.DATE) { + + FormField transactionDateField = recognizedFields.get("TransactionDate"); + Object transactionDateFieldValue = recognizedFields.get("MerchantName").getFieldValue(); + if (transactionDateFieldValue instanceof LocalDate) { + LocalDate transactionDate = (LocalDate) transactionDateFieldValue; System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDateField.getFieldValue().asDate(), - transactionDateField.getConfidence()); + transactionDate, transactionDateField.getConfidence()); } - FormField receiptItemsField = recognizedFields.get("Items"); - System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getFieldValue().getType() == FieldValueType.LIST) { - List receiptItems = receiptItemsField.getFieldValue().asList(); - receiptItems.forEach(receiptItem -> { - if (receiptItem.getFieldValue().getType() == FieldValueType.MAP) { - receiptItem.getFieldValue().asMap().forEach((key, formField) -> { - if (key.equals("Name")) { - if (formField.getFieldValue().getType() == FieldValueType.STRING) { - System.out.printf("Name: %s, confidence: %.2fs%n", - formField.getFieldValue().asString(), - formField.getConfidence()); + + FormField receiptItemsField = recognizedFields.get("Items"); + if (receiptItemsField != null) { + System.out.printf("Receipt Items: %n"); + if (receiptItemsField.getFieldValue() instanceof List) { + List> receiptItems = (List>) receiptItemsField.getFieldValue(); + receiptItems.forEach(receiptItem -> { + if (receiptItem.getFieldValue() instanceof Map) { + ((Map>) receiptItem.getFieldValue()).forEach((key, formField) -> { + if ("Name".equals(key)) { + if (formField.getFieldValue() instanceof String) { + System.out.printf("Name: %s, confidence: %.2fs%n", + formField.getFieldValue(), + formField.getConfidence()); + } } - } - if (key.equals("Quantity")) { - if (formField.getFieldValue().getType() == FieldValueType.INTEGER) { - System.out.printf("Quantity: %s, confidence: %.2f%n", - formField.getFieldValue().asInteger(), formField.getConfidence()); + if ("Quantity".equals(key)) { + if (formField.getFieldValue() instanceof Integer) { + System.out.printf("Quantity: %d, confidence: %.2f%n", + formField.getFieldValue(), formField.getConfidence()); + } } - } - }); - } - }); + }); + } + }); + } } System.out.print("-----------------------------------"); } diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientJavaDocCodeSnippets.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientJavaDocCodeSnippets.java index ab23ef74d3c2..7e0f1da559a9 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientJavaDocCodeSnippets.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientJavaDocCodeSnippets.java @@ -3,11 +3,10 @@ package com.azure.ai.formrecognizer; -import com.azure.ai.formrecognizer.models.FieldValueType; import com.azure.ai.formrecognizer.models.FormContentType; import com.azure.ai.formrecognizer.models.FormField; import com.azure.ai.formrecognizer.models.RecognizeOptions; -import com.azure.ai.formrecognizer.models.RecognizedReceipt; +import com.azure.ai.formrecognizer.models.RecognizedForm; import com.azure.core.credential.AzureKeyCredential; import com.azure.core.http.HttpPipeline; import com.azure.core.http.HttpPipelineBuilder; @@ -19,6 +18,7 @@ import java.nio.ByteBuffer; import java.nio.file.Files; import java.time.Duration; +import java.time.LocalDate; import java.util.List; import java.util.Map; @@ -280,6 +280,7 @@ public void beginRecognizeContentWithOptions() throws IOException { /** * Code snippet for {@link FormRecognizerAsyncClient#beginRecognizeReceiptsFromUrl(String)} */ + @SuppressWarnings("unchecked") public void beginRecognizeReceiptsFromUrl() { // BEGIN: com.azure.ai.formrecognizer.FormRecognizerAsyncClient.beginRecognizeReceiptsFromUrl#string String receiptUrl = "{receiptUrl}"; @@ -289,32 +290,32 @@ public void beginRecognizeReceiptsFromUrl() { recognizePollingOperation.getFinalResult()) .subscribe(recognizedReceipts -> { for (int i = 0; i < recognizedReceipts.size(); i++) { - RecognizedReceipt recognizedReceipt = recognizedReceipts.get(i); - Map recognizedFields = recognizedReceipt.getRecognizedForm().getFields(); + RecognizedForm recognizedReceipt = recognizedReceipts.get(i); + Map> recognizedFields = recognizedReceipt.getFields(); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); if (merchantNameField.getFieldValue().getType() == FieldValueType.STRING) { System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantNameField.getFieldValue().asString(), + merchantNameField.getFieldValue(), merchantNameField.getConfidence()); } - FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField.getFieldValue().getType() == FieldValueType.DATE) { + FormField transactionDateField = recognizedFields.get("TransactionDate"); + if (transactionDateField.getFieldValue() instanceof LocalDate) { System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDateField.getFieldValue().asDate(), + transactionDateField.getFieldValue(), transactionDateField.getConfidence()); } - FormField receiptItemsField = recognizedFields.get("Items"); + FormField receiptItemsField = recognizedFields.get("Items"); System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getFieldValue().getType() == FieldValueType.LIST) { - List receiptItems = receiptItemsField.getFieldValue().asList(); + if (receiptItemsField.getFieldValue() instanceof List) { + List> receiptItems = (List>) receiptItemsField.getFieldValue(); receiptItems.forEach(receiptItem -> { - if (receiptItem.getFieldValue().getType() == FieldValueType.MAP) { - receiptItem.getFieldValue().asMap().forEach((key, formField) -> { - if (key.equals("Quantity")) { - if (formField.getFieldValue().getType() == FieldValueType.INTEGER) { + if (receiptItem.getFieldValue() instanceof Map) { + ((Map>) receiptItem.getFieldValue()).forEach((key, formField) -> { + if ("Quantity".equals(key)) { + if (formField.getFieldValue() instanceof Integer) { System.out.printf("Quantity: %s, confidence: %.2f%n", - formField.getFieldValue().asInteger(), formField.getConfidence()); + formField.getFieldValue(), formField.getConfidence()); } } }); @@ -384,6 +385,7 @@ public void beginRecognizeReceiptsFromUrlWithOptions() { * * @throws IOException Exception thrown when there is an error in reading all the bytes from the File. */ + @SuppressWarnings("unchecked") public void beginRecognizeReceipts() throws IOException { // BEGIN: com.azure.ai.formrecognizer.FormRecognizerAsyncClient.beginRecognizeReceipts#Flux-long File receipt = new File("{file_source_url}"); @@ -391,40 +393,41 @@ public void beginRecognizeReceipts() throws IOException { formRecognizerAsyncClient.beginRecognizeReceipts(buffer, receipt.length()) .flatMap(recognizePollingOperation -> // if training polling operation completed, retrieve the final result. - recognizePollingOperation.getFinalResult()) - .subscribe(recognizedReceipts -> { - for (int i = 0; i < recognizedReceipts.size(); i++) { - RecognizedReceipt recognizedReceipt = recognizedReceipts.get(i); - Map recognizedFields = recognizedReceipt.getRecognizedForm().getFields(); - System.out.printf("----------- Recognized Receipt page %s -----------%n", i); - FormField merchantNameField = recognizedFields.get("MerchantName"); - if (merchantNameField.getFieldValue().getType() == FieldValueType.STRING) { - System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantNameField.getFieldValue().asString(), - merchantNameField.getConfidence()); - } - FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField.getFieldValue().getType() == FieldValueType.DATE) { - System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDateField.getFieldValue().asDate(), - transactionDateField.getConfidence()); - } - FormField receiptItemsField = recognizedFields.get("Items"); - System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getFieldValue().getType() == FieldValueType.LIST) { - List receiptItems = receiptItemsField.getFieldValue().asList(); - receiptItems.forEach(receiptItem -> { - if (receiptItem.getFieldValue().getType() == FieldValueType.MAP) { - receiptItem.getFieldValue().asMap().forEach((key, formField) -> { - if (key.equals("Quantity")) { - if (formField.getFieldValue().getType() == FieldValueType.INTEGER) { - System.out.printf("Quantity: %s, confidence: %.2f%n", - formField.getFieldValue().asInteger(), formField.getConfidence()); - } - } - }); - } - }); + recognizePollingOperation.getFinalResult().subscribe(recognizedReceipts -> { + for (int i = 0; i < recognizedReceipts.size(); i++) { + RecognizedForm recognizedReceipt = recognizedReceipts.get(i); + Map> recognizedFields = recognizedReceipt.getFields(); + System.out.printf("----------- Recognized Receipt page %s -----------%n", i); + FormField merchantNameField = recognizedFields.get("MerchantName"); + if (merchantNameField.getFieldValue() instanceof String) { + System.out.printf("Merchant Name: %s, confidence: %.2f%n", + merchantNameField.getFieldValue(), + merchantNameField.getConfidence()); + } + FormField transactionDateField = recognizedFields.get("TransactionDate"); + if (transactionDateField.getFieldValue() instanceof LocalDate) { + System.out.printf("Transaction Date: %s, confidence: %.2f%n", + transactionDateField.getFieldValue(), + transactionDateField.getConfidence()); + } + FormField receiptItemsField = recognizedFields.get("Items"); + System.out.printf("Receipt Items: %n"); + if (receiptItemsField.getFieldValue() instanceof List) { + List> receiptItems = (List>) receiptItemsField.getFieldValue(); + receiptItems.forEach(receiptItem -> { + if (receiptItem.getFieldValue() instanceof Map) { + ((Map>) receiptItem.getFieldValue()) + .forEach((key, formField) -> { + if ("Quantity".equals(key)) { + if (formField.getFieldValue() instanceof Integer) { + System.out.printf("Quantity: %s, confidence: %.2f%n", + formField.getFieldValue(), formField.getConfidence()); + } + } + }); + } + }); + } } } }); @@ -437,6 +440,7 @@ public void beginRecognizeReceipts() throws IOException { * * @throws IOException Exception thrown when there is an error in reading all the bytes from the File. */ + @SuppressWarnings("unchecked") public void beginRecognizeReceiptsWithOptions() throws IOException { // BEGIN: com.azure.ai.formrecognizer.FormRecognizerAsyncClient.beginRecognizeReceipts#Flux-long-recognizeOptions File receipt = new File("{local/file_path/fileName.jpg}"); @@ -450,40 +454,41 @@ public void beginRecognizeReceiptsWithOptions() throws IOException { .setPollInterval(Duration.ofSeconds(5))) .flatMap(recognizePollingOperation -> // if training polling operation completed, retrieve the final result. - recognizePollingOperation.getFinalResult()) - .subscribe(recognizedReceipts -> { - for (int i = 0; i < recognizedReceipts.size(); i++) { - RecognizedReceipt recognizedReceipt = recognizedReceipts.get(i); - Map recognizedFields = recognizedReceipt.getRecognizedForm().getFields(); - System.out.printf("----------- Recognized Receipt page %s -----------%n", i); - FormField merchantNameField = recognizedFields.get("MerchantName"); - if (merchantNameField.getFieldValue().getType() == FieldValueType.STRING) { - System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantNameField.getFieldValue().asString(), - merchantNameField.getConfidence()); - } - FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField.getFieldValue().getType() == FieldValueType.DATE) { - System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDateField.getFieldValue().asDate(), - transactionDateField.getConfidence()); - } - FormField receiptItemsField = recognizedFields.get("Items"); - System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getFieldValue().getType() == FieldValueType.LIST) { - List receiptItems = receiptItemsField.getFieldValue().asList(); - receiptItems.forEach(receiptItem -> { - if (receiptItem.getFieldValue().getType() == FieldValueType.MAP) { - receiptItem.getFieldValue().asMap().forEach((key, formField) -> { - if (key.equals("Quantity")) { - if (formField.getFieldValue().getType() == FieldValueType.INTEGER) { - System.out.printf("Quantity: %s, confidence: %.2f%n", - formField.getFieldValue().asInteger(), formField.getConfidence()); - } - } - }); - } - }); + recognizePollingOperation.getFinalResult().subscribe(recognizedReceipts -> { + for (int i = 0; i < recognizedReceipts.size(); i++) { + RecognizedForm recognizedReceipt = recognizedReceipts.get(i); + Map> recognizedFields = recognizedReceipt.getFields(); + System.out.printf("----------- Recognized Receipt page %s -----------%n", i); + FormField merchantNameField = recognizedFields.get("MerchantName"); + if (merchantNameField.getFieldValue() instanceof String) { + System.out.printf("Merchant Name: %s, confidence: %.2f%n", + merchantNameField.getFieldValue(), + merchantNameField.getConfidence()); + } + FormField transactionDateField = recognizedFields.get("TransactionDate"); + if (transactionDateField.getFieldValue() instanceof LocalDate) { + System.out.printf("Transaction Date: %s, confidence: %.2f%n", + transactionDateField.getFieldValue(), + transactionDateField.getConfidence()); + } + FormField receiptItemsField = recognizedFields.get("Items"); + System.out.printf("Receipt Items: %n"); + if (receiptItemsField.getFieldValue() instanceof List) { + List> receiptItems = (List>) receiptItemsField.getFieldValue(); + receiptItems.forEach(receiptItem -> { + if (receiptItem.getFieldValue() instanceof Map) { + ((Map>) receiptItem.getFieldValue()) + .forEach((key, formField) -> { + if ("Quantity".equals(key)) { + if (formField.getFieldValue() instanceof Integer) { + System.out.printf("Quantity: %d, confidence: %.2f%n", + formField.getFieldValue(), formField.getConfidence()); + } + } + }); + } + }); + } } } }); diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerClientJavaDocCodeSnippets.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerClientJavaDocCodeSnippets.java index f1aa02207094..c8412dba4fe4 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerClientJavaDocCodeSnippets.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerClientJavaDocCodeSnippets.java @@ -3,7 +3,6 @@ package com.azure.ai.formrecognizer; -import com.azure.ai.formrecognizer.models.FieldValueType; import com.azure.ai.formrecognizer.models.FormContentType; import com.azure.ai.formrecognizer.models.FormField; import com.azure.ai.formrecognizer.models.RecognizeOptions; @@ -17,6 +16,7 @@ import java.io.InputStream; import java.nio.file.Files; import java.time.Duration; +import java.time.LocalDate; import java.util.List; import java.util.Map; @@ -245,35 +245,36 @@ public void beginRecognizeContentWithOptions() throws IOException { /** * Code snippet for {@link FormRecognizerClient#beginRecognizeReceiptsFromUrl(String)} */ + @SuppressWarnings("unchecked") public void beginRecognizeReceiptsFromUrl() { // BEGIN: com.azure.ai.formrecognizer.FormRecognizerClient.beginRecognizeReceiptsFromUrl#string String receiptUrl = "{file_source_url}"; formRecognizerClient.beginRecognizeReceiptsFromUrl(receiptUrl).getFinalResult() .forEach(recognizedReceipt -> { - Map recognizedFields = recognizedReceipt.getRecognizedForm().getFields(); - FormField merchantNameField = recognizedFields.get("MerchantName"); - if (merchantNameField.getFieldValue().getType() == FieldValueType.STRING) { + Map> recognizedFields = recognizedReceipt.getFields(); + FormField merchantNameField = recognizedFields.get("MerchantName"); + if (merchantNameField.getFieldValue() instanceof String) { System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantNameField.getFieldValue().asString(), + merchantNameField.getFieldValue(), merchantNameField.getConfidence()); } - FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField.getFieldValue().getType() == FieldValueType.DATE) { + FormField transactionDateField = recognizedFields.get("TransactionDate"); + if (transactionDateField.getFieldValue() instanceof LocalDate) { System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDateField.getFieldValue().asDate(), + transactionDateField.getFieldValue(), transactionDateField.getConfidence()); } - FormField receiptItemsField = recognizedFields.get("Items"); + FormField receiptItemsField = recognizedFields.get("Items"); System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getFieldValue().getType() == FieldValueType.LIST) { - List receiptItems = receiptItemsField.getFieldValue().asList(); + if (receiptItemsField.getFieldValue() instanceof List) { + List> receiptItems = (List>) receiptItemsField.getFieldValue(); receiptItems.forEach(receiptItem -> { - if (receiptItem.getFieldValue().getType() == FieldValueType.MAP) { - receiptItem.getFieldValue().asMap().forEach((key, formField) -> { - if (key.equals("Quantity")) { - if (formField.getFieldValue().getType() == FieldValueType.INTEGER) { + if (receiptItem.getFieldValue() instanceof Map) { + ((Map>) receiptItem.getFieldValue()).forEach((key, formField) -> { + if ("Quantity".equals(key)) { + if (formField.getFieldValue() instanceof Integer) { System.out.printf("Quantity: %s, confidence: %.2f%n", - formField.getFieldValue().asInteger(), formField.getConfidence()); + formField.getFieldValue(), formField.getConfidence()); } } }); @@ -331,6 +332,7 @@ public void beginRecognizeReceiptsFromUrlWithOptions() { * * @throws IOException Exception thrown when there is an error in reading all the bytes from the File. */ + @SuppressWarnings("unchecked") public void beginRecognizeReceipts() throws IOException { // BEGIN: com.azure.ai.formrecognizer.FormRecognizerClient.beginRecognizeReceipts#InputStream-long File receipt = new File("{file_source_url}"); @@ -339,30 +341,30 @@ public void beginRecognizeReceipts() throws IOException { formRecognizerClient.beginRecognizeReceipts(targetStream, receipt.length()) .getFinalResult().forEach(recognizedReceipt -> { - Map recognizedFields = recognizedReceipt.getRecognizedForm().getFields(); - FormField merchantNameField = recognizedFields.get("MerchantName"); - if (merchantNameField.getFieldValue().getType() == FieldValueType.STRING) { + Map> recognizedFields = recognizedReceipt.getFields(); + FormField merchantNameField = recognizedFields.get("MerchantName"); + if (merchantNameField.getFieldValue() instanceof String) { System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantNameField.getFieldValue().asString(), + merchantNameField.getFieldValue(), merchantNameField.getConfidence()); } - FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField.getFieldValue().getType() == FieldValueType.DATE) { + FormField transactionDateField = recognizedFields.get("TransactionDate"); + if (transactionDateField.getFieldValue() instanceof LocalDate) { System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDateField.getFieldValue().asDate(), + transactionDateField.getFieldValue(), transactionDateField.getConfidence()); } - FormField receiptItemsField = recognizedFields.get("Items"); + FormField receiptItemsField = recognizedFields.get("Items"); System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getFieldValue().getType() == FieldValueType.LIST) { - List receiptItems = receiptItemsField.getFieldValue().asList(); + if (receiptItemsField.getFieldValue() instanceof List) { + List> receiptItems = (List>) receiptItemsField.getFieldValue(); receiptItems.forEach(receiptItem -> { - if (receiptItem.getFieldValue().getType() == FieldValueType.MAP) { - receiptItem.getFieldValue().asMap().forEach((key, formField) -> { - if (key.equals("Quantity")) { - if (formField.getFieldValue().getType() == FieldValueType.INTEGER) { + if (receiptItem.getFieldValue() instanceof Map) { + ((Map>) receiptItem.getFieldValue()).forEach((key, formField) -> { + if ("Quantity".equals(key)) { + if (formField.getFieldValue() instanceof Integer) { System.out.printf("Quantity: %d, confidence: %.2f%n", - formField.getFieldValue().asInteger(), formField.getConfidence()); + formField.getFieldValue(), formField.getConfidence()); } } }); @@ -379,6 +381,7 @@ public void beginRecognizeReceipts() throws IOException { * * @throws IOException Exception thrown when there is an error in reading all the bytes from the File. */ + @SuppressWarnings("unchecked") public void beginRecognizeReceiptsWithOptions() throws IOException { // BEGIN: com.azure.ai.formrecognizer.FormRecognizerClient.beginRecognizeReceipts#InputStream-long-recognizeOptions @@ -396,26 +399,26 @@ public void beginRecognizeReceiptsWithOptions() throws IOException { FormField merchantNameField = recognizedFields.get("MerchantName"); if (merchantNameField.getFieldValue().getType() == FieldValueType.STRING) { System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantNameField.getFieldValue().asString(), + merchantNameField.getFieldValue(), merchantNameField.getConfidence()); } - FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField.getFieldValue().getType() == FieldValueType.DATE) { + FormField transactionDateField = recognizedFields.get("TransactionDate"); + if (transactionDateField.getFieldValue() instanceof LocalDate) { System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDateField.getFieldValue().asDate(), + transactionDateField.getFieldValue(), transactionDateField.getConfidence()); } - FormField receiptItemsField = recognizedFields.get("Items"); + FormField receiptItemsField = recognizedFields.get("Items"); System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getFieldValue().getType() == FieldValueType.LIST) { - List receiptItems = receiptItemsField.getFieldValue().asList(); + if (receiptItemsField.getFieldValue() instanceof List) { + List> receiptItems = (List>) receiptItemsField.getFieldValue(); receiptItems.forEach(receiptItem -> { - if (receiptItem.getFieldValue().getType() == FieldValueType.MAP) { - receiptItem.getFieldValue().asMap().forEach((key, formField) -> { - if (key.equals("Quantity")) { - if (formField.getFieldValue().getType() == FieldValueType.INTEGER) { + if (receiptItem.getFieldValue() instanceof Map) { + ((Map>) receiptItem.getFieldValue()).forEach((key, formField) -> { + if ("Quantity".equals(key)) { + if (formField.getFieldValue() instanceof Integer) { System.out.printf("Quantity: %d, confidence: %.2f%n", - formField.getFieldValue().asInteger(), formField.getConfidence()); + formField.getFieldValue(), formField.getConfidence()); } } }); diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java index d58e884434b3..67cbf22bb7d9 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java @@ -6,12 +6,11 @@ import com.azure.ai.formrecognizer.models.AccountProperties; import com.azure.ai.formrecognizer.models.CustomFormModel; import com.azure.ai.formrecognizer.models.CustomFormModelInfo; -import com.azure.ai.formrecognizer.models.FieldValueType; +import com.azure.ai.formrecognizer.models.FormContentType; import com.azure.ai.formrecognizer.models.FormField; import com.azure.ai.formrecognizer.models.FormPage; import com.azure.ai.formrecognizer.models.OperationResult; import com.azure.ai.formrecognizer.models.RecognizedForm; -import com.azure.ai.formrecognizer.models.RecognizedReceipt; import com.azure.ai.formrecognizer.training.FormTrainingClient; import com.azure.ai.formrecognizer.training.FormTrainingClientBuilder; import com.azure.core.credential.AzureKeyCredential; @@ -26,6 +25,7 @@ import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; +import java.time.LocalDate; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicReference; @@ -97,7 +97,7 @@ public void recognizeCustomForm() { RecognizedForm form = recognizedForms.get(i); System.out.printf("----------- Recognized Form %d-----------%n", i); System.out.printf("Form type: %s%n", form.getFormType()); - form.getFields().forEach((label, formField) -> { + form.getFields().forEach((label, formField) -> System.out.printf("Field %s has value %s with confidence score of %f.%n", label, formField.getValueData().getText(), formField.getConfidence()); @@ -132,55 +132,54 @@ public void recognizeContent() throws IOException { formPage.getTables().forEach(formTable -> { System.out.printf("Table has %d rows and %d columns.%n", formTable.getRowCount(), formTable.getColumnCount()); - formTable.getCells().forEach(formTableCell -> { - System.out.printf("Cell has text %s.%n", formTableCell.getText()); - }); - System.out.println(); + formTable.getCells().forEach(formTableCell -> + System.out.printf("Cell has text %s.%n", formTableCell.getText())); }); } } + @SuppressWarnings("unchecked") public void recognizeReceipt() { String receiptUrl = "https://docs.microsoft.com/en-us/azure/cognitive-services/form-recognizer/media" + "/contoso-allinone.jpg"; - SyncPoller> syncPoller = + SyncPoller> syncPoller = formRecognizerClient.beginRecognizeReceiptsFromUrl(receiptUrl); - List receiptPageResults = syncPoller.getFinalResult(); + List receiptPageResults = syncPoller.getFinalResult(); for (int i = 0; i < receiptPageResults.size(); i++) { - RecognizedReceipt recognizedReceipt = receiptPageResults.get(i); - Map recognizedFields = recognizedReceipt.getRecognizedForm().getFields(); + RecognizedForm recognizedReceipt = receiptPageResults.get(i); + Map> recognizedFields = recognizedReceipt.getFields(); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); - FormField merchantNameField = recognizedFields.get("MerchantName"); - if (merchantNameField.getFieldValue().getType() == FieldValueType.STRING) { + FormField merchantNameField = recognizedFields.get("MerchantName"); + if (merchantNameField.getFieldValue() instanceof String) { System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantNameField.getFieldValue().asString(), + merchantNameField.getFieldValue(), merchantNameField.getConfidence()); } - FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField.getFieldValue().getType() == FieldValueType.DATE) { + FormField transactionDateField = recognizedFields.get("TransactionDate"); + if (transactionDateField.getFieldValue() instanceof LocalDate) { System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDateField.getFieldValue().asDate(), + transactionDateField.getFieldValue(), transactionDateField.getConfidence()); } - FormField receiptItemsField = recognizedFields.get("Items"); + FormField receiptItemsField = recognizedFields.get("Items"); System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getFieldValue().getType() == FieldValueType.LIST) { - List receiptItems = receiptItemsField.getFieldValue().asList(); + if (receiptItemsField.getFieldValue() instanceof List) { + List> receiptItems = (List>) receiptItemsField.getFieldValue(); receiptItems.forEach(receiptItem -> { - if (receiptItem.getFieldValue().getType() == FieldValueType.MAP) { - receiptItem.getFieldValue().asMap().forEach((key, formField) -> { - if (key.equals("Name")) { - if (formField.getFieldValue().getType() == FieldValueType.STRING) { + if (receiptItem.getFieldValue() instanceof Map) { + ((Map>) receiptItem.getFieldValue()).forEach((key, formField) -> { + if ("Name".equals(key)) { + if (formField.getFieldValue() instanceof String) { System.out.printf("Name: %s, confidence: %.2fs%n", - formField.getFieldValue().asString(), + formField.getFieldValue(), formField.getConfidence()); } } - if (key.equals("Quantity")) { - if (formField.getFieldValue().getType() == FieldValueType.INTEGER) { + if ("Quantity".equals(key)) { + if (formField.getFieldValue() instanceof Integer) { System.out.printf("Quantity: %d, confidence: %.2f%n", - formField.getFieldValue().asInteger(), formField.getConfidence()); + formField.getFieldValue(), formField.getConfidence()); } } }); diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReceiptExtensions.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReceiptExtensions.java new file mode 100644 index 000000000000..fe7ab3820689 --- /dev/null +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReceiptExtensions.java @@ -0,0 +1,129 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.formrecognizer; + +import com.azure.ai.formrecognizer.models.FormField; +import com.azure.ai.formrecognizer.models.RecognizedForm; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +/** + * The ReceiptExtensions class to allow users to convert a {@link RecognizedForm} + * to a US Receipt type. + */ +public final class ReceiptExtensions { + + private ReceiptExtensions() { + } + + /** + * Static method to convert an incoming recognized form to a {@link USReceipt type}. + * + * @param recognizedForm The {@link RecognizedForm recognized receipt}. + * + * @return The converted {@link USReceipt US locale receipt} type. + */ + @SuppressWarnings("unchecked") + public static USReceipt asUSReceipt(RecognizedForm recognizedForm) { + USReceiptType receiptType = null; + FormField merchantName = null; + FormField merchantAddress = null; + FormField merchantPhoneNumber = null; + FormField subtotal = null; + FormField tax = null; + FormField tip = null; + FormField total = null; + FormField transactionDate = null; + FormField transactionTime = null; + List receiptItems = null; + + for (Map.Entry> entry : recognizedForm.getFields().entrySet()) { + String key = entry.getKey(); + FormField fieldValue = entry.getValue(); + switch (key) { + case "ReceiptType": + receiptType = new USReceiptType(((FormField) fieldValue).getFieldValue(), + fieldValue.getConfidence()); + break; + case "MerchantName": + merchantName = (FormField) fieldValue; + break; + case "MerchantAddress": + merchantAddress = (FormField) fieldValue; + break; + case "MerchantPhoneNumber": + merchantPhoneNumber = (FormField) fieldValue; + break; + case "Subtotal": + subtotal = (FormField) fieldValue; + break; + case "Tax": + tax = (FormField) fieldValue; + break; + case "Tip": + tip = (FormField) fieldValue; + break; + case "Total": + total = (FormField) fieldValue; + break; + case "TransactionDate": + transactionDate = (FormField) fieldValue; + break; + case "TransactionTime": + transactionTime = (FormField) fieldValue; + break; + case "Items": + receiptItems = toReceiptItems(fieldValue); + break; + default: + break; + } + } + return new USReceipt(receiptItems, receiptType, + merchantName, merchantAddress, merchantPhoneNumber, subtotal, tax, tip, total, transactionDate, + transactionTime); + } + + /** + * Helper method to convert the service level + * {@link com.azure.ai.formrecognizer.implementation.models.FieldValue#getValueArray() value items} + * to SDK level {@link USReceiptItem receipt items}. + * + * @param fieldValueItems The strongly typed field values. + * + * @return An unmodifiable list of {@link USReceiptItem}. + */ + @SuppressWarnings("unchecked") + private static List toReceiptItems(FormField fieldValueItems) { + List> fieldValueArray = (List>) fieldValueItems.getFieldValue(); + List receiptItemList = new ArrayList<>(); + + for (FormField eachFieldValue : fieldValueArray) { + Map> objectValue = ((Map>) (eachFieldValue.getFieldValue())); + FormField name = null; + FormField quantity = null; + FormField price = null; + FormField totalPrice = null; + for (Map.Entry> entry : objectValue.entrySet()) { + String key = entry.getKey(); + if ("Quantity".equals(key)) { + quantity = (FormField) entry.getValue(); + } else if ("Name".equals(key)) { + name = (FormField) entry.getValue(); + } else if ("Price".equals(key)) { + price = (FormField) entry.getValue(); + } else if ("Total Price".equals(key)) { + totalPrice = (FormField) entry.getValue(); + } + } + receiptItemList.add(new USReceiptItem(name, quantity, price, totalPrice)); + } + return Collections.unmodifiableList(receiptItemList); + } +} diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceipts.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceipts.java index da6871ca95b8..c211bd1fb107 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceipts.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceipts.java @@ -3,10 +3,9 @@ package com.azure.ai.formrecognizer; -import com.azure.ai.formrecognizer.models.FieldValueType; import com.azure.ai.formrecognizer.models.FormField; import com.azure.ai.formrecognizer.models.OperationResult; -import com.azure.ai.formrecognizer.models.RecognizedReceipt; +import com.azure.ai.formrecognizer.models.RecognizedForm; import com.azure.core.credential.AzureKeyCredential; import com.azure.core.util.polling.SyncPoller; @@ -15,6 +14,7 @@ import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; +import java.time.LocalDate; import java.util.List; import java.util.Map; @@ -30,6 +30,7 @@ public class RecognizeReceipts { * * @throws IOException from reading file. */ + @SuppressWarnings("unchecked") public static void main(final String[] args) throws IOException { // Instantiate a client that will be used to call the service. FormRecognizerClient client = new FormRecognizerClientBuilder() @@ -45,68 +46,72 @@ public static void main(final String[] args) throws IOException { SyncPoller> analyzeReceiptPoller = client.beginRecognizeReceipts(targetStream, sourceFile.length()); - List receiptPageResults = analyzeReceiptPoller.getFinalResult(); + List receiptPageResults = analyzeReceiptPoller.getFinalResult(); for (int i = 0; i < receiptPageResults.size(); i++) { - RecognizedReceipt recognizedReceipt = receiptPageResults.get(i); - Map recognizedFields = recognizedReceipt.getRecognizedForm().getFields(); + RecognizedForm recognizedReceipt = receiptPageResults.get(i); + Map> recognizedFields = recognizedReceipt.getFields(); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); - FormField merchantNameField = recognizedFields.get("MerchantName"); + FormField merchantNameField = recognizedFields.get("MerchantName"); if (merchantNameField != null) { - if (merchantNameField.getFieldValue().getType() == FieldValueType.STRING) { + Object merchantNameFieldValue = merchantNameField.getFieldValue(); + if (merchantNameFieldValue instanceof String) { System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantNameField.getFieldValue().asString(), - merchantNameField.getConfidence()); + merchantNameFieldValue, merchantNameField.getConfidence()); } } - FormField merchantAddressField = recognizedFields.get("MerchantAddress"); + + FormField merchantAddressField = recognizedFields.get("MerchantAddress"); if (merchantAddressField != null) { - if (merchantAddressField.getFieldValue().getType() == FieldValueType.STRING) { + Object merchantAddressFieldValue = merchantAddressField.getFieldValue(); + if (merchantAddressFieldValue instanceof String) { System.out.printf("Merchant Address: %s, confidence: %.2f%n", - merchantAddressField.getFieldValue().asString(), - merchantAddressField.getConfidence()); + merchantAddressFieldValue, merchantAddressField.getConfidence()); } } - FormField transactionDateField = recognizedFields.get("TransactionDate"); + + FormField transactionDateField = recognizedFields.get("TransactionDate"); if (transactionDateField != null) { - if (transactionDateField.getFieldValue().getType() == FieldValueType.DATE) { + Object transactionDateFieldValue = transactionDateField.getFieldValue(); + if (transactionDateFieldValue instanceof LocalDate) { + LocalDate transactionDate = (LocalDate) transactionDateFieldValue; System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDateField.getFieldValue().asDate(), - transactionDateField.getConfidence()); + transactionDate, transactionDateField.getConfidence()); } } - FormField receiptItemsField = recognizedFields.get("Items"); + + FormField receiptItemsField = recognizedFields.get("Items"); if (receiptItemsField != null) { System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getFieldValue().getType() == FieldValueType.LIST) { - List receiptItems = receiptItemsField.getFieldValue().asList(); + if (receiptItemsField.getFieldValue() instanceof List) { + List> receiptItems = (List>) receiptItemsField.getFieldValue(); receiptItems.forEach(receiptItem -> { - if (receiptItem.getFieldValue().getType() == FieldValueType.MAP) { - receiptItem.getFieldValue().asMap().forEach((key, formField) -> { - if (key.equals("Name")) { - if (formField.getFieldValue().getType() == FieldValueType.STRING) { + if (receiptItem.getFieldValue() instanceof Map) { + ((Map>) receiptItem.getFieldValue()).forEach((key, formField) -> { + if ("Name".equals(key)) { + if (formField.getFieldValue() instanceof String) { System.out.printf("Name: %s, confidence: %.2fs%n", - formField.getFieldValue().asString(), + formField.getFieldValue(), formField.getConfidence()); } } - if (key.equals("Quantity")) { - if (formField.getFieldValue().getType() == FieldValueType.INTEGER) { + if ("Quantity".equals(key)) { + if (formField.getFieldValue() instanceof Integer) { System.out.printf("Quantity: %d, confidence: %.2f%n", - formField.getFieldValue().asInteger(), formField.getConfidence()); + formField.getFieldValue(), formField.getConfidence()); } } - if (key.equals("Price")) { - if (formField.getFieldValue().getType() == FieldValueType.FLOAT) { + if ("Price".equals(key)) { + if (formField.getFieldValue() instanceof Float) { System.out.printf("Price: %f, confidence: %.2f%n", - formField.getFieldValue().asFloat(), + formField.getFieldValue(), formField.getConfidence()); } } - if (key.equals("TotalPrice")) { - if (formField.getFieldValue().getType() == FieldValueType.FLOAT) { + if ("TotalPrice".equals(key)) { + if (formField.getFieldValue() instanceof Float) { System.out.printf("Total Price: %f, confidence: %.2f%n", - formField.getFieldValue().asFloat(), + formField.getFieldValue(), formField.getConfidence()); } } diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsAsync.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsAsync.java index f59aeb97cb60..021a06149c9b 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsAsync.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsAsync.java @@ -6,7 +6,7 @@ import com.azure.ai.formrecognizer.models.FieldValueType; import com.azure.ai.formrecognizer.models.FormField; import com.azure.ai.formrecognizer.models.OperationResult; -import com.azure.ai.formrecognizer.models.RecognizedReceipt; +import com.azure.ai.formrecognizer.models.RecognizedForm; import com.azure.core.credential.AzureKeyCredential; import com.azure.core.util.polling.PollerFlux; import reactor.core.publisher.Mono; @@ -16,6 +16,7 @@ import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; +import java.time.LocalDate; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -31,8 +32,10 @@ public class RecognizeReceiptsAsync { * Main method to invoke this demo. * * @param args Unused. Arguments to the program. + * * @throws IOException Exception thrown when there is an error in reading all the bytes from the File. */ + @SuppressWarnings("unchecked") public static void main(final String[] args) throws IOException { // Instantiate a client that will be used to call the service. FormRecognizerAsyncClient client = new FormRecognizerClientBuilder() @@ -45,11 +48,11 @@ public static void main(final String[] args) throws IOException { byte[] fileContent = Files.readAllBytes(sourceFile.toPath()); InputStream targetStream = new ByteArrayInputStream(fileContent); - PollerFlux> analyzeReceiptPoller = + PollerFlux> analyzeReceiptPoller = client.beginRecognizeReceipts(toFluxByteBuffer(targetStream), sourceFile.length()); - Mono> receiptPageResultsMono = analyzeReceiptPoller + Mono> receiptPageResultsMono = analyzeReceiptPoller .last() .flatMap(recognizeReceiptPollOperation -> { if (recognizeReceiptPollOperation.getStatus().isComplete()) { @@ -64,8 +67,8 @@ public static void main(final String[] args) throws IOException { receiptPageResultsMono.subscribe(receiptPageResults -> { for (int i = 0; i < receiptPageResults.size(); i++) { - RecognizedReceipt recognizedReceipt = receiptPageResults.get(i); - Map recognizedFields = recognizedReceipt.getRecognizedForm().getFields(); + RecognizedForm recognizedReceipt = receiptPageResults.get(i); + Map> recognizedFields = recognizedReceipt.getFields(); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); if (merchantNameField != null) { diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrl.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrl.java index 8e7239f00dc0..6ce3378e88a0 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrl.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrl.java @@ -3,13 +3,13 @@ package com.azure.ai.formrecognizer; -import com.azure.ai.formrecognizer.models.FieldValueType; import com.azure.ai.formrecognizer.models.FormField; import com.azure.ai.formrecognizer.models.OperationResult; -import com.azure.ai.formrecognizer.models.RecognizedReceipt; +import com.azure.ai.formrecognizer.models.RecognizedForm; import com.azure.core.credential.AzureKeyCredential; import com.azure.core.util.polling.SyncPoller; +import java.time.LocalDate; import java.util.List; import java.util.Map; @@ -23,6 +23,7 @@ public class RecognizeReceiptsFromUrl { * * @param args Unused. Arguments to the program. */ + @SuppressWarnings("unchecked") public static void main(final String[] args) { // Instantiate a client that will be used to call the service. FormRecognizerClient client = new FormRecognizerClientBuilder() @@ -30,72 +31,77 @@ public static void main(final String[] args) { .endpoint("https://{endpoint}.cognitiveservices.azure.com/") .buildClient(); - String receiptUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-java/master/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/sample-forms/receipts/contoso-allinone.jpg"; - SyncPoller> recognizeReceiptPoller = + String receiptUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-java/master/sdk/formrecognizer" + + "/azure-ai-formrecognizer/src/samples/java/sample-forms/receipts/contoso-allinone.jpg"; + SyncPoller> recognizeReceiptPoller = client.beginRecognizeReceiptsFromUrl(receiptUrl); - List receiptPageResults = recognizeReceiptPoller.getFinalResult(); + List receiptPageResults = recognizeReceiptPoller.getFinalResult(); for (int i = 0; i < receiptPageResults.size(); i++) { - RecognizedReceipt recognizedReceipt = receiptPageResults.get(i); - Map recognizedFields = recognizedReceipt.getRecognizedForm().getFields(); + RecognizedForm recognizedReceipt = receiptPageResults.get(i); + Map> recognizedFields = recognizedReceipt.getFields(); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); - FormField merchantNameField = recognizedFields.get("MerchantName"); + FormField merchantNameField = recognizedFields.get("MerchantName"); if (merchantNameField != null) { - if (merchantNameField.getFieldValue().getType() == FieldValueType.STRING) { + Object merchantNameFieldValue = recognizedFields.get("MerchantName").getFieldValue(); + if (merchantNameFieldValue instanceof String) { System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantNameField.getFieldValue().asString(), - merchantNameField.getConfidence()); + merchantNameFieldValue, merchantNameField.getConfidence()); } } - FormField merchantAddressField = recognizedFields.get("MerchantAddress"); + + FormField merchantAddressField = recognizedFields.get("MerchantAddress"); if (merchantAddressField != null) { - if (merchantAddressField.getFieldValue().getType() == FieldValueType.STRING) { + Object merchantAddressFieldValue = recognizedFields.get("MerchantAddress").getFieldValue(); + if (merchantAddressFieldValue instanceof String) { System.out.printf("Merchant Address: %s, confidence: %.2f%n", - merchantAddressField.getFieldValue().asString(), - merchantAddressField.getConfidence()); + merchantAddressFieldValue, merchantAddressField.getConfidence()); } } - FormField transactionDateField = recognizedFields.get("TransactionDate"); + + FormField transactionDateField = recognizedFields.get("TransactionDate"); if (transactionDateField != null) { - if (transactionDateField.getFieldValue().getType() == FieldValueType.DATE) { + Object transactionDateFieldValue = recognizedFields.get("TransactionDate").getFieldValue(); + if (transactionDateFieldValue instanceof LocalDate) { + LocalDate transactionDate = (LocalDate) transactionDateFieldValue; System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDateField.getFieldValue().asDate(), - transactionDateField.getConfidence()); + transactionDate, transactionDateField.getConfidence()); } } - FormField receiptItemsField = recognizedFields.get("Items"); + + FormField receiptItemsField = recognizedFields.get("Items"); if (receiptItemsField != null) { System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getFieldValue().getType() == FieldValueType.LIST) { - List receiptItems = receiptItemsField.getFieldValue().asList(); + if (receiptItemsField.getFieldValue() instanceof List) { + List> receiptItems = (List>) receiptItemsField.getFieldValue(); receiptItems.forEach(receiptItem -> { - if (receiptItem.getFieldValue().getType() == FieldValueType.MAP) { - receiptItem.getFieldValue().asMap().forEach((key, formField) -> { - if (key.equals("Name")) { - if (formField.getFieldValue().getType() == FieldValueType.STRING) { + if (receiptItem.getFieldValue() instanceof Map) { + ((Map>) receiptItem.getFieldValue()).forEach((key, formField) -> { + if ("Name".equals(key)) { + if (formField.getFieldValue() instanceof String) { System.out.printf("Name: %s, confidence: %.2fs%n", - formField.getFieldValue().asString(), + formField.getFieldValue(), formField.getConfidence()); } } - if (key.equals("Quantity")) { - if (formField.getFieldValue().getType() == FieldValueType.INTEGER) { + if ("Quantity".equals(key)) { + if (formField.getFieldValue() instanceof Integer) { System.out.printf("Quantity: %d, confidence: %.2f%n", - formField.getFieldValue().asInteger(), formField.getConfidence()); + formField.getFieldValue(), formField.getConfidence()); } } - if (key.equals("Price")) { - if (formField.getFieldValue().getType() == FieldValueType.FLOAT) { + if ("Price".equals(key)) { + if (formField.getFieldValue() instanceof Float) { System.out.printf("Price: %f, confidence: %.2f%n", - formField.getFieldValue().asFloat(), + formField.getFieldValue(), formField.getConfidence()); } } - if (key.equals("TotalPrice")) { - if (formField.getFieldValue().getType() == FieldValueType.FLOAT) { + if ("TotalPrice".equals(key)) { + if (formField.getFieldValue() instanceof Float) { System.out.printf("Total Price: %f, confidence: %.2f%n", - formField.getFieldValue().asFloat(), + formField.getFieldValue(), formField.getConfidence()); } } diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrlAsync.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrlAsync.java index e6148c58664a..5d2795a848e5 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrlAsync.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrlAsync.java @@ -3,14 +3,14 @@ package com.azure.ai.formrecognizer; -import com.azure.ai.formrecognizer.models.FieldValueType; import com.azure.ai.formrecognizer.models.FormField; import com.azure.ai.formrecognizer.models.OperationResult; -import com.azure.ai.formrecognizer.models.RecognizedReceipt; +import com.azure.ai.formrecognizer.models.RecognizedForm; import com.azure.core.credential.AzureKeyCredential; import com.azure.core.util.polling.PollerFlux; import reactor.core.publisher.Mono; +import java.time.LocalDate; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -25,6 +25,7 @@ public class RecognizeReceiptsFromUrlAsync { * * @param args Unused. Arguments to the program. */ + @SuppressWarnings("unchecked") public static void main(final String[] args) { // Instantiate a client that will be used to call the service. FormRecognizerAsyncClient client = new FormRecognizerClientBuilder() @@ -32,11 +33,12 @@ public static void main(final String[] args) { .endpoint("https://{endpoint}.cognitiveservices.azure.com/") .buildAsyncClient(); - String receiptUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-java/master/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/sample-forms/receipts/contoso-allinone.jpg"; - PollerFlux> recognizeReceiptPoller = + String receiptUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-java/master/sdk/formrecognizer" + + "/azure-ai-formrecognizer/src/samples/java/sample-forms/receipts/contoso-allinone.jpg"; + PollerFlux> recognizeReceiptPoller = client.beginRecognizeReceiptsFromUrl(receiptUrl); - Mono> receiptPageResults = recognizeReceiptPoller + Mono> receiptPageResults = recognizeReceiptPoller .last() .flatMap(trainingOperationResponse -> { if (trainingOperationResponse.getStatus().isComplete()) { @@ -51,65 +53,69 @@ public static void main(final String[] args) { receiptPageResults.subscribe(recognizedReceipts -> { for (int i = 0; i < recognizedReceipts.size(); i++) { - RecognizedReceipt recognizedReceipt = recognizedReceipts.get(i); - Map recognizedFields = recognizedReceipt.getRecognizedForm().getFields(); + RecognizedForm recognizedReceipt = recognizedReceipts.get(i); + Map> recognizedFields = recognizedReceipt.getFields(); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); - FormField merchantNameField = recognizedFields.get("MerchantName"); + FormField merchantNameField = recognizedFields.get("MerchantName"); if (merchantNameField != null) { - if (merchantNameField.getFieldValue().getType() == FieldValueType.STRING) { + Object merchantNameFieldValue = recognizedFields.get("MerchantName").getFieldValue(); + if (merchantNameFieldValue instanceof String) { System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantNameField.getFieldValue().asString(), - merchantNameField.getConfidence()); + merchantNameFieldValue, merchantNameField.getConfidence()); } } - FormField merchantAddressField = recognizedFields.get("MerchantAddress"); + + FormField merchantAddressField = recognizedFields.get("MerchantAddress"); if (merchantAddressField != null) { - if (merchantAddressField.getFieldValue().getType() == FieldValueType.STRING) { + Object merchantAddressFieldValue = recognizedFields.get("MerchantAddress").getFieldValue(); + if (merchantAddressFieldValue instanceof String) { System.out.printf("Merchant Address: %s, confidence: %.2f%n", - merchantAddressField.getFieldValue().asString(), - merchantAddressField.getConfidence()); + merchantAddressFieldValue, merchantAddressField.getConfidence()); } } - FormField transactionDateField = recognizedFields.get("TransactionDate"); + + FormField transactionDateField = recognizedFields.get("TransactionDate"); if (transactionDateField != null) { - if (transactionDateField.getFieldValue().getType() == FieldValueType.DATE) { + Object transactionDateFieldValue = recognizedFields.get("TransactionDate").getFieldValue(); + if (transactionDateFieldValue instanceof LocalDate) { + LocalDate transactionDate = (LocalDate) transactionDateFieldValue; System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDateField.getFieldValue().asDate(), - transactionDateField.getConfidence()); + transactionDate, transactionDateField.getConfidence()); } } - FormField receiptItemsField = recognizedFields.get("Items"); + + FormField receiptItemsField = recognizedFields.get("Items"); if (receiptItemsField != null) { System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getFieldValue().getType() == FieldValueType.LIST) { - List receiptItems = receiptItemsField.getFieldValue().asList(); + if (receiptItemsField.getFieldValue() instanceof List) { + List> receiptItems = (List>) receiptItemsField.getFieldValue(); receiptItems.forEach(receiptItem -> { - if (receiptItem.getFieldValue().getType() == FieldValueType.MAP) { - receiptItem.getFieldValue().asMap().forEach((key, formField) -> { - if (key.equals("Name")) { - if (formField.getFieldValue().getType() == FieldValueType.STRING) { + if (receiptItem.getFieldValue() instanceof Map) { + ((Map>) receiptItem.getFieldValue()).forEach((key, formField) -> { + if ("Name".equals(key)) { + if (formField.getFieldValue() instanceof String) { System.out.printf("Name: %s, confidence: %.2fs%n", - formField.getFieldValue().asString(), + formField.getFieldValue(), formField.getConfidence()); } } - if (key.equals("Quantity")) { - if (formField.getFieldValue().getType() == FieldValueType.INTEGER) { - System.out.printf("Quantity: %f, confidence: %.2f%n", - formField.getFieldValue().asInteger(), formField.getConfidence()); + if ("Quantity".equals(key)) { + if (formField.getFieldValue() instanceof Integer) { + System.out.printf("Quantity: %d, confidence: %.2f%n", + formField.getFieldValue(), formField.getConfidence()); } } - if (key.equals("Price")) { - if (formField.getFieldValue().getType() == FieldValueType.FLOAT) { + if ("Price".equals(key)) { + if (formField.getFieldValue() instanceof Float) { System.out.printf("Price: %f, confidence: %.2f%n", - formField.getFieldValue().asFloat(), + formField.getFieldValue(), formField.getConfidence()); } } - if (key.equals("TotalPrice")) { - if (formField.getFieldValue().getType() == FieldValueType.FLOAT) { + if ("TotalPrice".equals(key)) { + if (formField.getFieldValue() instanceof Float) { System.out.printf("Total Price: %f, confidence: %.2f%n", - formField.getFieldValue().asFloat(), + formField.getFieldValue(), formField.getConfidence()); } } @@ -117,8 +123,8 @@ public static void main(final String[] args) { } }); } + System.out.print("-----------------------------------"); } - System.out.print("-----------------------------------"); } }); diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/StronglyTypedRecognizedFormUSReceipt.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/StronglyTypedRecognizedFormUSReceipt.java new file mode 100644 index 000000000000..68e844f7b721 --- /dev/null +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/StronglyTypedRecognizedFormUSReceipt.java @@ -0,0 +1,78 @@ +package com.azure.ai.formrecognizer; + +import com.azure.ai.formrecognizer.models.OperationResult; +import com.azure.ai.formrecognizer.models.RecognizedForm; +import com.azure.core.credential.AzureKeyCredential; +import com.azure.core.util.polling.SyncPoller; + +import java.util.List; + +/** + * Sample demonstrating converting recognized form fields to strongly typed US receipt field values. + * See + * + * for information on the strongly typed fields returned by service for recognizing receipts. + */ +public class StronglyTypedRecognizedFormUSReceipt { + + /** + * Main method to invoke this demo. + * + * @param args Unused. Arguments to the program. + */ + @SuppressWarnings("unchecked") + public static void main(final String[] args) { + // Instantiate a client that will be used to call the service. + FormRecognizerClient client = new FormRecognizerClientBuilder() + .credential(new AzureKeyCredential("{api_Key}")) + .endpoint("https://{endpoint}.cognitiveservices.azure.com/") + .buildClient(); + + String receiptUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-java/master/sdk/formrecognizer" + + "/azure-ai-formrecognizer/src/samples/java/sample-forms/receipts/contoso-allinone.jpg"; + SyncPoller> recognizeReceiptPoller = + client.beginRecognizeReceiptsFromUrl(receiptUrl); + + List receiptPageResults = recognizeReceiptPoller.getFinalResult(); + + for (int i = 0; i < receiptPageResults.size(); i++) { + final RecognizedForm recognizedReceipt = receiptPageResults.get(i); + System.out.printf("----------- Recognized Receipt page %s -----------%n", i); + // Use extension method to convert the recognized form to strongly typed US receipt fields + USReceipt usReceipt = ReceiptExtensions.asUSReceipt(recognizedReceipt); + System.out.printf("Merchant Name: %s, confidence: %.2f%n", usReceipt.getMerchantName().getFieldValue(), + usReceipt.getMerchantName().getConfidence()); + System.out.printf("Merchant Address: %s, confidence: %.2f%n", + usReceipt.getMerchantAddress().getFieldValue(), + usReceipt.getMerchantAddress().getConfidence()); + System.out.printf("Merchant Phone Number %s, confidence: %.2f%n", + usReceipt.getMerchantPhoneNumber().getFieldValue(), usReceipt.getMerchantPhoneNumber().getConfidence()); + System.out.printf("Total: %s confidence: %.2f%n", usReceipt.getTotal().getFieldValue(), + usReceipt.getTotal().getConfidence()); + System.out.printf("Transaction Date: %s, confidence: %.2f%n", + usReceipt.getTransactionDate().getFieldValue(), usReceipt.getTransactionDate().getConfidence()); + System.out.printf("Transaction Time: %s, confidence: %.2f%n", + usReceipt.getTransactionTime().getFieldValue(), usReceipt.getTransactionTime().getConfidence()); + System.out.printf("Receipt Items: %n"); + usReceipt.getReceiptItems().forEach(receiptItem -> { + if (receiptItem.getName() != null) { + System.out.printf("Name: %s, confidence: %.2f%n", receiptItem.getName().getFieldValue(), + receiptItem.getName().getConfidence()); + } + if (receiptItem.getQuantity() != null) { + System.out.printf("Quantity: %s, confidence: %.2f%n", receiptItem.getQuantity().getFieldValue(), + receiptItem.getQuantity().getConfidence()); + } + if (receiptItem.getPrice() != null) { + System.out.printf("Price: %s, confidence: %.2f%n", receiptItem.getPrice().getFieldValue(), + receiptItem.getPrice().getConfidence()); + } + if (receiptItem.getTotalPrice() != null) { + System.out.printf("Total Price: %s, confidence: %.2f%n", + receiptItem.getTotalPrice().getFieldValue(), receiptItem.getTotalPrice().getConfidence()); + } + }); + System.out.print("-----------------------------------"); + } + } +} diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/USReceipt.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/USReceipt.java new file mode 100644 index 000000000000..ba91b8931630 --- /dev/null +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/USReceipt.java @@ -0,0 +1,209 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.formrecognizer; + +import com.azure.ai.formrecognizer.models.FormField; +import com.azure.core.annotation.Immutable; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.Collections; +import java.util.List; + +/** + * The USReceipt model. + */ +@Immutable +public final class USReceipt { + + /** + * List of recognized field items. + */ + private final List receiptItems; + + /** + * Recognized receipt type information. + */ + private final USReceiptType receiptType; + + /** + * Recognized field merchant name. + */ + private final FormField merchantName; + + /** + * Recognized field merchant address. + */ + private final FormField merchantAddress; + + /** + * Recognized field merchant phone number. + */ + private final FormField merchantPhoneNumber; + + /** + * Recognized field subtotal. + */ + private final FormField subtotal; + + /** + * Recognized field tax. + */ + private final FormField tax; + + /** + * Recognized field tip. + */ + private final FormField tip; + + /** + * Recognized field total. + */ + private final FormField total; + + /** + * Recognized field transaction date. + */ + private final FormField transactionDate; + + /** + * Recognized field transaction time. + */ + private final FormField transactionTime; + + /** + * Constructs a USReceipt object. + * + * @param receiptItems List of recognized field items. + * @param receiptType Recognized receipt type information. + * @param merchantName Recognized field merchant name. + * @param merchantAddress Recognized field merchant address. + * @param merchantPhoneNumber Recognized field merchant phone number. + * @param subtotal Recognized field subtotal. + * @param tax Recognized field tax. + * @param tip Recognized field tip. + * @param total Recognized field total. + * @param transactionDate Recognized field transaction date. + * @param transactionTime Recognized field transaction time. + */ + public USReceipt(final List receiptItems, + final USReceiptType receiptType, final FormField merchantName, + final FormField merchantAddress, + final FormField merchantPhoneNumber, final FormField subtotal, + final FormField tax, + final FormField tip, final FormField total, + final FormField transactionDate, + final FormField transactionTime) { + this.receiptItems = Collections.unmodifiableList(receiptItems); + this.receiptType = receiptType; + this.merchantName = merchantName; + this.merchantAddress = merchantAddress; + this.merchantPhoneNumber = merchantPhoneNumber; + this.subtotal = subtotal; + this.tax = tax; + this.tip = tip; + this.total = total; + this.transactionDate = transactionDate; + this.transactionTime = transactionTime; + } + + /** + * Get the itemized fields in the Recognized Receipt. + * + * @return the unmodifiable list of itemized fields on the receipt. + */ + public List getReceiptItems() { + return this.receiptItems; + } + + /** + * Get the type of Recognized Receipt. + * + * @return the type of Recognized Receipt. + */ + public USReceiptType getReceiptType() { + return this.receiptType; + } + + /** + * Get the merchant name field. + * + * @return the merchantName value. + */ + public FormField getMerchantName() { + return this.merchantName; + } + + /** + * Get the merchant address field. + * + * @return the merchantAddress value. + */ + public FormField getMerchantAddress() { + return this.merchantAddress; + } + + /** + * Get the merchant Phone number field. + * + * @return the merchantPhoneNumber value. + */ + public FormField getMerchantPhoneNumber() { + return this.merchantPhoneNumber; + } + + /** + * Get the subtotal field. + * + * @return the subtotal value. + */ + public FormField getSubtotal() { + return this.subtotal; + } + + /** + * Get the tax field. + * + * @return the tax value. + */ + public FormField getTax() { + return this.tax; + } + + /** + * Get the tip field. + * + * @return the tip value. + */ + public FormField getTip() { + return this.tip; + } + + /** + * Get the Total field. + * + * @return the total value. + */ + public FormField getTotal() { + return this.total; + } + + /** + * Get the Transaction date field. + * + * @return the transactionDate value. + */ + public FormField getTransactionDate() { + return this.transactionDate; + } + + /** + * Get the transaction time field. + * + * @return the transactionTime value. + */ + public FormField getTransactionTime() { + return this.transactionTime; + } +} diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/USReceiptItem.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/USReceiptItem.java new file mode 100644 index 000000000000..371a7aa143e1 --- /dev/null +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/USReceiptItem.java @@ -0,0 +1,85 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.formrecognizer; + +import com.azure.ai.formrecognizer.models.FormField; +import com.azure.core.annotation.Immutable; + +/** + * The USReceiptItem model. + */ +@Immutable +public final class USReceiptItem { + + /* + * Name of the field value. + */ + private final FormField name; + + /* + * Quantity of the field value. + */ + private final FormField quantity; + + /* + * Price of the field value. + */ + private final FormField price; + + /* + * Total price of the field value. + */ + private final FormField totalPrice; + + /** + * Constructs a USReceiptItem object. + * @param name Name of the field value. + * @param quantity quantity of the field value. + * @param price price of the field value. + * @param totalPrice Total price of the field value. + */ + public USReceiptItem(final FormField name, final FormField quantity, final FormField price, + final FormField totalPrice) { + this.name = name; + this.quantity = quantity; + this.price = price; + this.totalPrice = totalPrice; + } + + /** + * Gets the name of the field value. + * + * @return The name of the field value. + */ + public FormField getName() { + return name; + } + + /** + * Gets the quantity of the Receipt Item. + * + * @return the quantity of Receipt Item. + */ + public FormField getQuantity() { + return quantity; + } + + /** + * Gets the price of the Receipt Item. + * + * @return The total Price. + */ + public FormField getPrice() { + return price; + } + + /** + * Gets the total price of the Receipt Item. + * + * @return The total Price. + */ + public FormField getTotalPrice() { + return totalPrice; + } +} diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/USReceiptType.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/USReceiptType.java new file mode 100644 index 000000000000..d1a65c211cf9 --- /dev/null +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/USReceiptType.java @@ -0,0 +1,51 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.formrecognizer; + +import com.azure.core.annotation.Immutable; + +/** + * The USReceiptType model. + */ +@Immutable +public final class USReceiptType { + + /* + * The type of the receipt. + */ + private final String type; + + /* + * Confidence score. + */ + private final float confidence; + + /** + * Constructs a Receipt Type. + * @param type The type of the receipt. + * @param confidence The confidence score. + */ + public USReceiptType(final String type, final float confidence) { + this.type = type; + this.confidence = confidence; + } + + /** + * Gets the type of the receipt. + * + * @return The type of the receipt. + */ + public String getType() { + return this.type; + } + + /** + * Gets the confidence score of the detected type of the receipt. + * + * @return The confidence score of the detected type of the receipt. + */ + public float getConfidence() { + return this.confidence; + } +} diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientTest.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientTest.java index 4a63846663ef..30de4f63a8e7 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientTest.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientTest.java @@ -11,7 +11,6 @@ import com.azure.ai.formrecognizer.models.OperationResult; import com.azure.ai.formrecognizer.models.RecognizeOptions; import com.azure.ai.formrecognizer.models.RecognizedForm; -import com.azure.ai.formrecognizer.models.RecognizedReceipt; import com.azure.ai.formrecognizer.training.FormTrainingAsyncClient; import com.azure.core.exception.HttpResponseException; import com.azure.core.http.HttpClient; @@ -36,7 +35,6 @@ import static com.azure.ai.formrecognizer.TestUtils.LAYOUT_LOCAL_URL; import static com.azure.ai.formrecognizer.TestUtils.RECEIPT_FILE_LENGTH; import static com.azure.ai.formrecognizer.TestUtils.RECEIPT_LOCAL_URL; -import static com.azure.ai.formrecognizer.TestUtils.RECEIPT_PNG_FILE_LENGTH; import static com.azure.ai.formrecognizer.TestUtils.getReplayableBufferData; import static com.azure.ai.formrecognizer.implementation.Utility.toFluxByteBuffer; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -99,12 +97,8 @@ public void recognizeReceiptDataNullData(HttpClient httpClient, .getSyncPoller()); } - /** - * Verifies content type will be auto detected when using custom form API with input stream data overload. - */ - @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) - @MethodSource("com.azure.ai.formrecognizer.TestUtils#getTestParameters") - public void recognizeReceiptDataWithContentTypeAutoDetection(HttpClient httpClient, + @Override + void recognizeReceiptDataWithContentTypeAutoDetection(HttpClient httpClient, FormRecognizerServiceVersion serviceVersion) { client = getFormRecognizerAsyncClient(httpClient, serviceVersion); @@ -112,8 +106,6 @@ public void recognizeReceiptDataWithContentTypeAutoDetection(HttpClient httpClie getReplayableBufferData(RECEIPT_LOCAL_URL), RECEIPT_FILE_LENGTH, new RecognizeOptions() .setPollInterval(durationTestMode)).getSyncPoller(); - syncPoller.waitForCompletion(); - validateReceiptResultData(syncPoller.getFinalResult(), false); } /** @@ -180,7 +172,6 @@ public void recognizeReceiptFromDataMultiPage(HttpClient httpClient, FormRecogni .getSyncPoller(); syncPoller.waitForCompletion(); validateMultipageReceiptData(syncPoller.getFinalResult()); - }); } // Receipt - URL @@ -192,9 +183,11 @@ public void recognizeReceiptFromDataMultiPage(HttpClient httpClient, FormRecogni @MethodSource("com.azure.ai.formrecognizer.TestUtils#getTestParameters") public void recognizeReceiptSourceUrl(HttpClient httpClient, FormRecognizerServiceVersion serviceVersion) { client = getFormRecognizerAsyncClient(httpClient, serviceVersion); - receiptSourceUrlRunner(sourceUrl -> { - SyncPoller> syncPoller = - client.beginRecognizeReceiptsFromUrl(sourceUrl).getSyncPoller(); + receiptDataRunnerTextDetails((data, includeTextContent) -> { + SyncPoller> syncPoller = + client.beginRecognizeReceipts(new RecognizeOptions(toFluxByteBuffer(data), RECEIPT_FILE_LENGTH) + .setFormContentType(FormContentType.IMAGE_JPEG).setIncludeTextContent(includeTextContent)) + .getSyncPoller(); syncPoller.waitForCompletion(); validateReceiptResultData(syncPoller.getFinalResult(), false); }); @@ -861,6 +854,11 @@ public void recognizeCustomFormInvalidSourceUrl(HttpClient httpClient, }); } + @Override + void recognizeCustomFormInvalidSourceUrl(HttpClient httpClient, FormRecognizerServiceVersion serviceVersion) { + + } + /** * Verifies an exception thrown for a null model id when recognizing custom form from URL. */ diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTest.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTest.java index 860e06541abf..244fe1dabecc 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTest.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTest.java @@ -11,7 +11,6 @@ import com.azure.ai.formrecognizer.models.OperationResult; import com.azure.ai.formrecognizer.models.RecognizeOptions; import com.azure.ai.formrecognizer.models.RecognizedForm; -import com.azure.ai.formrecognizer.models.RecognizedReceipt; import com.azure.ai.formrecognizer.training.FormTrainingClient; import com.azure.core.exception.HttpResponseException; import com.azure.core.http.HttpClient; diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTestBase.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTestBase.java index 31c0cf01d633..98af5b45e3f9 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTestBase.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTestBase.java @@ -26,7 +26,6 @@ import com.azure.ai.formrecognizer.models.FormWord; import com.azure.ai.formrecognizer.models.Point; import com.azure.ai.formrecognizer.models.RecognizedForm; -import com.azure.ai.formrecognizer.models.RecognizedReceipt; import com.azure.ai.formrecognizer.training.FormTrainingClientBuilder; import com.azure.core.credential.AzureKeyCredential; import com.azure.core.http.HttpClient; @@ -266,35 +265,35 @@ private static void validateFieldValueTransforms(FieldValue expectedFieldValue, } switch (expectedFieldValue.getType()) { case NUMBER: - assertEquals(expectedFieldValue.getValueNumber(), actualFormField.getFieldValue().asFloat()); + assertEquals(expectedFieldValue.getValueNumber(), actualFormField.getFieldValue()); break; case DATE: - assertEquals(expectedFieldValue.getValueDate(), actualFormField.getFieldValue().asDate()); + assertEquals(expectedFieldValue.getValueDate(), actualFormField.getFieldValue()); break; case TIME: assertEquals(LocalTime.parse(expectedFieldValue.getValueTime(), - DateTimeFormatter.ofPattern("HH:mm:ss")), actualFormField.getFieldValue().asTime()); + DateTimeFormatter.ofPattern("HH:mm:ss")), actualFormField.getFieldValue()); break; case STRING: - assertEquals(expectedFieldValue.getValueString(), actualFormField.getFieldValue().asString()); + assertEquals(expectedFieldValue.getValueString(), actualFormField.getFieldValue()); break; case INTEGER: - assertEquals(expectedFieldValue.getValueInteger(), actualFormField.getFieldValue().asInteger()); + assertEquals(expectedFieldValue.getValueInteger(), actualFormField.getFieldValue()); break; case PHONE_NUMBER: - assertEquals(expectedFieldValue.getValuePhoneNumber(), actualFormField.getFieldValue().asPhoneNumber()); + assertEquals(expectedFieldValue.getValuePhoneNumber(), actualFormField.getFieldValue()); break; case OBJECT: expectedFieldValue.getValueObject().forEach((key, fieldValue) -> { - FormField actualFormFieldValue = actualFormField.getFieldValue().asMap().get(key); + FormField actualFormFieldValue = ((Map>) actualFormField.getFieldValue()).get(key); validateFieldValueTransforms(fieldValue, actualFormFieldValue, readResults, includeFieldElements); }); break; case ARRAY: - assertEquals(expectedFieldValue.getValueArray().size(), actualFormField.getFieldValue().asList().size()); + assertEquals(expectedFieldValue.getValueArray().size(), ((List>) actualFormField.getFieldValue()).size()); for (int i = 0; i < expectedFieldValue.getValueArray().size(); i++) { FieldValue expectedReceiptItem = expectedFieldValue.getValueArray().get(i); - FormField actualReceiptItem = actualFormField.getFieldValue().asList().get(i); + FormField actualReceiptItem = ((List>) actualFormField.getFieldValue()).get(i); validateFieldValueTransforms(expectedReceiptItem, actualReceiptItem, readResults, includeFieldElements); } break; @@ -492,17 +491,18 @@ abstract void recognizeCustomFormUrlMultiPageLabeled(HttpClient httpClient, FormRecognizerServiceVersion serviceVersion); // Receipt - void validateReceiptDataFields(Map actualRecognizedReceiptFields, boolean includeFieldElements) { + void validateReceiptDataFields(Map> actualRecognizedReceiptFields, boolean includeFieldElements) { final AnalyzeResult analyzeResult = getAnalyzeRawResponse().getAnalyzeResult(); List readResults = analyzeResult.getReadResults(); DocumentResult documentResult = analyzeResult.getDocumentResults().get(0); Map expectedReceiptFields = documentResult.getFields(); assertEquals(expectedReceiptFields.get("ReceiptType").getValueString(), - actualRecognizedReceiptFields.get("ReceiptType").getFieldValue().asString()); + actualRecognizedFormFields.get("ReceiptType").getFieldValue()); assertEquals(expectedReceiptFields.get("ReceiptType").getConfidence(), - actualRecognizedReceiptFields.get("ReceiptType").getConfidence()); + actualRecognizedFormFields.get("ReceiptType").getConfidence()); validateFieldValueTransforms(expectedReceiptFields.get("MerchantName"), +<<<<<<< HEAD actualRecognizedReceiptFields.get("MerchantName"), readResults, includeFieldElements); validateFieldValueTransforms(expectedReceiptFields.get("MerchantPhoneNumber"), actualRecognizedReceiptFields.get("MerchantPhoneNumber"), readResults, includeFieldElements); @@ -547,6 +547,7 @@ void validateContentResultData(List actualFormPageList, boolean includ } } +<<<<<<< HEAD void validateReceiptResultData(List actualReceiptList, boolean includeFieldElements) { final AnalyzeResult rawResponse = getAnalyzeRawResponse().getAnalyzeResult(); for (int i = 0; i < actualReceiptList.size(); i++) { @@ -554,13 +555,22 @@ void validateReceiptResultData(List actualReceiptList, boolea validateLabeledData(actualReceipt.getRecognizedForm(), includeFieldElements, rawResponse.getReadResults(), rawResponse.getDocumentResults().get(i)); validateReceiptDataFields(actualReceipt.getRecognizedForm().getFields(), includeFieldElements); +======= + void validateReceiptResultData(List actualReceiptList, boolean includeTextContent) { + final AnalyzeResult rawResponse = getAnalyzeRawResponse().getAnalyzeResult(); + for (int i = 0; i < actualReceiptList.size(); i++) { + final RecognizedForm actualReceipt = actualReceiptList.get(i); + validateLabeledData(actualReceipt, includeTextContent, rawResponse.getReadResults(), + rawResponse.getDocumentResults().get(i)); + validateReceiptDataFields(actualReceipt.getFields(), includeTextContent); +>>>>>>> 6c5c3d603c... receipt design update } } - void validateBlankPdfResultData(List actualReceiptList) { + void validateBlankPdfResultData(List actualReceiptList) { assertEquals(1, actualReceiptList.size()); - final RecognizedReceipt actualReceipt = actualReceiptList.get(0); - assertTrue(actualReceipt.getRecognizedForm().getFields().isEmpty()); + final RecognizedForm actualReceipt = actualReceiptList.get(0); + assertTrue(actualReceipt.getFields().isEmpty()); } void validateRecognizedResult(List actualFormList, boolean includeFieldElements, @@ -697,7 +707,7 @@ private void validateUnLabeledResult(RecognizedForm actualForm, boolean includeF validatePageRangeData(expectedPage.getPage(), actualForm.getFormPageRange()); for (int i = 0; i < expectedPage.getKeyValuePairs().size(); i++) { final KeyValuePair expectedFormField = expectedPage.getKeyValuePairs().get(i); - final FormField actualFormField = actualForm.getFields().get("field-" + i); + final FormField actualFormField = actualForm.getFields().get("field-" + i); assertEquals(expectedFormField.getConfidence(), actualFormField.getConfidence()); assertEquals(expectedFormField.getKey().getText(), actualFormField.getLabelData().getText()); validateBoundingBoxData(expectedFormField.getKey().getBoundingBox(), @@ -720,7 +730,7 @@ private void validateLabeledData(RecognizedForm actualForm, boolean includeField assertEquals(documentResult.getPageRange().get(0), actualForm.getFormPageRange().getFirstPageNumber()); assertEquals(documentResult.getPageRange().get(1), actualForm.getFormPageRange().getLastPageNumber()); documentResult.getFields().forEach((label, expectedFieldValue) -> { - final FormField actualFormField = actualForm.getFields().get(label); + final FormField actualFormField = actualForm.getFields().get(label); assertEquals(label, actualFormField.getName()); if (expectedFieldValue != null) { if (expectedFieldValue.getConfidence() != null) { @@ -751,7 +761,7 @@ static void validateMultiPageDataLabeled(List actualRecognizedFo static void validateMultiPageDataUnlabeled(List actualRecognizedFormsList) { actualRecognizedFormsList.forEach(recognizedForm -> { assertNotNull(recognizedForm.getFormType()); - assertEquals(1, recognizedForm.getPages().stream().count()); + assertEquals(1, (long) recognizedForm.getPages().size()); recognizedForm.getFields().forEach((label, formField) -> { assertNotNull(formField.getName()); assertNotNull(formField.getFieldValue()); @@ -761,24 +771,24 @@ static void validateMultiPageDataUnlabeled(List actualRecognized }); } - static void validateMultipageReceiptData(List recognizedReceipts) { + static void validateMultipageReceiptData(List recognizedReceipts) { assertEquals(3, recognizedReceipts.size()); - RecognizedForm receiptPage1 = recognizedReceipts.get(0).getRecognizedForm(); - RecognizedForm receiptPage2 = recognizedReceipts.get(1).getRecognizedForm(); - RecognizedForm receiptPage3 = recognizedReceipts.get(2).getRecognizedForm(); + RecognizedForm receiptPage1 = recognizedReceipts.get(0); + RecognizedForm receiptPage2 = recognizedReceipts.get(1); + RecognizedForm receiptPage3 = recognizedReceipts.get(2); assertEquals(1, receiptPage1.getFormPageRange().getFirstPageNumber()); assertEquals(1, receiptPage1.getFormPageRange().getLastPageNumber()); - Map receiptPage1Fields = receiptPage1.getFields(); + Map> receiptPage1Fields = receiptPage1.getFields(); assertEquals(EXPECTED_MULTIPAGE_ADDRESS_VALUE, receiptPage1Fields.get("MerchantAddress") - .getFieldValue().asString()); + .getFieldValue()); assertEquals("Bilbo Baggins", receiptPage1Fields.get("MerchantName") - .getFieldValue().asString()); + .getFieldValue()); assertEquals(EXPECTED_MULTIPAGE_PHONE_NUMBER_VALUE, receiptPage1Fields.get("MerchantPhoneNumber") - .getFieldValue().asPhoneNumber()); - assertNotNull(receiptPage1Fields.get("Total").getFieldValue().asFloat()); + .getFieldValue()); + assertNotNull(receiptPage1Fields.get("Total").getFieldValue()); assertNotNull(receiptPage1.getPages()); - assertEquals(ITEMIZED_RECEIPT_VALUE, receiptPage1Fields.get("ReceiptType").getFieldValue().asString()); + assertEquals(ITEMIZED_RECEIPT_VALUE, receiptPage1Fields.get("ReceiptType").getFieldValue()); // Assert no fields, tables and lines on second page assertEquals(0, receiptPage2.getFields().size()); @@ -791,18 +801,18 @@ static void validateMultipageReceiptData(List recognizedRecei assertEquals(3, receiptPage3.getFormPageRange().getFirstPageNumber()); assertEquals(3, receiptPage3.getFormPageRange().getLastPageNumber()); - Map receiptPage3Fields = receiptPage3.getFields(); + Map> receiptPage3Fields = receiptPage3.getFields(); assertEquals(EXPECTED_MULTIPAGE_ADDRESS_VALUE, receiptPage3Fields.get("MerchantAddress") - .getFieldValue().asString()); + .getFieldValue()); assertEquals("Frodo Baggins", receiptPage3Fields.get("MerchantName") - .getFieldValue().asString()); + .getFieldValue()); assertEquals(EXPECTED_MULTIPAGE_PHONE_NUMBER_VALUE, receiptPage3Fields.get("MerchantPhoneNumber") - .getFieldValue().asPhoneNumber()); - assertNotNull(receiptPage3Fields.get("Total").getFieldValue().asFloat()); + .getFieldValue()); + assertNotNull(receiptPage3Fields.get("Total").getFieldValue()); // why isn't tip returned by service? // total value 1000 returned by service but should be 4300, service bug - assertEquals(3000.0f, receiptPage3Fields.get("Subtotal").getFieldValue().asFloat()); - assertEquals(ITEMIZED_RECEIPT_VALUE, receiptPage3Fields.get("ReceiptType").getFieldValue().asString()); + assertEquals(3000.0f, receiptPage3Fields.get("Subtotal").getFieldValue()); + assertEquals(ITEMIZED_RECEIPT_VALUE, receiptPage3Fields.get("ReceiptType").getFieldValue()); } protected String getEndpoint() { From 6861dedaa5f115f35816902a075ea293058ef3b3 Mon Sep 17 00:00:00 2001 From: Sameeksha Vaity Date: Tue, 23 Jun 2020 12:46:59 -0700 Subject: [PATCH 2/9] update changelog and add casting in samples --- .../azure-ai-formrecognizer/CHANGELOG.md | 1 + .../azure-ai-formrecognizer/README.md | 31 +++---- .../ai/formrecognizer/models/FormField.java | 17 ++-- .../AdvancedDiffLabeledUnlabeledData.java | 2 +- ...AdvancedDiffLabeledUnlabeledDataAsync.java | 4 +- .../ai/formrecognizer/Authentication.java | 26 +++--- ...ognizerAsyncClientJavaDocCodeSnippets.java | 78 ++++++++--------- ...rmRecognizerClientJavaDocCodeSnippets.java | 83 ++++++++++--------- .../ai/formrecognizer/GetBoundingBoxes.java | 2 +- .../formrecognizer/GetBoundingBoxesAsync.java | 2 +- .../ai/formrecognizer/ReadmeSamples.java | 35 ++++---- .../ai/formrecognizer/ReceiptExtensions.java | 6 +- .../ai/formrecognizer/RecognizeReceipts.java | 43 +++++----- .../RecognizeReceiptsFromUrl.java | 43 +++++----- .../RecognizeReceiptsFromUrlAsync.java | 44 +++++----- .../StronglyTypedRecognizedFormUSReceipt.java | 26 +++--- .../FormRecognizerClientTestBase.java | 52 +++++++----- 17 files changed, 265 insertions(+), 230 deletions(-) diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/CHANGELOG.md b/sdk/formrecognizer/azure-ai-formrecognizer/CHANGELOG.md index 162ff520b38f..b9ddc87d09ed 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/CHANGELOG.md +++ b/sdk/formrecognizer/azure-ai-formrecognizer/CHANGELOG.md @@ -2,6 +2,7 @@ ## 1.0.0-beta.4 (Unreleased) ### Breaking Changes +- `beginRecognizeReceipt` APIs now return a `RecognizedForm` model instead of a `RecognizedReceipt`. - Methods returning `textContent` have been renamed to `fieldElements` on `FieldData` and `FormTableCell` - Renamed `FormContent` to `FormElement` - Renamed `FieldText` to `FieldData` diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/README.md b/sdk/formrecognizer/azure-ai-formrecognizer/README.md index 70e96016c495..def206bec470 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/README.md +++ b/sdk/formrecognizer/azure-ai-formrecognizer/README.md @@ -279,35 +279,36 @@ for (int i = 0; i < receiptPageResults.size(); i++) { Map> recognizedFields = recognizedReceipt.getFields(); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); - if (merchantNameField.getFieldValue() instanceof String) { + if (merchantNameField.getValue() instanceof String) { + String merchantName = (String) merchantNameField.getValue(); System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantNameField.getFieldValue(), - merchantNameField.getConfidence()); + merchantName, merchantNameField.getConfidence()); } FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField.getFieldValue() instanceof LocalDate) { + if (transactionDateField.getValue() instanceof LocalDate) { + LocalDate transactionDate = (LocalDate) transactionDateField.getValue(); System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDateField.getFieldValue(), - transactionDateField.getConfidence()); + transactionDate, transactionDateField.getConfidence()); } FormField receiptItemsField = recognizedFields.get("Items"); System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getFieldValue() instanceof List) { - List> receiptItems = (List>) receiptItemsField.getFieldValue(); + if (receiptItemsField.getValue() instanceof List) { + List> receiptItems = (List>) receiptItemsField.getValue(); receiptItems.forEach(receiptItem -> { - if (receiptItem.getFieldValue() instanceof Map) { - ((Map>) receiptItem.getFieldValue()).forEach((key, formField) -> { + if (receiptItem.getValue() instanceof Map) { + ((Map>) receiptItem.getValue()).forEach((key, formField) -> { if ("Name".equals(key)) { - if (formField.getFieldValue() instanceof String) { + if (formField.getValue() instanceof String) { + String name = (String) formField.getValue(); System.out.printf("Name: %s, confidence: %.2fs%n", - formField.getFieldValue(), - formField.getConfidence()); + name, formField.getConfidence()); } } if ("Quantity".equals(key)) { - if (formField.getFieldValue() instanceof Integer) { + if (formField.getValue() instanceof Integer) { + Integer quantity = (Integer) formField.getValue(); System.out.printf("Quantity: %d, confidence: %.2f%n", - formField.getFieldValue(), formField.getConfidence()); + quantity, formField.getConfidence()); } } }); diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FormField.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FormField.java index fb32c069e933..85050d55cd6c 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FormField.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FormField.java @@ -15,7 +15,7 @@ public final class FormField { private final FieldData labelData; private final String name; private final FieldData valueData; - private final T fieldValue; + private final T value; /** * Constructs a FormField object. @@ -23,15 +23,15 @@ public final class FormField { * @param confidence The confidence of the recognized field. * @param labelData The text, bounding box, and field elements for the field label. * @param name The name the field or label. - * @param fieldValue The value of the recognized field. + * @param value The value of the recognized field. * @param valueData The text, bounding box, and field elements for the field value. */ - public FormField(final float confidence, final FieldData labelData, final String name, final T fieldValue, + public FormField(final float confidence, final FieldData labelData, final String name, final T value, final FieldData valueData) { this.confidence = confidence; this.labelData = labelData; this.name = name; - this.fieldValue = fieldValue; + this.value = value; this.valueData = valueData; } @@ -63,12 +63,13 @@ public String getName() { } /** - * Get the value of the recognized field. + * Get the value of the recognized field. Possible types include: 'String', + * 'LocalDate', 'LocalTime', 'Integer', 'Float', 'Map', or 'List'. * - * @return Value of the recognized field. + * @return the value of the recognized field. */ - public T getFieldValue() { - return this.fieldValue; + public T getValue() { + return this.value; } /** diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/AdvancedDiffLabeledUnlabeledData.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/AdvancedDiffLabeledUnlabeledData.java index e380fce535a9..01a79d42d4a8 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/AdvancedDiffLabeledUnlabeledData.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/AdvancedDiffLabeledUnlabeledData.java @@ -78,7 +78,7 @@ public static void main(String[] args) throws IOException { } System.out.printf("Field %s has value %s based on %s within bounding box %s with a confidence score " + "of %.2f.%n", - label, formField.getFieldValue(), formField.getValueData().getText(), boundingBoxStr, + label, formField.getValue(), formField.getValueData().getText(), boundingBoxStr, formField.getConfidence()); // Find the value of a specific labeled field. diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/AdvancedDiffLabeledUnlabeledDataAsync.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/AdvancedDiffLabeledUnlabeledDataAsync.java index f5e14b616707..24b783a515d1 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/AdvancedDiffLabeledUnlabeledDataAsync.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/AdvancedDiffLabeledUnlabeledDataAsync.java @@ -108,7 +108,7 @@ public static void main(String[] args) throws IOException { } System.out.printf("Field %s has value %s based on %s within bounding box %s with a confidence score " + "of %.2f.%n", - label, formField.getFieldValue(), formField.getValueData().getText(), boundingBoxStr, + label, formField.getValue(), formField.getValueData().getText(), boundingBoxStr, formField.getConfidence()); // Find the value of a specific labeled field. @@ -157,7 +157,7 @@ public static void main(String[] args) throws IOException { System.out.printf("Field %s has value %s based on %s within bounding box %s with a confidence " + "score of %.2f.%n", - label, formField.getFieldValue(), formField.getValueData().getText(), boundingBoxStr, + label, formField.getValue(), formField.getValueData().getText(), boundingBoxStr, formField.getConfidence()); // Find the value of a specific unlabeled field. The specific key "Vendor Name:" provided in the diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/Authentication.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/Authentication.java index f8bb658c3ee0..098ed8121ae9 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/Authentication.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/Authentication.java @@ -96,14 +96,15 @@ private static void beginRecognizeCustomFormsFromUrl(FormRecognizerClient formRe Map> recognizedFields = recognizedReceipt.getFields(); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); - Object merchantNameFieldValue = recognizedFields.get("MerchantName").getFieldValue(); + Object merchantNameFieldValue = recognizedFields.get("MerchantName").getValue(); if (merchantNameFieldValue instanceof String) { + String merchantName = (String) merchantNameFieldValue; System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantNameFieldValue, merchantNameField.getConfidence()); + merchantName, merchantNameField.getConfidence()); } FormField transactionDateField = recognizedFields.get("TransactionDate"); - Object transactionDateFieldValue = recognizedFields.get("MerchantName").getFieldValue(); + Object transactionDateFieldValue = recognizedFields.get("MerchantName").getValue(); if (transactionDateFieldValue instanceof LocalDate) { LocalDate transactionDate = (LocalDate) transactionDateFieldValue; System.out.printf("Transaction Date: %s, confidence: %.2f%n", @@ -113,22 +114,23 @@ private static void beginRecognizeCustomFormsFromUrl(FormRecognizerClient formRe FormField receiptItemsField = recognizedFields.get("Items"); if (receiptItemsField != null) { System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getFieldValue() instanceof List) { - List> receiptItems = (List>) receiptItemsField.getFieldValue(); + if (receiptItemsField.getValue() instanceof List) { + List> receiptItems = (List>) receiptItemsField.getValue(); receiptItems.forEach(receiptItem -> { - if (receiptItem.getFieldValue() instanceof Map) { - ((Map>) receiptItem.getFieldValue()).forEach((key, formField) -> { + if (receiptItem.getValue() instanceof Map) { + ((Map>) receiptItem.getValue()).forEach((key, formField) -> { if ("Name".equals(key)) { - if (formField.getFieldValue() instanceof String) { + if (formField.getValue() instanceof String) { + String Name = (String) formField.getValue(); System.out.printf("Name: %s, confidence: %.2fs%n", - formField.getFieldValue(), - formField.getConfidence()); + Name, formField.getConfidence()); } } if ("Quantity".equals(key)) { - if (formField.getFieldValue() instanceof Integer) { + if (formField.getValue() instanceof Integer) { + Integer quantity = (Integer) formField.getValue(); System.out.printf("Quantity: %d, confidence: %.2f%n", - formField.getFieldValue(), formField.getConfidence()); + quantity, formField.getConfidence()); } } }); diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientJavaDocCodeSnippets.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientJavaDocCodeSnippets.java index 7e0f1da559a9..a88a3a08d895 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientJavaDocCodeSnippets.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientJavaDocCodeSnippets.java @@ -3,6 +3,7 @@ package com.azure.ai.formrecognizer; +import com.azure.ai.formrecognizer.implementation.models.FieldValueType; import com.azure.ai.formrecognizer.models.FormContentType; import com.azure.ai.formrecognizer.models.FormField; import com.azure.ai.formrecognizer.models.RecognizeOptions; @@ -294,28 +295,29 @@ public void beginRecognizeReceiptsFromUrl() { Map> recognizedFields = recognizedReceipt.getFields(); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); - if (merchantNameField.getFieldValue().getType() == FieldValueType.STRING) { + if (merchantNameField.getValue().getType() == FieldValueType.STRING) { + String merchantName = (String) merchantNameField.getValue(); System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantNameField.getFieldValue(), - merchantNameField.getConfidence()); + merchantName, merchantNameField.getConfidence()); } FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField.getFieldValue() instanceof LocalDate) { + if (transactionDateField.getValue() instanceof LocalDate) { + LocalDate transactionDate = (LocalDate) transactionDateField.getValue(); System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDateField.getFieldValue(), - transactionDateField.getConfidence()); + transactionDate, transactionDateField.getConfidence()); } FormField receiptItemsField = recognizedFields.get("Items"); System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getFieldValue() instanceof List) { - List> receiptItems = (List>) receiptItemsField.getFieldValue(); + if (receiptItemsField.getValue() instanceof List) { + List> receiptItems = (List>) receiptItemsField.getValue(); receiptItems.forEach(receiptItem -> { - if (receiptItem.getFieldValue() instanceof Map) { - ((Map>) receiptItem.getFieldValue()).forEach((key, formField) -> { + if (receiptItem.getValue() instanceof Map) { + ((Map>) receiptItem.getValue()).forEach((key, formField) -> { if ("Quantity".equals(key)) { - if (formField.getFieldValue() instanceof Integer) { + if (formField.getValue() instanceof Integer) { + Integer quantity = (Integer) formField.getValue(); System.out.printf("Quantity: %s, confidence: %.2f%n", - formField.getFieldValue(), formField.getConfidence()); + quantity, formField.getConfidence()); } } }); @@ -399,29 +401,30 @@ public void beginRecognizeReceipts() throws IOException { Map> recognizedFields = recognizedReceipt.getFields(); System.out.printf("----------- Recognized Receipt page %s -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); - if (merchantNameField.getFieldValue() instanceof String) { + if (merchantNameField.getValue() instanceof String) { + String merchantName = (String) merchantNameField.getValue(); System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantNameField.getFieldValue(), - merchantNameField.getConfidence()); + merchantName, merchantNameField.getConfidence()); } FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField.getFieldValue() instanceof LocalDate) { + if (transactionDateField.getValue() instanceof LocalDate) { + LocalDate transactionDate = (LocalDate) transactionDateField.getValue(); System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDateField.getFieldValue(), - transactionDateField.getConfidence()); + transactionDate, transactionDateField.getConfidence()); } FormField receiptItemsField = recognizedFields.get("Items"); System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getFieldValue() instanceof List) { - List> receiptItems = (List>) receiptItemsField.getFieldValue(); + if (receiptItemsField.getValue() instanceof List) { + List> receiptItems = (List>) receiptItemsField.getValue(); receiptItems.forEach(receiptItem -> { - if (receiptItem.getFieldValue() instanceof Map) { - ((Map>) receiptItem.getFieldValue()) + if (receiptItem.getValue() instanceof Map) { + ((Map>) receiptItem.getValue()) .forEach((key, formField) -> { if ("Quantity".equals(key)) { - if (formField.getFieldValue() instanceof Integer) { + if (formField.getValue() instanceof Integer) { + Integer quantity = (Integer) formField.getValue(); System.out.printf("Quantity: %s, confidence: %.2f%n", - formField.getFieldValue(), formField.getConfidence()); + quantity, formField.getConfidence()); } } }); @@ -458,31 +461,32 @@ public void beginRecognizeReceiptsWithOptions() throws IOException { for (int i = 0; i < recognizedReceipts.size(); i++) { RecognizedForm recognizedReceipt = recognizedReceipts.get(i); Map> recognizedFields = recognizedReceipt.getFields(); - System.out.printf("----------- Recognized Receipt page %s -----------%n", i); + System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); - if (merchantNameField.getFieldValue() instanceof String) { + if (merchantNameField.getValue() instanceof String) { + String merchantName = (String) merchantNameField.getValue(); System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantNameField.getFieldValue(), - merchantNameField.getConfidence()); + merchantName, merchantNameField.getConfidence()); } FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField.getFieldValue() instanceof LocalDate) { + if (transactionDateField.getValue() instanceof LocalDate) { + LocalDate transactionDate = (LocalDate) transactionDateField.getValue(); System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDateField.getFieldValue(), - transactionDateField.getConfidence()); + transactionDate, transactionDateField.getConfidence()); } FormField receiptItemsField = recognizedFields.get("Items"); System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getFieldValue() instanceof List) { - List> receiptItems = (List>) receiptItemsField.getFieldValue(); + if (receiptItemsField.getValue() instanceof List) { + List> receiptItems = (List>) receiptItemsField.getValue(); receiptItems.forEach(receiptItem -> { - if (receiptItem.getFieldValue() instanceof Map) { - ((Map>) receiptItem.getFieldValue()) + if (receiptItem.getValue() instanceof Map) { + ((Map>) receiptItem.getValue()) .forEach((key, formField) -> { if ("Quantity".equals(key)) { - if (formField.getFieldValue() instanceof Integer) { + if (formField.getValue() instanceof Integer) { + Integer quantity = (Integer) formField.getValue(); System.out.printf("Quantity: %d, confidence: %.2f%n", - formField.getFieldValue(), formField.getConfidence()); + quantity, formField.getConfidence()); } } }); diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerClientJavaDocCodeSnippets.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerClientJavaDocCodeSnippets.java index c8412dba4fe4..dcae95a99e7f 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerClientJavaDocCodeSnippets.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerClientJavaDocCodeSnippets.java @@ -70,7 +70,7 @@ public void beginRecognizeCustomFormsFromUrl() { .forEach(recognizedForm -> { recognizedForm.getFields().forEach((fieldText, fieldValue) -> { System.out.printf("Field text: %s%n", fieldText); - System.out.printf("Field value: %s%n", fieldValue.getFieldValue()); + System.out.printf("Field value: %s%n", fieldValue.getValue()); System.out.printf("Confidence score: %.2f%n", fieldValue.getConfidence()); }); }); @@ -116,7 +116,7 @@ public void beginRecognizeCustomForms() throws IOException { formRecognizerClient.beginRecognizeCustomForms(targetStream, form.length(), modelId).getFinalResult() .forEach(recognizedForm -> recognizedForm.getFields().forEach((fieldText, fieldValue) -> { System.out.printf("Field text: %s%n", fieldText); - System.out.printf("Field value: %s%n", fieldValue.getFieldValue()); + System.out.printf("Field value: %s%n", fieldValue.getValue()); System.out.printf("Confidence score: %.2f%n", fieldValue.getConfidence()); })); // END: com.azure.ai.formrecognizer.FormRecognizerClient.beginRecognizeCustomForms#InputStream-long-string @@ -253,28 +253,29 @@ public void beginRecognizeReceiptsFromUrl() { .forEach(recognizedReceipt -> { Map> recognizedFields = recognizedReceipt.getFields(); FormField merchantNameField = recognizedFields.get("MerchantName"); - if (merchantNameField.getFieldValue() instanceof String) { + if (merchantNameField.getValue() instanceof String) { + String merchantName = (String) merchantNameField.getValue(); System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantNameField.getFieldValue(), - merchantNameField.getConfidence()); + merchantName, merchantNameField.getConfidence()); } FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField.getFieldValue() instanceof LocalDate) { + if (transactionDateField.getValue() instanceof LocalDate) { + LocalDate transactionDate = (LocalDate) transactionDateField.getValue(); System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDateField.getFieldValue(), - transactionDateField.getConfidence()); + transactionDate, transactionDateField.getConfidence()); } FormField receiptItemsField = recognizedFields.get("Items"); System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getFieldValue() instanceof List) { - List> receiptItems = (List>) receiptItemsField.getFieldValue(); + if (receiptItemsField.getValue() instanceof List) { + List> receiptItems = (List>) receiptItemsField.getValue(); receiptItems.forEach(receiptItem -> { - if (receiptItem.getFieldValue() instanceof Map) { - ((Map>) receiptItem.getFieldValue()).forEach((key, formField) -> { + if (receiptItem.getValue() instanceof Map) { + ((Map>) receiptItem.getValue()).forEach((key, formField) -> { if ("Quantity".equals(key)) { - if (formField.getFieldValue() instanceof Integer) { + if (formField.getValue() instanceof Integer) { + Integer quantity = (Integer) formField.getValue(); System.out.printf("Quantity: %s, confidence: %.2f%n", - formField.getFieldValue(), formField.getConfidence()); + quantity, formField.getConfidence()); } } }); @@ -343,28 +344,29 @@ public void beginRecognizeReceipts() throws IOException { .getFinalResult().forEach(recognizedReceipt -> { Map> recognizedFields = recognizedReceipt.getFields(); FormField merchantNameField = recognizedFields.get("MerchantName"); - if (merchantNameField.getFieldValue() instanceof String) { + if (merchantNameField.getValue() instanceof String) { + String merchantName = (String) merchantNameField.getValue(); System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantNameField.getFieldValue(), - merchantNameField.getConfidence()); + merchantName, merchantNameField.getConfidence()); } FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField.getFieldValue() instanceof LocalDate) { + if (transactionDateField.getValue() instanceof LocalDate) { + LocalDate transactionDate = (LocalDate) transactionDateField.getValue(); System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDateField.getFieldValue(), - transactionDateField.getConfidence()); + transactionDate, transactionDateField.getConfidence()); } FormField receiptItemsField = recognizedFields.get("Items"); System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getFieldValue() instanceof List) { - List> receiptItems = (List>) receiptItemsField.getFieldValue(); + if (receiptItemsField.getValue() instanceof List) { + List> receiptItems = (List>) receiptItemsField.getValue(); receiptItems.forEach(receiptItem -> { - if (receiptItem.getFieldValue() instanceof Map) { - ((Map>) receiptItem.getFieldValue()).forEach((key, formField) -> { + if (receiptItem.getValue() instanceof Map) { + ((Map>) receiptItem.getValue()).forEach((key, formField) -> { if ("Quantity".equals(key)) { - if (formField.getFieldValue() instanceof Integer) { + if (formField.getValue() instanceof Integer) { + Integer quantity = (Integer) formField.getValue(); System.out.printf("Quantity: %d, confidence: %.2f%n", - formField.getFieldValue(), formField.getConfidence()); + quantity, formField.getConfidence()); } } }); @@ -395,30 +397,31 @@ public void beginRecognizeReceiptsWithOptions() throws IOException { .setIncludeFieldElements(includeFieldElements) .setPollInterval(Duration.ofSeconds(5))) .getFinalResult().forEach(recognizedReceipt -> { - Map recognizedFields = recognizedReceipt.getRecognizedForm().getFields(); - FormField merchantNameField = recognizedFields.get("MerchantName"); - if (merchantNameField.getFieldValue().getType() == FieldValueType.STRING) { + Map> recognizedFields = recognizedReceipt.getFields(); + FormField merchantNameField = recognizedFields.get("MerchantName"); + if (merchantNameField.getValue() instanceof String) { + String merchantName = (String) merchantNameField.getValue(); System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantNameField.getFieldValue(), - merchantNameField.getConfidence()); + merchantName, merchantNameField.getConfidence()); } FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField.getFieldValue() instanceof LocalDate) { + if (transactionDateField.getValue() instanceof LocalDate) { + LocalDate transactionDate = (LocalDate) transactionDateField.getValue(); System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDateField.getFieldValue(), - transactionDateField.getConfidence()); + transactionDate, transactionDateField.getConfidence()); } FormField receiptItemsField = recognizedFields.get("Items"); System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getFieldValue() instanceof List) { - List> receiptItems = (List>) receiptItemsField.getFieldValue(); + if (receiptItemsField.getValue() instanceof List) { + List> receiptItems = (List>) receiptItemsField.getValue(); receiptItems.forEach(receiptItem -> { - if (receiptItem.getFieldValue() instanceof Map) { - ((Map>) receiptItem.getFieldValue()).forEach((key, formField) -> { + if (receiptItem.getValue() instanceof Map) { + ((Map>) receiptItem.getValue()).forEach((key, formField) -> { if ("Quantity".equals(key)) { - if (formField.getFieldValue() instanceof Integer) { + if (formField.getValue() instanceof Integer) { + Integer quantity = (Integer) formField.getValue(); System.out.printf("Quantity: %d, confidence: %.2f%n", - formField.getFieldValue(), formField.getConfidence()); + quantity, formField.getConfidence()); } } }); diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/GetBoundingBoxes.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/GetBoundingBoxes.java index ed281654cad8..f6f72e2d9c95 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/GetBoundingBoxes.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/GetBoundingBoxes.java @@ -50,7 +50,7 @@ public static void main(String[] args) { recognizedForm.getFields().forEach((fieldText, fieldValue) -> System.out.printf("Field %s has value %s " + "based on %s with a confidence score " + "of %.2f.%n", - fieldText, fieldValue.getFieldValue(), fieldValue.getValueData().getText(), + fieldText, fieldValue.getValue(), fieldValue.getValueData().getText(), fieldValue.getConfidence())); // Page Information diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/GetBoundingBoxesAsync.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/GetBoundingBoxesAsync.java index c8931c16ab2a..ebfad4bdc35f 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/GetBoundingBoxesAsync.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/GetBoundingBoxesAsync.java @@ -63,7 +63,7 @@ public static void main(String[] args) { recognizedForm.getFields().forEach((fieldText, fieldValue) -> { System.out.printf("Field %s has value %s based on %s with a confidence score " + "of %.2f.%n", - fieldText, fieldValue.getFieldValue(), fieldValue.getValueData().getText(), + fieldText, fieldValue.getValue(), fieldValue.getValueData().getText(), fieldValue.getConfidence()); }); diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java index 67cbf22bb7d9..644819153e9f 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java @@ -100,8 +100,8 @@ public void recognizeCustomForm() { form.getFields().forEach((label, formField) -> System.out.printf("Field %s has value %s with confidence score of %f.%n", label, formField.getValueData().getText(), - formField.getConfidence()); - }); + formField.getConfidence()) + ); System.out.print("-----------------------------------"); } } @@ -151,35 +151,36 @@ public void recognizeReceipt() { Map> recognizedFields = recognizedReceipt.getFields(); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); - if (merchantNameField.getFieldValue() instanceof String) { + if (merchantNameField.getValue() instanceof String) { + String merchantName = (String) merchantNameField.getValue(); System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantNameField.getFieldValue(), - merchantNameField.getConfidence()); + merchantName, merchantNameField.getConfidence()); } FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField.getFieldValue() instanceof LocalDate) { + if (transactionDateField.getValue() instanceof LocalDate) { + LocalDate transactionDate = (LocalDate) transactionDateField.getValue(); System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDateField.getFieldValue(), - transactionDateField.getConfidence()); + transactionDate, transactionDateField.getConfidence()); } FormField receiptItemsField = recognizedFields.get("Items"); System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getFieldValue() instanceof List) { - List> receiptItems = (List>) receiptItemsField.getFieldValue(); + if (receiptItemsField.getValue() instanceof List) { + List> receiptItems = (List>) receiptItemsField.getValue(); receiptItems.forEach(receiptItem -> { - if (receiptItem.getFieldValue() instanceof Map) { - ((Map>) receiptItem.getFieldValue()).forEach((key, formField) -> { + if (receiptItem.getValue() instanceof Map) { + ((Map>) receiptItem.getValue()).forEach((key, formField) -> { if ("Name".equals(key)) { - if (formField.getFieldValue() instanceof String) { + if (formField.getValue() instanceof String) { + String name = (String) formField.getValue(); System.out.printf("Name: %s, confidence: %.2fs%n", - formField.getFieldValue(), - formField.getConfidence()); + name, formField.getConfidence()); } } if ("Quantity".equals(key)) { - if (formField.getFieldValue() instanceof Integer) { + if (formField.getValue() instanceof Integer) { + Integer quantity = (Integer) formField.getValue(); System.out.printf("Quantity: %d, confidence: %.2f%n", - formField.getFieldValue(), formField.getConfidence()); + quantity, formField.getConfidence()); } } }); diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReceiptExtensions.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReceiptExtensions.java index fe7ab3820689..e96a2b12fd09 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReceiptExtensions.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReceiptExtensions.java @@ -48,7 +48,7 @@ public static USReceipt asUSReceipt(RecognizedForm recognizedForm) { FormField fieldValue = entry.getValue(); switch (key) { case "ReceiptType": - receiptType = new USReceiptType(((FormField) fieldValue).getFieldValue(), + receiptType = new USReceiptType(((FormField) fieldValue).getValue(), fieldValue.getConfidence()); break; case "MerchantName": @@ -101,11 +101,11 @@ public static USReceipt asUSReceipt(RecognizedForm recognizedForm) { */ @SuppressWarnings("unchecked") private static List toReceiptItems(FormField fieldValueItems) { - List> fieldValueArray = (List>) fieldValueItems.getFieldValue(); + List> fieldValueArray = (List>) fieldValueItems.getValue(); List receiptItemList = new ArrayList<>(); for (FormField eachFieldValue : fieldValueArray) { - Map> objectValue = ((Map>) (eachFieldValue.getFieldValue())); + Map> objectValue = ((Map>) (eachFieldValue.getValue())); FormField name = null; FormField quantity = null; FormField price = null; diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceipts.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceipts.java index c211bd1fb107..0477c59ad921 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceipts.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceipts.java @@ -54,25 +54,27 @@ public static void main(final String[] args) throws IOException { System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); if (merchantNameField != null) { - Object merchantNameFieldValue = merchantNameField.getFieldValue(); + Object merchantNameFieldValue = merchantNameField.getValue(); if (merchantNameFieldValue instanceof String) { + String merchantName = (String) merchantNameFieldValue; System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantNameFieldValue, merchantNameField.getConfidence()); + merchantName, merchantNameField.getConfidence()); } } FormField merchantAddressField = recognizedFields.get("MerchantAddress"); if (merchantAddressField != null) { - Object merchantAddressFieldValue = merchantAddressField.getFieldValue(); + Object merchantAddressFieldValue = merchantAddressField.getValue(); if (merchantAddressFieldValue instanceof String) { + String merchantAddress = (String) merchantAddressFieldValue; System.out.printf("Merchant Address: %s, confidence: %.2f%n", - merchantAddressFieldValue, merchantAddressField.getConfidence()); + merchantAddress, merchantAddressField.getConfidence()); } } FormField transactionDateField = recognizedFields.get("TransactionDate"); if (transactionDateField != null) { - Object transactionDateFieldValue = transactionDateField.getFieldValue(); + Object transactionDateFieldValue = transactionDateField.getValue(); if (transactionDateFieldValue instanceof LocalDate) { LocalDate transactionDate = (LocalDate) transactionDateFieldValue; System.out.printf("Transaction Date: %s, confidence: %.2f%n", @@ -83,36 +85,37 @@ public static void main(final String[] args) throws IOException { FormField receiptItemsField = recognizedFields.get("Items"); if (receiptItemsField != null) { System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getFieldValue() instanceof List) { - List> receiptItems = (List>) receiptItemsField.getFieldValue(); + if (receiptItemsField.getValue() instanceof List) { + List> receiptItems = (List>) receiptItemsField.getValue(); receiptItems.forEach(receiptItem -> { - if (receiptItem.getFieldValue() instanceof Map) { - ((Map>) receiptItem.getFieldValue()).forEach((key, formField) -> { + if (receiptItem.getValue() instanceof Map) { + ((Map>) receiptItem.getValue()).forEach((key, formField) -> { if ("Name".equals(key)) { - if (formField.getFieldValue() instanceof String) { + if (formField.getValue() instanceof String) { + String name = (String) formField.getValue(); System.out.printf("Name: %s, confidence: %.2fs%n", - formField.getFieldValue(), - formField.getConfidence()); + name, formField.getConfidence()); } } if ("Quantity".equals(key)) { - if (formField.getFieldValue() instanceof Integer) { + if (formField.getValue() instanceof Integer) { + Integer quantity = (Integer) formField.getValue(); System.out.printf("Quantity: %d, confidence: %.2f%n", - formField.getFieldValue(), formField.getConfidence()); + quantity, formField.getConfidence()); } } if ("Price".equals(key)) { - if (formField.getFieldValue() instanceof Float) { + if (formField.getValue() instanceof Float) { + Float price = (Float) formField.getValue(); System.out.printf("Price: %f, confidence: %.2f%n", - formField.getFieldValue(), - formField.getConfidence()); + price, formField.getConfidence()); } } if ("TotalPrice".equals(key)) { - if (formField.getFieldValue() instanceof Float) { + if (formField.getValue() instanceof Float) { + Float totalPrice = (Float) formField.getValue(); System.out.printf("Total Price: %f, confidence: %.2f%n", - formField.getFieldValue(), - formField.getConfidence()); + totalPrice, formField.getConfidence()); } } }); diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrl.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrl.java index 6ce3378e88a0..0aae9d25c46f 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrl.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrl.java @@ -44,25 +44,27 @@ public static void main(final String[] args) { System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); if (merchantNameField != null) { - Object merchantNameFieldValue = recognizedFields.get("MerchantName").getFieldValue(); + Object merchantNameFieldValue = merchantNameField.getValue(); if (merchantNameFieldValue instanceof String) { + String merchantName = (String) merchantNameFieldValue; System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantNameFieldValue, merchantNameField.getConfidence()); + merchantName, merchantNameField.getConfidence()); } } FormField merchantAddressField = recognizedFields.get("MerchantAddress"); if (merchantAddressField != null) { - Object merchantAddressFieldValue = recognizedFields.get("MerchantAddress").getFieldValue(); + Object merchantAddressFieldValue = merchantAddressField.getValue(); if (merchantAddressFieldValue instanceof String) { + String merchantAddress = (String) merchantAddressFieldValue; System.out.printf("Merchant Address: %s, confidence: %.2f%n", - merchantAddressFieldValue, merchantAddressField.getConfidence()); + merchantAddress, merchantAddressField.getConfidence()); } } FormField transactionDateField = recognizedFields.get("TransactionDate"); if (transactionDateField != null) { - Object transactionDateFieldValue = recognizedFields.get("TransactionDate").getFieldValue(); + Object transactionDateFieldValue = transactionDateField.getValue(); if (transactionDateFieldValue instanceof LocalDate) { LocalDate transactionDate = (LocalDate) transactionDateFieldValue; System.out.printf("Transaction Date: %s, confidence: %.2f%n", @@ -73,36 +75,37 @@ public static void main(final String[] args) { FormField receiptItemsField = recognizedFields.get("Items"); if (receiptItemsField != null) { System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getFieldValue() instanceof List) { - List> receiptItems = (List>) receiptItemsField.getFieldValue(); + if (receiptItemsField.getValue() instanceof List) { + List> receiptItems = (List>) receiptItemsField.getValue(); receiptItems.forEach(receiptItem -> { - if (receiptItem.getFieldValue() instanceof Map) { - ((Map>) receiptItem.getFieldValue()).forEach((key, formField) -> { + if (receiptItem.getValue() instanceof Map) { + ((Map>) receiptItem.getValue()).forEach((key, formField) -> { if ("Name".equals(key)) { - if (formField.getFieldValue() instanceof String) { + if (formField.getValue() instanceof String) { + String name = (String) formField.getValue(); System.out.printf("Name: %s, confidence: %.2fs%n", - formField.getFieldValue(), - formField.getConfidence()); + name, formField.getConfidence()); } } if ("Quantity".equals(key)) { - if (formField.getFieldValue() instanceof Integer) { + if (formField.getValue() instanceof Integer) { + Integer quantity = (Integer) formField.getValue(); System.out.printf("Quantity: %d, confidence: %.2f%n", - formField.getFieldValue(), formField.getConfidence()); + quantity, formField.getConfidence()); } } if ("Price".equals(key)) { - if (formField.getFieldValue() instanceof Float) { + if (formField.getValue() instanceof Float) { + Float price = (Float) formField.getValue(); System.out.printf("Price: %f, confidence: %.2f%n", - formField.getFieldValue(), - formField.getConfidence()); + price, formField.getConfidence()); } } if ("TotalPrice".equals(key)) { - if (formField.getFieldValue() instanceof Float) { + if (formField.getValue() instanceof Float) { + Float totalPrice = (Float) formField.getValue(); System.out.printf("Total Price: %f, confidence: %.2f%n", - formField.getFieldValue(), - formField.getConfidence()); + totalPrice, formField.getConfidence()); } } }); diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrlAsync.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrlAsync.java index 5d2795a848e5..f21e94db8fdd 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrlAsync.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrlAsync.java @@ -58,25 +58,27 @@ public static void main(final String[] args) { System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); if (merchantNameField != null) { - Object merchantNameFieldValue = recognizedFields.get("MerchantName").getFieldValue(); + Object merchantNameFieldValue = merchantNameField.getValue(); if (merchantNameFieldValue instanceof String) { + String merchantName = (String) merchantNameFieldValue; System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantNameFieldValue, merchantNameField.getConfidence()); + merchantName, merchantNameField.getConfidence()); } } FormField merchantAddressField = recognizedFields.get("MerchantAddress"); if (merchantAddressField != null) { - Object merchantAddressFieldValue = recognizedFields.get("MerchantAddress").getFieldValue(); + Object merchantAddressFieldValue = merchantAddressField.getValue(); if (merchantAddressFieldValue instanceof String) { + String merchantAddress = (String) merchantAddressFieldValue; System.out.printf("Merchant Address: %s, confidence: %.2f%n", - merchantAddressFieldValue, merchantAddressField.getConfidence()); + merchantAddress, merchantAddressField.getConfidence()); } } FormField transactionDateField = recognizedFields.get("TransactionDate"); if (transactionDateField != null) { - Object transactionDateFieldValue = recognizedFields.get("TransactionDate").getFieldValue(); + Object transactionDateFieldValue = transactionDateField.getValue(); if (transactionDateFieldValue instanceof LocalDate) { LocalDate transactionDate = (LocalDate) transactionDateFieldValue; System.out.printf("Transaction Date: %s, confidence: %.2f%n", @@ -87,43 +89,43 @@ public static void main(final String[] args) { FormField receiptItemsField = recognizedFields.get("Items"); if (receiptItemsField != null) { System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getFieldValue() instanceof List) { - List> receiptItems = (List>) receiptItemsField.getFieldValue(); + if (receiptItemsField.getValue() instanceof List) { + List> receiptItems = (List>) receiptItemsField.getValue(); receiptItems.forEach(receiptItem -> { - if (receiptItem.getFieldValue() instanceof Map) { - ((Map>) receiptItem.getFieldValue()).forEach((key, formField) -> { + if (receiptItem.getValue() instanceof Map) { + ((Map>) receiptItem.getValue()).forEach((key, formField) -> { if ("Name".equals(key)) { - if (formField.getFieldValue() instanceof String) { + if (formField.getValue() instanceof String) { + String name = (String) formField.getValue(); System.out.printf("Name: %s, confidence: %.2fs%n", - formField.getFieldValue(), - formField.getConfidence()); + name, formField.getConfidence()); } } if ("Quantity".equals(key)) { - if (formField.getFieldValue() instanceof Integer) { + if (formField.getValue() instanceof Integer) { + Integer quantity = (Integer) formField.getValue(); System.out.printf("Quantity: %d, confidence: %.2f%n", - formField.getFieldValue(), formField.getConfidence()); + quantity, formField.getConfidence()); } } if ("Price".equals(key)) { - if (formField.getFieldValue() instanceof Float) { + if (formField.getValue() instanceof Float) { + Float price = (Float) formField.getValue(); System.out.printf("Price: %f, confidence: %.2f%n", - formField.getFieldValue(), - formField.getConfidence()); + price, formField.getConfidence()); } } if ("TotalPrice".equals(key)) { - if (formField.getFieldValue() instanceof Float) { + if (formField.getValue() instanceof Float) { + Float totalPrice = (Float) formField.getValue(); System.out.printf("Total Price: %f, confidence: %.2f%n", - formField.getFieldValue(), - formField.getConfidence()); + totalPrice, formField.getConfidence()); } } }); } }); } - System.out.print("-----------------------------------"); } } }); diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/StronglyTypedRecognizedFormUSReceipt.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/StronglyTypedRecognizedFormUSReceipt.java index 68e844f7b721..e095ddfc7945 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/StronglyTypedRecognizedFormUSReceipt.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/StronglyTypedRecognizedFormUSReceipt.java @@ -1,3 +1,5 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. package com.azure.ai.formrecognizer; import com.azure.ai.formrecognizer.models.OperationResult; @@ -11,7 +13,7 @@ * Sample demonstrating converting recognized form fields to strongly typed US receipt field values. * See * - * for information on the strongly typed fields returned by service for recognizing receipts. + * for information on the strongly typed fields returned by service when recognizing receipts. */ public class StronglyTypedRecognizedFormUSReceipt { @@ -37,39 +39,39 @@ public static void main(final String[] args) { for (int i = 0; i < receiptPageResults.size(); i++) { final RecognizedForm recognizedReceipt = receiptPageResults.get(i); - System.out.printf("----------- Recognized Receipt page %s -----------%n", i); + System.out.printf("----------- Recognized Receipt page %d -----------%n", i); // Use extension method to convert the recognized form to strongly typed US receipt fields USReceipt usReceipt = ReceiptExtensions.asUSReceipt(recognizedReceipt); - System.out.printf("Merchant Name: %s, confidence: %.2f%n", usReceipt.getMerchantName().getFieldValue(), + System.out.printf("Merchant Name: %s, confidence: %.2f%n", usReceipt.getMerchantName().getValue(), usReceipt.getMerchantName().getConfidence()); System.out.printf("Merchant Address: %s, confidence: %.2f%n", - usReceipt.getMerchantAddress().getFieldValue(), + usReceipt.getMerchantAddress().getValue(), usReceipt.getMerchantAddress().getConfidence()); System.out.printf("Merchant Phone Number %s, confidence: %.2f%n", - usReceipt.getMerchantPhoneNumber().getFieldValue(), usReceipt.getMerchantPhoneNumber().getConfidence()); - System.out.printf("Total: %s confidence: %.2f%n", usReceipt.getTotal().getFieldValue(), + usReceipt.getMerchantPhoneNumber().getValue(), usReceipt.getMerchantPhoneNumber().getConfidence()); + System.out.printf("Total: %s confidence: %.2f%n", usReceipt.getTotal().getValue(), usReceipt.getTotal().getConfidence()); System.out.printf("Transaction Date: %s, confidence: %.2f%n", - usReceipt.getTransactionDate().getFieldValue(), usReceipt.getTransactionDate().getConfidence()); + usReceipt.getTransactionDate().getValue(), usReceipt.getTransactionDate().getConfidence()); System.out.printf("Transaction Time: %s, confidence: %.2f%n", - usReceipt.getTransactionTime().getFieldValue(), usReceipt.getTransactionTime().getConfidence()); + usReceipt.getTransactionTime().getValue(), usReceipt.getTransactionTime().getConfidence()); System.out.printf("Receipt Items: %n"); usReceipt.getReceiptItems().forEach(receiptItem -> { if (receiptItem.getName() != null) { - System.out.printf("Name: %s, confidence: %.2f%n", receiptItem.getName().getFieldValue(), + System.out.printf("Name: %s, confidence: %.2f%n", receiptItem.getName().getValue(), receiptItem.getName().getConfidence()); } if (receiptItem.getQuantity() != null) { - System.out.printf("Quantity: %s, confidence: %.2f%n", receiptItem.getQuantity().getFieldValue(), + System.out.printf("Quantity: %s, confidence: %.2f%n", receiptItem.getQuantity().getValue(), receiptItem.getQuantity().getConfidence()); } if (receiptItem.getPrice() != null) { - System.out.printf("Price: %s, confidence: %.2f%n", receiptItem.getPrice().getFieldValue(), + System.out.printf("Price: %s, confidence: %.2f%n", receiptItem.getPrice().getValue(), receiptItem.getPrice().getConfidence()); } if (receiptItem.getTotalPrice() != null) { System.out.printf("Total Price: %s, confidence: %.2f%n", - receiptItem.getTotalPrice().getFieldValue(), receiptItem.getTotalPrice().getConfidence()); + receiptItem.getTotalPrice().getValue(), receiptItem.getTotalPrice().getConfidence()); } }); System.out.print("-----------------------------------"); diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTestBase.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTestBase.java index 98af5b45e3f9..6d458491499b 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTestBase.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTestBase.java @@ -265,35 +265,35 @@ private static void validateFieldValueTransforms(FieldValue expectedFieldValue, } switch (expectedFieldValue.getType()) { case NUMBER: - assertEquals(expectedFieldValue.getValueNumber(), actualFormField.getFieldValue()); + assertEquals(expectedFieldValue.getValueNumber(), actualFormField.getValue()); break; case DATE: - assertEquals(expectedFieldValue.getValueDate(), actualFormField.getFieldValue()); + assertEquals(expectedFieldValue.getValueDate(), actualFormField.getValue()); break; case TIME: assertEquals(LocalTime.parse(expectedFieldValue.getValueTime(), - DateTimeFormatter.ofPattern("HH:mm:ss")), actualFormField.getFieldValue()); + DateTimeFormatter.ofPattern("HH:mm:ss")), actualFormField.getValue()); break; case STRING: - assertEquals(expectedFieldValue.getValueString(), actualFormField.getFieldValue()); + assertEquals(expectedFieldValue.getValueString(), actualFormField.getValue()); break; case INTEGER: - assertEquals(expectedFieldValue.getValueInteger(), actualFormField.getFieldValue()); + assertEquals(expectedFieldValue.getValueInteger(), actualFormField.getValue()); break; case PHONE_NUMBER: - assertEquals(expectedFieldValue.getValuePhoneNumber(), actualFormField.getFieldValue()); + assertEquals(expectedFieldValue.getValuePhoneNumber(), actualFormField.getValue()); break; case OBJECT: expectedFieldValue.getValueObject().forEach((key, fieldValue) -> { - FormField actualFormFieldValue = ((Map>) actualFormField.getFieldValue()).get(key); + FormField actualFormFieldValue = ((Map>) actualFormField.getValue()).get(key); validateFieldValueTransforms(fieldValue, actualFormFieldValue, readResults, includeFieldElements); }); break; case ARRAY: - assertEquals(expectedFieldValue.getValueArray().size(), ((List>) actualFormField.getFieldValue()).size()); + assertEquals(expectedFieldValue.getValueArray().size(), ((List>) actualFormField.getValue()).size()); for (int i = 0; i < expectedFieldValue.getValueArray().size(); i++) { FieldValue expectedReceiptItem = expectedFieldValue.getValueArray().get(i); - FormField actualReceiptItem = ((List>) actualFormField.getFieldValue()).get(i); + FormField actualReceiptItem = ((List>) actualFormField.getValue()).get(i); validateFieldValueTransforms(expectedReceiptItem, actualReceiptItem, readResults, includeFieldElements); } break; @@ -751,9 +751,15 @@ static void validateMultiPageDataLabeled(List actualRecognizedFo assertEquals(3, recognizedForm.getPages().size()); recognizedForm.getFields().forEach((label, formField) -> { assertNotNull(formField.getName()); +<<<<<<< HEAD assertNotNull(formField.getFieldValue()); assertNotNull(formField.getValueData().getText()); assertNotNull(formField.getLabelData().getText()); +======= + assertNotNull(formField.getValue()); + assertNotNull(formField.getValueText().getText()); + assertNotNull(formField.getLabelText().getText()); +>>>>>>> 15ade76b8b... update changelog and add casting in samples }); }); } @@ -764,9 +770,15 @@ static void validateMultiPageDataUnlabeled(List actualRecognized assertEquals(1, (long) recognizedForm.getPages().size()); recognizedForm.getFields().forEach((label, formField) -> { assertNotNull(formField.getName()); +<<<<<<< HEAD assertNotNull(formField.getFieldValue()); assertNotNull(formField.getValueData().getText()); assertNotNull(formField.getLabelData().getText()); +======= + assertNotNull(formField.getValue()); + assertNotNull(formField.getValueText().getText()); + assertNotNull(formField.getLabelText().getText()); +>>>>>>> 15ade76b8b... update changelog and add casting in samples }); }); } @@ -781,14 +793,14 @@ static void validateMultipageReceiptData(List recognizedReceipts assertEquals(1, receiptPage1.getFormPageRange().getLastPageNumber()); Map> receiptPage1Fields = receiptPage1.getFields(); assertEquals(EXPECTED_MULTIPAGE_ADDRESS_VALUE, receiptPage1Fields.get("MerchantAddress") - .getFieldValue()); + .getValue()); assertEquals("Bilbo Baggins", receiptPage1Fields.get("MerchantName") - .getFieldValue()); + .getValue()); assertEquals(EXPECTED_MULTIPAGE_PHONE_NUMBER_VALUE, receiptPage1Fields.get("MerchantPhoneNumber") - .getFieldValue()); - assertNotNull(receiptPage1Fields.get("Total").getFieldValue()); + .getValue()); + assertNotNull(receiptPage1Fields.get("Total").getValue()); assertNotNull(receiptPage1.getPages()); - assertEquals(ITEMIZED_RECEIPT_VALUE, receiptPage1Fields.get("ReceiptType").getFieldValue()); + assertEquals(ITEMIZED_RECEIPT_VALUE, receiptPage1Fields.get("ReceiptType").getValue()); // Assert no fields, tables and lines on second page assertEquals(0, receiptPage2.getFields().size()); @@ -803,16 +815,16 @@ static void validateMultipageReceiptData(List recognizedReceipts assertEquals(3, receiptPage3.getFormPageRange().getLastPageNumber()); Map> receiptPage3Fields = receiptPage3.getFields(); assertEquals(EXPECTED_MULTIPAGE_ADDRESS_VALUE, receiptPage3Fields.get("MerchantAddress") - .getFieldValue()); + .getValue()); assertEquals("Frodo Baggins", receiptPage3Fields.get("MerchantName") - .getFieldValue()); + .getValue()); assertEquals(EXPECTED_MULTIPAGE_PHONE_NUMBER_VALUE, receiptPage3Fields.get("MerchantPhoneNumber") - .getFieldValue()); - assertNotNull(receiptPage3Fields.get("Total").getFieldValue()); + .getValue()); + assertNotNull(receiptPage3Fields.get("Total").getValue()); // why isn't tip returned by service? // total value 1000 returned by service but should be 4300, service bug - assertEquals(3000.0f, receiptPage3Fields.get("Subtotal").getFieldValue()); - assertEquals(ITEMIZED_RECEIPT_VALUE, receiptPage3Fields.get("ReceiptType").getFieldValue()); + assertEquals(3000.0f, receiptPage3Fields.get("Subtotal").getValue()); + assertEquals(ITEMIZED_RECEIPT_VALUE, receiptPage3Fields.get("ReceiptType").getValue()); } protected String getEndpoint() { From 907fa784993a8ab58bbd974ca48bebebca93dc33 Mon Sep 17 00:00:00 2001 From: Sameeksha Vaity Date: Wed, 24 Jun 2020 18:23:03 -0700 Subject: [PATCH 3/9] change model names, inner class --- .../azure-ai-formrecognizer/CHANGELOG.md | 4 +- .../azure-ai-formrecognizer/README.md | 21 +- .../ai/formrecognizer/Authentication.java | 4 +- .../com/azure/ai/formrecognizer/Receipt.java | 360 ++++++++++++++++++ .../ai/formrecognizer/ReceiptExtensions.java | 129 ------- .../ai/formrecognizer/RecognizeReceipts.java | 5 +- .../RecognizeReceiptsAsync.java | 5 +- .../RecognizeReceiptsFromUrl.java | 5 +- .../RecognizeReceiptsFromUrlAsync.java | 5 +- ....java => StronglyTypedRecognizedForm.java} | 8 +- .../azure/ai/formrecognizer/USReceipt.java | 209 ---------- .../ai/formrecognizer/USReceiptItem.java | 85 ----- .../ai/formrecognizer/USReceiptType.java | 51 --- 13 files changed, 393 insertions(+), 498 deletions(-) create mode 100644 sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/Receipt.java delete mode 100644 sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReceiptExtensions.java rename sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/{StronglyTypedRecognizedFormUSReceipt.java => StronglyTypedRecognizedForm.java} (91%) delete mode 100644 sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/USReceipt.java delete mode 100644 sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/USReceiptItem.java delete mode 100644 sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/USReceiptType.java diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/CHANGELOG.md b/sdk/formrecognizer/azure-ai-formrecognizer/CHANGELOG.md index b9ddc87d09ed..3cb44caee64f 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/CHANGELOG.md +++ b/sdk/formrecognizer/azure-ai-formrecognizer/CHANGELOG.md @@ -2,7 +2,9 @@ ## 1.0.0-beta.4 (Unreleased) ### Breaking Changes -- `beginRecognizeReceipt` APIs now return a `RecognizedForm` model instead of a `RecognizedReceipt`. +- `beginRecognizeReceipt` APIs now return a `RecognizedForm` model instead of a `RecognizedReceipt`. See +[this](https://github.com/Azure/azure-sdk-for-java/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/StronglyTypedRecognizedFormUSReceipt.java) +suggested approach for extracting information from receipts. - Methods returning `textContent` have been renamed to `fieldElements` on `FieldData` and `FormTableCell` - Renamed `FormContent` to `FormElement` - Renamed `FieldText` to `FieldData` diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/README.md b/sdk/formrecognizer/azure-ai-formrecognizer/README.md index def206bec470..91c71b077d8d 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/README.md +++ b/sdk/formrecognizer/azure-ai-formrecognizer/README.md @@ -99,10 +99,6 @@ FormTrainingClient formTrainingClient = new FormTrainingClientBuilder() The Azure Form Recognizer client library provides a way to **rotate the existing key**. -<<<<<<< HEAD -======= ->>>>>>> 66b3ab9031... receipt design update ->>>>>>> 407953ed61... receipt design update ```java AzureKeyCredential credential = new AzureKeyCredential("{key}"); FormRecognizerClient formRecognizerClient = new FormRecognizerClientBuilder() @@ -199,11 +195,7 @@ The following section provides several code snippets covering some of the most c ### Recognize Forms Using a Custom Model Recognize name/value pairs and table data from forms. These models are trained with your own data, so they're tailored to your forms. You should only recognize forms of the same form type that the custom model was trained on. -<<<<<<< HEAD -======= - ->>>>>>> 407953ed61... receipt design update ```java String formUrl = "{form_url}"; String modelId = "{custom_trained_model_id}"; @@ -227,11 +219,7 @@ for (int i = 0; i < recognizedForms.size(); i++) { ### Recognize Content Recognize text and table structures, along with their bounding box coordinates, from documents. -<<<<<<< HEAD -======= - ->>>>>>> 407953ed61... receipt design update ```java // recognize form content using file input stream File form = new File("local/file_path/filename.png"); @@ -261,10 +249,16 @@ for (int i = 0; i < contentPageResults.size(); i++) { ### Recognize receipts Recognize data from a USA sales receipts using a prebuilt model. [Here][service_recognize_receipt] are the fields the +<<<<<<< HEAD service returns for a recognized receipt. <<<<<<< HEAD ======= +======= +service returns for a recognized receipt. See [StronglyTypedRecognizedForm.java][strongly_typed_sample] for a suggested approach to extract +information from receipts. + +>>>>>>> f513bd8c12... change model names, inner class >>>>>>> 407953ed61... receipt design update ```java @@ -529,7 +523,8 @@ This project has adopted the [Microsoft Open Source Code of Conduct][coc]. For m [service_access]: https://docs.microsoft.com/azure/cognitive-services/cognitive-services-apis-create-account?tabs=multiservice%2Cwindows [service_doc_train_unlabeled]: https://docs.microsoft.com/azure/cognitive-services/form-recognizer/overview#train-without-labels [service_doc_train_labeled]: https://docs.microsoft.com/azure/cognitive-services/form-recognizer/overview#train-with-labels -[service_recognize_receipt]: https://westus2.dev.cognitive.microsoft.com/docs/services/form-recognizer-api-v2-preview/operations/GetAnalyzeReceiptResult +[service_recognize_receipt]: https://aka.ms/azsdk/python/formrecognizer/receiptfields +[strongly_typed_sample]: https://github.com/Azure/azure-sdk-for-java/blob/master/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/StronglyTypedRecognizedForm.java [source_code]: src [quickstart_training]: https://docs.microsoft.com/azure/cognitive-services/form-recognizer/quickstarts/curl-train-extract#train-a-form-recognizer-model [wiki_identity]: https://github.com/Azure/azure-sdk-for-java/wiki/Identity-and-Authentication diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/Authentication.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/Authentication.java index 098ed8121ae9..e07da26320ec 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/Authentication.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/Authentication.java @@ -121,9 +121,9 @@ private static void beginRecognizeCustomFormsFromUrl(FormRecognizerClient formRe ((Map>) receiptItem.getValue()).forEach((key, formField) -> { if ("Name".equals(key)) { if (formField.getValue() instanceof String) { - String Name = (String) formField.getValue(); + String name = (String) formField.getValue(); System.out.printf("Name: %s, confidence: %.2fs%n", - Name, formField.getConfidence()); + name, formField.getConfidence()); } } if ("Quantity".equals(key)) { diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/Receipt.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/Receipt.java new file mode 100644 index 000000000000..f174d8f2ff62 --- /dev/null +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/Receipt.java @@ -0,0 +1,360 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.formrecognizer; + +import com.azure.ai.formrecognizer.models.FormField; +import com.azure.ai.formrecognizer.models.RecognizedForm; +import com.azure.core.annotation.Immutable; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +/** + * The Receipt model. + */ +public final class Receipt { + + /** + * List of recognized field items. + */ + private List receiptItems; + + /** + * Recognized receipt type information. + */ + private ReceiptType receiptType; + + /** + * Recognized field merchant name. + */ + private FormField merchantName; + + /** + * Recognized field merchant address. + */ + private FormField merchantAddress; + + /** + * Recognized field merchant phone number. + */ + private FormField merchantPhoneNumber; + + /** + * Recognized field subtotal. + */ + private FormField subtotal; + + /** + * Recognized field tax. + */ + private FormField tax; + + /** + * Recognized field tip. + */ + private FormField tip; + + /** + * Recognized field total. + */ + private FormField total; + + /** + * Recognized field transaction date. + */ + private FormField transactionDate; + + /** + * Recognized field transaction time. + */ + private FormField transactionTime; + + @SuppressWarnings("unchecked") + public Receipt(RecognizedForm recognizedForm) { + for (Map.Entry> entry : recognizedForm.getFields().entrySet()) { + String key = entry.getKey(); + FormField fieldValue = entry.getValue(); + switch (key) { + case "ReceiptType": + receiptType = new ReceiptType(((FormField) fieldValue).getValue(), + fieldValue.getConfidence()); + break; + case "MerchantName": + merchantName = (FormField) fieldValue; + break; + case "MerchantAddress": + merchantAddress = (FormField) fieldValue; + break; + case "MerchantPhoneNumber": + merchantPhoneNumber = (FormField) fieldValue; + break; + case "Subtotal": + subtotal = (FormField) fieldValue; + break; + case "Tax": + tax = (FormField) fieldValue; + break; + case "Tip": + tip = (FormField) fieldValue; + break; + case "Total": + total = (FormField) fieldValue; + break; + case "TransactionDate": + transactionDate = (FormField) fieldValue; + break; + case "TransactionTime": + transactionTime = (FormField) fieldValue; + break; + case "Items": + receiptItems = Collections.unmodifiableList(toReceiptItems(fieldValue)); + break; + default: + break; + } + } + } + + /** + * Get the itemized fields in the Recognized Receipt. + * + * @return the unmodifiable list of itemized fields on the receipt. + */ + public List getReceiptItems() { + return this.receiptItems; + } + + /** + * Get the type of Recognized Receipt. + * + * @return the type of Recognized Receipt. + */ + public ReceiptType getReceiptType() { + return this.receiptType; + } + + /** + * Get the merchant name field. + * + * @return the merchantName value. + */ + public FormField getMerchantName() { + return this.merchantName; + } + + /** + * Get the merchant address field. + * + * @return the merchantAddress value. + */ + public FormField getMerchantAddress() { + return this.merchantAddress; + } + + /** + * Get the merchant Phone number field. + * + * @return the merchantPhoneNumber value. + */ + public FormField getMerchantPhoneNumber() { + return this.merchantPhoneNumber; + } + + /** + * Get the subtotal field. + * + * @return the subtotal value. + */ + public FormField getSubtotal() { + return this.subtotal; + } + + /** + * Get the tax field. + * + * @return the tax value. + */ + public FormField getTax() { + return this.tax; + } + + /** + * Get the tip field. + * + * @return the tip value. + */ + public FormField getTip() { + return this.tip; + } + + /** + * Get the Total field. + * + * @return the total value. + */ + public FormField getTotal() { + return this.total; + } + + /** + * Get the Transaction date field. + * + * @return the transactionDate value. + */ + public FormField getTransactionDate() { + return this.transactionDate; + } + + /** + * Get the transaction time field. + * + * @return the transactionTime value. + */ + public FormField getTransactionTime() { + return this.transactionTime; + } + + /** + * Helper method to convert the service level + * {@link com.azure.ai.formrecognizer.implementation.models.FieldValue#getValueArray() value items} + * to SDK level {@link ReceiptItem receipt items}. + * + * @param fieldValueItems The strongly typed field values. + * b + * + * @return An unmodifiable list of {@link ReceiptItem}. + */ + @SuppressWarnings("unchecked") + private static List toReceiptItems(FormField fieldValueItems) { + List> fieldValueArray = (List>) fieldValueItems.getValue(); + List receiptItemList = new ArrayList<>(); + + for (FormField eachFieldValue : fieldValueArray) { + Map> objectValue = ((Map>) (eachFieldValue.getValue())); + FormField name = null; + FormField quantity = null; + FormField price = null; + FormField totalPrice = null; + for (Map.Entry> entry : objectValue.entrySet()) { + String key = entry.getKey(); + if ("Quantity".equals(key)) { + quantity = (FormField) entry.getValue(); + } else if ("Name".equals(key)) { + name = (FormField) entry.getValue(); + } else if ("Price".equals(key)) { + price = (FormField) entry.getValue(); + } else if ("Total Price".equals(key)) { + totalPrice = (FormField) entry.getValue(); + } + } + receiptItemList.add(new ReceiptItem(name, quantity, price, totalPrice)); + } + return Collections.unmodifiableList(receiptItemList); + } + + /** + * The USReceiptType model. + */ + @Immutable + public static final class ReceiptType { + private final String type; + private final float confidence; + + /** + * Constructs a Receipt Type. + * + * @param type The type of the receipt. + * @param confidence The confidence score. + */ + public ReceiptType(final String type, final float confidence) { + this.type = type; + this.confidence = confidence; + } + + /** + * Gets the type of the receipt. + * + * @return The type of the receipt. + */ + public String getType() { + return this.type; + } + + /** + * Gets the confidence score of the detected type of the receipt. + * + * @return The confidence score of the detected type of the receipt. + */ + public float getConfidence() { + return this.confidence; + } + } + + /** + * The ReceiptItem model. + */ + @Immutable + public static final class ReceiptItem { + private final FormField name; + private final FormField quantity; + private final FormField price; + private final FormField totalPrice; + + /** + * Constructs a ReceiptItem object. + * + * @param name Name of the field value. + * @param quantity quantity of the field value. + * @param price price of the field value. + * @param totalPrice Total price of the field value. + */ + public ReceiptItem(final FormField name, final FormField quantity, final FormField price, + final FormField totalPrice) { + this.name = name; + this.quantity = quantity; + this.price = price; + this.totalPrice = totalPrice; + } + + /** + * Gets the name of the field value. + * + * @return The name of the field value. + */ + public FormField getName() { + return name; + } + + /** + * Gets the quantity of the Receipt Item. + * + * @return the quantity of Receipt Item. + */ + public FormField getQuantity() { + return quantity; + } + + /** + * Gets the price of the Receipt Item. + * + * @return The total Price. + */ + public FormField getPrice() { + return price; + } + + /** + * Gets the total price of the Receipt Item. + * + * @return The total Price. + */ + public FormField getTotalPrice() { + return totalPrice; + } + } +} diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReceiptExtensions.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReceiptExtensions.java deleted file mode 100644 index e96a2b12fd09..000000000000 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReceiptExtensions.java +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.ai.formrecognizer; - -import com.azure.ai.formrecognizer.models.FormField; -import com.azure.ai.formrecognizer.models.RecognizedForm; - -import java.time.LocalDate; -import java.time.LocalTime; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -/** - * The ReceiptExtensions class to allow users to convert a {@link RecognizedForm} - * to a US Receipt type. - */ -public final class ReceiptExtensions { - - private ReceiptExtensions() { - } - - /** - * Static method to convert an incoming recognized form to a {@link USReceipt type}. - * - * @param recognizedForm The {@link RecognizedForm recognized receipt}. - * - * @return The converted {@link USReceipt US locale receipt} type. - */ - @SuppressWarnings("unchecked") - public static USReceipt asUSReceipt(RecognizedForm recognizedForm) { - USReceiptType receiptType = null; - FormField merchantName = null; - FormField merchantAddress = null; - FormField merchantPhoneNumber = null; - FormField subtotal = null; - FormField tax = null; - FormField tip = null; - FormField total = null; - FormField transactionDate = null; - FormField transactionTime = null; - List receiptItems = null; - - for (Map.Entry> entry : recognizedForm.getFields().entrySet()) { - String key = entry.getKey(); - FormField fieldValue = entry.getValue(); - switch (key) { - case "ReceiptType": - receiptType = new USReceiptType(((FormField) fieldValue).getValue(), - fieldValue.getConfidence()); - break; - case "MerchantName": - merchantName = (FormField) fieldValue; - break; - case "MerchantAddress": - merchantAddress = (FormField) fieldValue; - break; - case "MerchantPhoneNumber": - merchantPhoneNumber = (FormField) fieldValue; - break; - case "Subtotal": - subtotal = (FormField) fieldValue; - break; - case "Tax": - tax = (FormField) fieldValue; - break; - case "Tip": - tip = (FormField) fieldValue; - break; - case "Total": - total = (FormField) fieldValue; - break; - case "TransactionDate": - transactionDate = (FormField) fieldValue; - break; - case "TransactionTime": - transactionTime = (FormField) fieldValue; - break; - case "Items": - receiptItems = toReceiptItems(fieldValue); - break; - default: - break; - } - } - return new USReceipt(receiptItems, receiptType, - merchantName, merchantAddress, merchantPhoneNumber, subtotal, tax, tip, total, transactionDate, - transactionTime); - } - - /** - * Helper method to convert the service level - * {@link com.azure.ai.formrecognizer.implementation.models.FieldValue#getValueArray() value items} - * to SDK level {@link USReceiptItem receipt items}. - * - * @param fieldValueItems The strongly typed field values. - * - * @return An unmodifiable list of {@link USReceiptItem}. - */ - @SuppressWarnings("unchecked") - private static List toReceiptItems(FormField fieldValueItems) { - List> fieldValueArray = (List>) fieldValueItems.getValue(); - List receiptItemList = new ArrayList<>(); - - for (FormField eachFieldValue : fieldValueArray) { - Map> objectValue = ((Map>) (eachFieldValue.getValue())); - FormField name = null; - FormField quantity = null; - FormField price = null; - FormField totalPrice = null; - for (Map.Entry> entry : objectValue.entrySet()) { - String key = entry.getKey(); - if ("Quantity".equals(key)) { - quantity = (FormField) entry.getValue(); - } else if ("Name".equals(key)) { - name = (FormField) entry.getValue(); - } else if ("Price".equals(key)) { - price = (FormField) entry.getValue(); - } else if ("Total Price".equals(key)) { - totalPrice = (FormField) entry.getValue(); - } - } - receiptItemList.add(new USReceiptItem(name, quantity, price, totalPrice)); - } - return Collections.unmodifiableList(receiptItemList); - } -} diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceipts.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceipts.java index 0477c59ad921..6e3ec66e527c 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceipts.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceipts.java @@ -19,7 +19,10 @@ import java.util.Map; /** - * Sample for recognizing US receipt information using file source URL. + * Sample for recognizing commonly found US receipt fields from a local file input stream. + * For a suggested approach to extracting information from receipts, see StronglyTypedRecognizedForm.java. + * See fields found on a receipt here: + * https://aka.ms/azsdk/python/formrecognizer/receiptfields */ public class RecognizeReceipts { diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsAsync.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsAsync.java index 021a06149c9b..5d6cba54a629 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsAsync.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsAsync.java @@ -24,7 +24,10 @@ import static com.azure.ai.formrecognizer.implementation.Utility.toFluxByteBuffer; /** - * Async sample for recognizing US receipt information from a local file. + * Async sample for recognizing commonly found US receipt fields from a local file input stream. + * For a suggested approach to extracting information from receipts, see StronglyTypedRecognizedForm.java. + * See fields found on a receipt here: + * https://aka.ms/azsdk/python/formrecognizer/receiptfields */ public class RecognizeReceiptsAsync { diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrl.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrl.java index 0aae9d25c46f..2ab5efec5f21 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrl.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrl.java @@ -14,7 +14,10 @@ import java.util.Map; /** - * Sample for recognizing US receipt information using file source URL. + * Sample for recognizing commonly found US receipt fields from a file source URL. For a suggested approach to + * extracting information from receipts, see StronglyTypedRecognizedForm.java. + * See fields found on a receipt here: + * https://aka.ms/azsdk/python/formrecognizer/receiptfields */ public class RecognizeReceiptsFromUrl { diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrlAsync.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrlAsync.java index f21e94db8fdd..2f76fb83dfaa 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrlAsync.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrlAsync.java @@ -16,7 +16,10 @@ import java.util.concurrent.TimeUnit; /** - * Async sample for recognizing US receipt information using file source URL. + * Async sample for recognizing commonly found US receipt fields from a file source URL. For a suggested approach to + * extracting information from receipts, see StronglyTypedRecognizedForm.java. + * See fields found on a receipt here: + * https://aka.ms/azsdk/python/formrecognizer/receiptfields */ public class RecognizeReceiptsFromUrlAsync { diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/StronglyTypedRecognizedFormUSReceipt.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/StronglyTypedRecognizedForm.java similarity index 91% rename from sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/StronglyTypedRecognizedFormUSReceipt.java rename to sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/StronglyTypedRecognizedForm.java index e095ddfc7945..0cd13c96f56e 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/StronglyTypedRecognizedFormUSReceipt.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/StronglyTypedRecognizedForm.java @@ -12,10 +12,10 @@ /** * Sample demonstrating converting recognized form fields to strongly typed US receipt field values. * See - * + * * for information on the strongly typed fields returned by service when recognizing receipts. */ -public class StronglyTypedRecognizedFormUSReceipt { +public class StronglyTypedRecognizedForm { /** * Main method to invoke this demo. @@ -40,8 +40,8 @@ public static void main(final String[] args) { for (int i = 0; i < receiptPageResults.size(); i++) { final RecognizedForm recognizedReceipt = receiptPageResults.get(i); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); - // Use extension method to convert the recognized form to strongly typed US receipt fields - USReceipt usReceipt = ReceiptExtensions.asUSReceipt(recognizedReceipt); + // Use Receipt model transform the recognized form to strongly typed US receipt fields + Receipt usReceipt = new Receipt(recognizedReceipt); System.out.printf("Merchant Name: %s, confidence: %.2f%n", usReceipt.getMerchantName().getValue(), usReceipt.getMerchantName().getConfidence()); System.out.printf("Merchant Address: %s, confidence: %.2f%n", diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/USReceipt.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/USReceipt.java deleted file mode 100644 index ba91b8931630..000000000000 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/USReceipt.java +++ /dev/null @@ -1,209 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.ai.formrecognizer; - -import com.azure.ai.formrecognizer.models.FormField; -import com.azure.core.annotation.Immutable; - -import java.time.LocalDate; -import java.time.LocalTime; -import java.util.Collections; -import java.util.List; - -/** - * The USReceipt model. - */ -@Immutable -public final class USReceipt { - - /** - * List of recognized field items. - */ - private final List receiptItems; - - /** - * Recognized receipt type information. - */ - private final USReceiptType receiptType; - - /** - * Recognized field merchant name. - */ - private final FormField merchantName; - - /** - * Recognized field merchant address. - */ - private final FormField merchantAddress; - - /** - * Recognized field merchant phone number. - */ - private final FormField merchantPhoneNumber; - - /** - * Recognized field subtotal. - */ - private final FormField subtotal; - - /** - * Recognized field tax. - */ - private final FormField tax; - - /** - * Recognized field tip. - */ - private final FormField tip; - - /** - * Recognized field total. - */ - private final FormField total; - - /** - * Recognized field transaction date. - */ - private final FormField transactionDate; - - /** - * Recognized field transaction time. - */ - private final FormField transactionTime; - - /** - * Constructs a USReceipt object. - * - * @param receiptItems List of recognized field items. - * @param receiptType Recognized receipt type information. - * @param merchantName Recognized field merchant name. - * @param merchantAddress Recognized field merchant address. - * @param merchantPhoneNumber Recognized field merchant phone number. - * @param subtotal Recognized field subtotal. - * @param tax Recognized field tax. - * @param tip Recognized field tip. - * @param total Recognized field total. - * @param transactionDate Recognized field transaction date. - * @param transactionTime Recognized field transaction time. - */ - public USReceipt(final List receiptItems, - final USReceiptType receiptType, final FormField merchantName, - final FormField merchantAddress, - final FormField merchantPhoneNumber, final FormField subtotal, - final FormField tax, - final FormField tip, final FormField total, - final FormField transactionDate, - final FormField transactionTime) { - this.receiptItems = Collections.unmodifiableList(receiptItems); - this.receiptType = receiptType; - this.merchantName = merchantName; - this.merchantAddress = merchantAddress; - this.merchantPhoneNumber = merchantPhoneNumber; - this.subtotal = subtotal; - this.tax = tax; - this.tip = tip; - this.total = total; - this.transactionDate = transactionDate; - this.transactionTime = transactionTime; - } - - /** - * Get the itemized fields in the Recognized Receipt. - * - * @return the unmodifiable list of itemized fields on the receipt. - */ - public List getReceiptItems() { - return this.receiptItems; - } - - /** - * Get the type of Recognized Receipt. - * - * @return the type of Recognized Receipt. - */ - public USReceiptType getReceiptType() { - return this.receiptType; - } - - /** - * Get the merchant name field. - * - * @return the merchantName value. - */ - public FormField getMerchantName() { - return this.merchantName; - } - - /** - * Get the merchant address field. - * - * @return the merchantAddress value. - */ - public FormField getMerchantAddress() { - return this.merchantAddress; - } - - /** - * Get the merchant Phone number field. - * - * @return the merchantPhoneNumber value. - */ - public FormField getMerchantPhoneNumber() { - return this.merchantPhoneNumber; - } - - /** - * Get the subtotal field. - * - * @return the subtotal value. - */ - public FormField getSubtotal() { - return this.subtotal; - } - - /** - * Get the tax field. - * - * @return the tax value. - */ - public FormField getTax() { - return this.tax; - } - - /** - * Get the tip field. - * - * @return the tip value. - */ - public FormField getTip() { - return this.tip; - } - - /** - * Get the Total field. - * - * @return the total value. - */ - public FormField getTotal() { - return this.total; - } - - /** - * Get the Transaction date field. - * - * @return the transactionDate value. - */ - public FormField getTransactionDate() { - return this.transactionDate; - } - - /** - * Get the transaction time field. - * - * @return the transactionTime value. - */ - public FormField getTransactionTime() { - return this.transactionTime; - } -} diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/USReceiptItem.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/USReceiptItem.java deleted file mode 100644 index 371a7aa143e1..000000000000 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/USReceiptItem.java +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.ai.formrecognizer; - -import com.azure.ai.formrecognizer.models.FormField; -import com.azure.core.annotation.Immutable; - -/** - * The USReceiptItem model. - */ -@Immutable -public final class USReceiptItem { - - /* - * Name of the field value. - */ - private final FormField name; - - /* - * Quantity of the field value. - */ - private final FormField quantity; - - /* - * Price of the field value. - */ - private final FormField price; - - /* - * Total price of the field value. - */ - private final FormField totalPrice; - - /** - * Constructs a USReceiptItem object. - * @param name Name of the field value. - * @param quantity quantity of the field value. - * @param price price of the field value. - * @param totalPrice Total price of the field value. - */ - public USReceiptItem(final FormField name, final FormField quantity, final FormField price, - final FormField totalPrice) { - this.name = name; - this.quantity = quantity; - this.price = price; - this.totalPrice = totalPrice; - } - - /** - * Gets the name of the field value. - * - * @return The name of the field value. - */ - public FormField getName() { - return name; - } - - /** - * Gets the quantity of the Receipt Item. - * - * @return the quantity of Receipt Item. - */ - public FormField getQuantity() { - return quantity; - } - - /** - * Gets the price of the Receipt Item. - * - * @return The total Price. - */ - public FormField getPrice() { - return price; - } - - /** - * Gets the total price of the Receipt Item. - * - * @return The total Price. - */ - public FormField getTotalPrice() { - return totalPrice; - } -} diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/USReceiptType.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/USReceiptType.java deleted file mode 100644 index d1a65c211cf9..000000000000 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/USReceiptType.java +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.azure.ai.formrecognizer; - -import com.azure.core.annotation.Immutable; - -/** - * The USReceiptType model. - */ -@Immutable -public final class USReceiptType { - - /* - * The type of the receipt. - */ - private final String type; - - /* - * Confidence score. - */ - private final float confidence; - - /** - * Constructs a Receipt Type. - * @param type The type of the receipt. - * @param confidence The confidence score. - */ - public USReceiptType(final String type, final float confidence) { - this.type = type; - this.confidence = confidence; - } - - /** - * Gets the type of the receipt. - * - * @return The type of the receipt. - */ - public String getType() { - return this.type; - } - - /** - * Gets the confidence score of the detected type of the receipt. - * - * @return The confidence score of the detected type of the receipt. - */ - public float getConfidence() { - return this.confidence; - } -} From 0d391aa411f2efccc68d7b2fc8fc258ae9e29b52 Mon Sep 17 00:00:00 2001 From: Sameeksha Vaity Date: Tue, 30 Jun 2020 13:13:08 -0700 Subject: [PATCH 4/9] add enum casting --- .../azure-ai-formrecognizer/README.md | 98 ++++----- .../azure/ai/formrecognizer/Transforms.java | 23 +- .../formrecognizer/models/FieldValueType.java | 147 +++++++++++++ .../ai/formrecognizer/models/FormField.java | 20 +- .../ai/formrecognizer/Authentication.java | 54 +++-- ...ognizerAsyncClientJavaDocCodeSnippets.java | 188 +++++++++++------ ...rmRecognizerClientJavaDocCodeSnippets.java | 196 +++++++++++------- .../ai/formrecognizer/ReadmeSamples.java | 73 ++++--- .../ai/formrecognizer/RecognizeReceipts.java | 52 +++-- .../RecognizeReceiptsAsync.java | 127 ++++++------ .../RecognizeReceiptsFromUrl.java | 53 +++-- .../RecognizeReceiptsFromUrlAsync.java | 55 +++-- .../FormRecognizerClientTestBase.java | 15 +- 13 files changed, 704 insertions(+), 397 deletions(-) create mode 100644 sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValueType.java diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/README.md b/sdk/formrecognizer/azure-ai-formrecognizer/README.md index 91c71b077d8d..c3d4f7994a17 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/README.md +++ b/sdk/formrecognizer/azure-ai-formrecognizer/README.md @@ -248,19 +248,10 @@ for (int i = 0; i < contentPageResults.size(); i++) { ``` ### Recognize receipts -Recognize data from a USA sales receipts using a prebuilt model. [Here][service_recognize_receipt] are the fields the -<<<<<<< HEAD -service returns for a recognized receipt. -<<<<<<< HEAD - -======= -======= -service returns for a recognized receipt. See [StronglyTypedRecognizedForm.java][strongly_typed_sample] for a suggested approach to extract +Recognize data from a USA sales receipts using a prebuilt model. [Here][service_recognize_receipt] are the fields the service returns for a recognized receipt. See [StronglyTypedRecognizedForm.java][strongly_typed_sample] for a suggested approach to extract information from receipts. ->>>>>>> f513bd8c12... change model names, inner class ->>>>>>> 407953ed61... receipt design update ```java String receiptUrl = "https://docs.microsoft.com/en-us/azure/cognitive-services/form-recognizer/media" + "/contoso-allinone.jpg"; @@ -273,41 +264,52 @@ for (int i = 0; i < receiptPageResults.size(); i++) { Map> recognizedFields = recognizedReceipt.getFields(); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); - if (merchantNameField.getValue() instanceof String) { - String merchantName = (String) merchantNameField.getValue(); - System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantName, merchantNameField.getConfidence()); + if (merchantNameField != null) { + if (FieldValueType.STRING.equals(merchantNameField.getValueType())) { + String merchantName = FieldValueType.STRING.cast(merchantNameField); + System.out.printf("Merchant Name: %s, confidence: %.2f%n", + merchantName, merchantNameField.getConfidence()); + } } + + FormField merchantPhoneNumberField = recognizedFields.get("MerchantPhoneNumber"); + if (merchantPhoneNumberField != null) { + if (FieldValueType.PHONE_NUMBER.equals(merchantNameField.getValueType())) { + String merchantAddress = FieldValueType.PHONE_NUMBER.cast(merchantPhoneNumberField); + System.out.printf("Merchant Phone number: %s, confidence: %.2f%n", + merchantAddress, merchantPhoneNumberField.getConfidence()); + } + } + FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField.getValue() instanceof LocalDate) { - LocalDate transactionDate = (LocalDate) transactionDateField.getValue(); - System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDate, transactionDateField.getConfidence()); + if (transactionDateField != null) { + if (FieldValueType.DATE.equals(transactionDateField.getValueType())) { + LocalDate transactionDate = FieldValueType.DATE.cast(transactionDateField); + System.out.printf("Transaction Date: %s, confidence: %.2f%n", + transactionDate, transactionDateField.getConfidence()); + } } + FormField receiptItemsField = recognizedFields.get("Items"); - System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getValue() instanceof List) { - List> receiptItems = (List>) receiptItemsField.getValue(); - receiptItems.forEach(receiptItem -> { - if (receiptItem.getValue() instanceof Map) { - ((Map>) receiptItem.getValue()).forEach((key, formField) -> { - if ("Name".equals(key)) { - if (formField.getValue() instanceof String) { - String name = (String) formField.getValue(); - System.out.printf("Name: %s, confidence: %.2fs%n", - name, formField.getConfidence()); - } - } - if ("Quantity".equals(key)) { - if (formField.getValue() instanceof Integer) { - Integer quantity = (Integer) formField.getValue(); - System.out.printf("Quantity: %d, confidence: %.2f%n", - quantity, formField.getConfidence()); + if (receiptItemsField != null) { + System.out.printf("Receipt Items: %n"); + if (FieldValueType.LIST.equals(receiptItemsField.getValueType())) { + List> receiptItems = FieldValueType.LIST.cast(receiptItemsField); + receiptItems.forEach(receiptItem -> { + if (FieldValueType.MAP.equals(receiptItem.getValueType())) { + Map> formFieldMap = FieldValueType.MAP.cast(receiptItem); + formFieldMap.forEach((key, formField) -> { + if ("Quantity".equals(key)) { + if (FieldValueType.FLOAT.equals(formField.getValueType())) { + Float quantity = FieldValueType.FLOAT.cast(formField); + System.out.printf("Quantity: %d, confidence: %.2f%n", + quantity, formField.getConfidence()); + } } - } - }); - } - }); + }); + } + }); + } } } ``` @@ -316,11 +318,7 @@ for (int i = 0; i < receiptPageResults.size(); i++) { Train a machine-learned model on your own form type. The resulting model will be able to recognize values from the types of forms it was trained on. Provide a container SAS url to your Azure Storage Blob container where you're storing the training documents. See details on setting this up in the [service quickstart documentation][quickstart_training]. -<<<<<<< HEAD -======= - ->>>>>>> 407953ed61... receipt design update ```java String trainingFilesUrl = "{SAS-URL-of-your-container-in-blob-storage}"; SyncPoller trainingPoller = @@ -347,11 +345,7 @@ customFormModel.getSubmodels().forEach(customFormSubmodel -> { ### Manage your models Manage the custom models attached to your account. -<<<<<<< HEAD -======= - ->>>>>>> 407953ed61... receipt design update ```java AtomicReference modelId = new AtomicReference<>(); // First, we see how many custom models we have, and what our limit is @@ -393,11 +387,7 @@ to provide an invalid file source URL an `HttpResponseException` would be raised In the following code snippet, the error is handled gracefully by catching the exception and display the additional information about the error. -<<<<<<< HEAD -======= - ->>>>>>> 407953ed61... receipt design update ```java try { formRecognizerClient.beginRecognizeContentFromUrl("invalidSourceUrl"); @@ -435,11 +425,7 @@ These code samples show common scenario operations with the Azure Form Recognize #### Async APIs All the examples shown so far have been using synchronous APIs, but we provide full support for async APIs as well. You'll need to use `FormRecognizerAsyncClient` -<<<<<<< HEAD -======= - ->>>>>>> 407953ed61... receipt design update ```java FormRecognizerAsyncClient formRecognizerAsyncClient = new FormRecognizerClientBuilder() .credential(new AzureKeyCredential("{key}")) diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/Transforms.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/Transforms.java index 55f7d5e8e21b..2d85708db24b 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/Transforms.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/Transforms.java @@ -14,6 +14,7 @@ import com.azure.ai.formrecognizer.models.BoundingBox; import com.azure.ai.formrecognizer.models.FieldData; import com.azure.ai.formrecognizer.models.FieldText; +import com.azure.ai.formrecognizer.models.FieldValueType; import com.azure.ai.formrecognizer.models.FormContent; import com.azure.ai.formrecognizer.models.FormElement; import com.azure.ai.formrecognizer.models.FormField; @@ -219,7 +220,7 @@ private static Map> getUnlabeledFieldMap(DocumentResult doc } else { FieldText labelText = new FieldText(key, null, null, null); extractedFieldMap.put(key, new FormField<>(DEFAULT_CONFIDENCE_VALUE, labelText, - key, null, null)); + key, null, null, null)); } }); } @@ -245,38 +246,38 @@ private static FormField setFormField(FieldText labelText, String key, FieldV switch (fieldValue.getType()) { case PHONE_NUMBER: value = new FormField<>(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText, - key, fieldValue.getValuePhoneNumber(), valueText); + key, fieldValue.getValuePhoneNumber(), valueText, FieldValueType.PHONE_NUMBER); break; case STRING: value = new FormField<>(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText, - key, fieldValue.getValueString(), valueText); + key, fieldValue.getValueString(), valueText, FieldValueType.STRING); break; case TIME: LocalTime fieldTime = fieldValue.getValueTime() == null ? null : LocalTime .parse(fieldValue.getValueTime(), DateTimeFormatter.ofPattern("HH:mm:ss")); value = new FormField<>(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText, - key, fieldTime, valueText); + key, fieldTime, valueText, FieldValueType.TIME); break; case DATE: value = new FormField<>(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText, - key, fieldValue.getValueDate(), valueText); + key, fieldValue.getValueDate(), valueText, FieldValueType.DATE); break; case INTEGER: value = new FormField<>(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText, - key, fieldValue.getValueInteger(), valueText); + key, fieldValue.getValueInteger(), valueText, FieldValueType.INTEGER); break; case NUMBER: value = new FormField<>(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText, - key, fieldValue.getValueNumber(), valueText); + key, fieldValue.getValueNumber(), valueText, FieldValueType.FLOAT); break; case ARRAY: value = new FormField<>(setDefaultConfidenceValue(fieldValue.getConfidence()), null, key, - toFormFieldArray(fieldValue.getValueArray(), readResults), null); + toFormFieldArray(fieldValue.getValueArray(), readResults), null, FieldValueType.LIST); break; case OBJECT: value = new FormField<>(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText, - key, toFormFieldObject(fieldValue.getValueObject(), pageNumber, readResults), valueText - ); + key, toFormFieldObject(fieldValue.getValueObject(), pageNumber, readResults), valueText, + FieldValueType.MAP); break; default: throw LOGGER.logExceptionAsError(new RuntimeException("FieldValue Type not supported")); @@ -385,7 +386,7 @@ private static Map> getLabeledFieldMap(boolean includeField String fieldName = "field-" + index; FormField formField = new FormField<>(setDefaultConfidenceValue(keyValuePair.getConfidence()), - labelFieldText, fieldName, keyValuePair.getValue().getText(), valueText); + labelFieldText, fieldName, keyValuePair.getValue().getText(), valueText, FieldValueType.STRING); formFieldMap.put(fieldName, formField); })); return formFieldMap; diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValueType.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValueType.java new file mode 100644 index 000000000000..f3c675ff1b5b --- /dev/null +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValueType.java @@ -0,0 +1,147 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.formrecognizer.models; + +import com.azure.core.util.ExpandableStringEnum; +import com.azure.core.util.logging.ClientLogger; + +import java.util.Objects; + +/** + * Define enum values for FieldValue types. + */ +public final class FieldValueType extends ExpandableStringEnum { + private final ClientLogger logger = new ClientLogger(FieldValueType.class); + + /** + * Static value string for FieldValueType. + */ + public static final FieldValueType STRING = fromString("string"); + + /** + * Static value date for FieldValueType. + */ + public static final FieldValueType DATE = fromString("date"); + + /** + * Static value time for FieldValueType. + */ + public static final FieldValueType TIME = fromString("time"); + + /** + * Static value phone number for FieldValueType. + */ + public static final FieldValueType PHONE_NUMBER = fromString("phoneNumber"); + + /** + * Static value float for FieldValueType. + */ + public static final FieldValueType FLOAT = fromString("float"); + + /** + * Static value integer for FieldValueType. + */ + public static final FieldValueType INTEGER = fromString("integer"); + + /** + * Static value list for FieldValueType. + */ + public static final FieldValueType LIST = fromString("list"); + + /** + * Static value map for FieldValueType. + */ + public static final FieldValueType MAP = fromString("map"); + + /** + * Parses a serialized value to a {@link FieldValueType} instance. + * + * @param value the serialized value to parse. + * + * @return the parsed FieldValueType object, or null if unable to parse. + */ + public static FieldValueType fromString(String value) { + return fromString(value, FieldValueType.class); + } + + /** + * Converts the form field value to a specific expandable string enum type. + * + * @param formField The recognized field value that needs to be converted. + * @param the class of the field. + * + * @return the converted value of the recognized field. + * @throws UnsupportedOperationException if the {@code formField} type does not match the casting value type. + * @throws NullPointerException if {@code formField} is {@code null} + */ + @SuppressWarnings({"unchecked"}) + public T cast(FormField formField) { + Objects.requireNonNull(formField, "'formField' cannot be null"); + if (DATE.equals(this)) { + if (DATE == formField.getValueType()) { + return (T) formField.getValue(); + } else { + logger.logExceptionAsError(new UnsupportedOperationException(String.format("Unsupported cast operation " + + "or field value of type: %s", formField.getValueType()))); + } + } + if (TIME.equals(this)) { + if (TIME == formField.getValueType()) { + return (T) formField.getValue(); + } else { + logger.logExceptionAsError(new UnsupportedOperationException(String.format("Unsupported cast operation " + + "or field value of type: %s", formField.getValueType()))); + } + } + if (PHONE_NUMBER.equals(this)) { + if (PHONE_NUMBER == formField.getValueType()) { + return (T) formField.getValue(); + } else { + throw logger.logExceptionAsError(new UnsupportedOperationException(String.format("Unsupported cast " + + "operation for field value of type: %s", formField.getValueType()))); + } + } + if (LIST.equals(this)) { + if (LIST == formField.getValueType()) { + return (T) formField.getValue(); + } else { + throw logger.logExceptionAsError(new UnsupportedOperationException(String.format("Unsupported cast " + + "operation or field value of type: %s", formField.getValueType()))); + } + } + if (MAP.equals(this)) { + if (MAP == formField.getValueType()) { + return (T) formField.getValue(); + } else { + throw logger.logExceptionAsError(new UnsupportedOperationException(String.format("Unsupported cast " + + "operation or field value of type: %s", formField.getValueType()))); + } + } + if (FLOAT.equals(this)) { + if (FLOAT == formField.getValueType()) { + return (T) formField.getValue(); + } else { + throw logger.logExceptionAsError(new UnsupportedOperationException(String.format("Unsupported cast " + + "operation or field value of type: %s", formField.getValueType()))); + } + } + if (INTEGER.equals(this)) { + if (FLOAT == formField.getValueType()) { + return (T) formField.getValue(); + } else { + throw logger.logExceptionAsError(new UnsupportedOperationException(String.format("Unsupported cast " + + "operation or field value of type: %s", formField.getValueType()))); + } + } + if (STRING.equals(this)) { + if (STRING == formField.getValueType()) { + return (T) formField.getValue(); + } else { + throw logger.logExceptionAsError(new UnsupportedOperationException(String.format("Unsupported cast " + + "operation or field value of type: %s", formField.getValueType()))); + } + } + return (T) formField.getValue(); + } +} diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FormField.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FormField.java index 85050d55cd6c..ddcf003a53c1 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FormField.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FormField.java @@ -16,6 +16,7 @@ public final class FormField { private final String name; private final FieldData valueData; private final T value; + private final FieldValueType valueType; /** * Constructs a FormField object. @@ -25,14 +26,16 @@ public final class FormField { * @param name The name the field or label. * @param value The value of the recognized field. * @param valueData The text, bounding box, and field elements for the field value. + * @param valueType The type of the value of the recognized field. */ public FormField(final float confidence, final FieldData labelData, final String name, final T value, - final FieldData valueData) { + final FieldData valueData, FieldValueType valueType) { this.confidence = confidence; this.labelData = labelData; this.name = name; this.value = value; this.valueData = valueData; + this.valueType = valueType; } /** @@ -63,8 +66,7 @@ public String getName() { } /** - * Get the value of the recognized field. Possible types include: 'String', - * 'LocalDate', 'LocalTime', 'Integer', 'Float', 'Map', or 'List'. + * Get the value of the recognized field. * * @return the value of the recognized field. */ @@ -74,6 +76,18 @@ public T getValue() { /** * Get the text, bounding box, and field elements for the field value. + * The type of the value of the recognized field. + * Possible types include: 'String', + * 'LocalDate', 'LocalTime', 'Integer', 'Float', 'Map', or 'List'. + * + * @return the type of the value of the field. + */ + public FieldValueType getValueType() { + return valueType; + } + + /** + * Get the text, bounding box, and text content of the field value. * * @return the text, bounding box, and field elements for the field value. */ diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/Authentication.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/Authentication.java index e07da26320ec..e68d4ad05556 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/Authentication.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/Authentication.java @@ -4,6 +4,7 @@ package com.azure.ai.formrecognizer; import com.azure.ai.formrecognizer.models.AccountProperties; +import com.azure.ai.formrecognizer.models.FieldValueType; import com.azure.ai.formrecognizer.models.FormField; import com.azure.ai.formrecognizer.models.OperationResult; import com.azure.ai.formrecognizer.models.RecognizedForm; @@ -13,7 +14,6 @@ import com.azure.core.util.polling.SyncPoller; import com.azure.identity.DefaultAzureCredentialBuilder; -import java.io.IOException; import java.time.LocalDate; import java.util.List; import java.util.Map; @@ -29,7 +29,6 @@ public class Authentication { * * @param args Unused arguments to the program. * - * @throws IOException Exception thrown when there is an error in reading all the bytes from the File. */ public static void main(String[] args) { /** @@ -81,7 +80,6 @@ private static void authenticationWithAzureActiveDirectoryFormTrainingClient() { getAccountProperties(formTrainingClient); } - @SuppressWarnings("unchecked") private static void beginRecognizeCustomFormsFromUrl(FormRecognizerClient formRecognizerClient) { String receiptUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-java/master/sdk/formrecognizer" + "/azure-ai-formrecognizer/src/samples/java/sample-forms/receipts/contoso-allinone.jpg"; @@ -96,40 +94,52 @@ private static void beginRecognizeCustomFormsFromUrl(FormRecognizerClient formRe Map> recognizedFields = recognizedReceipt.getFields(); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); - Object merchantNameFieldValue = recognizedFields.get("MerchantName").getValue(); - if (merchantNameFieldValue instanceof String) { - String merchantName = (String) merchantNameFieldValue; - System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantName, merchantNameField.getConfidence()); + if (merchantNameField != null) { + if (FieldValueType.STRING.equals(merchantNameField.getValueType())) { + String merchantName = FieldValueType.STRING.cast(merchantNameField); + System.out.printf("Merchant Name: %s, confidence: %.2f%n", + merchantName, merchantNameField.getConfidence()); + } + } + + FormField merchantPhoneNumberField = recognizedFields.get("MerchantPhoneNumber"); + if (merchantPhoneNumberField != null) { + if (FieldValueType.PHONE_NUMBER.equals(merchantNameField.getValueType())) { + String merchantAddress = FieldValueType.PHONE_NUMBER.cast(merchantPhoneNumberField); + System.out.printf("Merchant Phone number: %s, confidence: %.2f%n", + merchantAddress, merchantPhoneNumberField.getConfidence()); + } } FormField transactionDateField = recognizedFields.get("TransactionDate"); - Object transactionDateFieldValue = recognizedFields.get("MerchantName").getValue(); - if (transactionDateFieldValue instanceof LocalDate) { - LocalDate transactionDate = (LocalDate) transactionDateFieldValue; - System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDate, transactionDateField.getConfidence()); + if (transactionDateField != null) { + if (FieldValueType.DATE.equals(transactionDateField.getValueType())) { + LocalDate transactionDate = FieldValueType.DATE.cast(transactionDateField); + System.out.printf("Transaction Date: %s, confidence: %.2f%n", + transactionDate, transactionDateField.getConfidence()); + } } FormField receiptItemsField = recognizedFields.get("Items"); if (receiptItemsField != null) { System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getValue() instanceof List) { - List> receiptItems = (List>) receiptItemsField.getValue(); + if (FieldValueType.LIST.equals(receiptItemsField.getValueType())) { + List> receiptItems = FieldValueType.LIST.cast(receiptItemsField); receiptItems.forEach(receiptItem -> { - if (receiptItem.getValue() instanceof Map) { - ((Map>) receiptItem.getValue()).forEach((key, formField) -> { + if (FieldValueType.MAP.equals(receiptItem.getValueType())) { + Map> formFieldMap = FieldValueType.MAP.cast(receiptItem); + formFieldMap.forEach((key, formField) -> { if ("Name".equals(key)) { - if (formField.getValue() instanceof String) { - String name = (String) formField.getValue(); + if (FieldValueType.STRING.equals(formField.getValueType())) { + String name = FieldValueType.STRING.cast(formField); System.out.printf("Name: %s, confidence: %.2fs%n", name, formField.getConfidence()); } } if ("Quantity".equals(key)) { - if (formField.getValue() instanceof Integer) { - Integer quantity = (Integer) formField.getValue(); - System.out.printf("Quantity: %d, confidence: %.2f%n", + if (FieldValueType.FLOAT.equals(formField.getValueType())) { + Float quantity = FieldValueType.FLOAT.cast(formField); + System.out.printf("Quantity: %f, confidence: %.2f%n", quantity, formField.getConfidence()); } } diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientJavaDocCodeSnippets.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientJavaDocCodeSnippets.java index a88a3a08d895..abe1cd755f0e 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientJavaDocCodeSnippets.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientJavaDocCodeSnippets.java @@ -281,7 +281,6 @@ public void beginRecognizeContentWithOptions() throws IOException { /** * Code snippet for {@link FormRecognizerAsyncClient#beginRecognizeReceiptsFromUrl(String)} */ - @SuppressWarnings("unchecked") public void beginRecognizeReceiptsFromUrl() { // BEGIN: com.azure.ai.formrecognizer.FormRecognizerAsyncClient.beginRecognizeReceiptsFromUrl#string String receiptUrl = "{receiptUrl}"; @@ -294,35 +293,54 @@ public void beginRecognizeReceiptsFromUrl() { RecognizedForm recognizedReceipt = recognizedReceipts.get(i); Map> recognizedFields = recognizedReceipt.getFields(); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); - FormField merchantNameField = recognizedFields.get("MerchantName"); - if (merchantNameField.getValue().getType() == FieldValueType.STRING) { - String merchantName = (String) merchantNameField.getValue(); - System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantName, merchantNameField.getConfidence()); + FormField merchantNameField = recognizedFields.get("MerchantName"); + if (merchantNameField != null) { + if (FieldValueType.STRING.equals(merchantNameField.getValueType())) { + String merchantName = FieldValueType.STRING.cast(merchantNameField); + System.out.printf("Merchant Name: %s, confidence: %.2f%n", + merchantName, merchantNameField.getConfidence()); + } } + + FormField merchantPhoneNumberField = recognizedFields.get("MerchantPhoneNumber"); + if (merchantPhoneNumberField != null) { + if (FieldValueType.PHONE_NUMBER.equals(merchantNameField.getValueType())) { + String merchantAddress = FieldValueType.PHONE_NUMBER.cast(merchantPhoneNumberField); + System.out.printf("Merchant Phone number: %s, confidence: %.2f%n", + merchantAddress, merchantPhoneNumberField.getConfidence()); + } + } + FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField.getValue() instanceof LocalDate) { - LocalDate transactionDate = (LocalDate) transactionDateField.getValue(); - System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDate, transactionDateField.getConfidence()); + if (transactionDateField != null) { + if (FieldValueType.DATE.equals(transactionDateField.getValueType())) { + LocalDate transactionDate = FieldValueType.DATE.cast(transactionDateField); + System.out.printf("Transaction Date: %s, confidence: %.2f%n", + transactionDate, transactionDateField.getConfidence()); + } } + FormField receiptItemsField = recognizedFields.get("Items"); - System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getValue() instanceof List) { - List> receiptItems = (List>) receiptItemsField.getValue(); - receiptItems.forEach(receiptItem -> { - if (receiptItem.getValue() instanceof Map) { - ((Map>) receiptItem.getValue()).forEach((key, formField) -> { - if ("Quantity".equals(key)) { - if (formField.getValue() instanceof Integer) { - Integer quantity = (Integer) formField.getValue(); - System.out.printf("Quantity: %s, confidence: %.2f%n", - quantity, formField.getConfidence()); + if (receiptItemsField != null) { + System.out.printf("Receipt Items: %n"); + if (FieldValueType.LIST.equals(receiptItemsField.getValueType())) { + List> receiptItems = FieldValueType.LIST.cast(receiptItemsField); + receiptItems.forEach(receiptItem -> { + if (FieldValueType.MAP.equals(receiptItem.getValueType())) { + + Map> formFieldMap = FieldValueType.MAP.cast(receiptItem); + formFieldMap.forEach((key, formField) -> { + if ("Quantity".equals(key)) { + if (FieldValueType.FLOAT.equals(formField.getValueType())) { + Float quantity = FieldValueType.FLOAT.cast(formField); + System.out.printf("Quantity: %f, confidence: %.2f%n", + quantity, formField.getConfidence()); + } } - } - }); - } - }); + }); + } + }); + } } } }); @@ -387,7 +405,6 @@ public void beginRecognizeReceiptsFromUrlWithOptions() { * * @throws IOException Exception thrown when there is an error in reading all the bytes from the File. */ - @SuppressWarnings("unchecked") public void beginRecognizeReceipts() throws IOException { // BEGIN: com.azure.ai.formrecognizer.FormRecognizerAsyncClient.beginRecognizeReceipts#Flux-long File receipt = new File("{file_source_url}"); @@ -399,37 +416,55 @@ public void beginRecognizeReceipts() throws IOException { for (int i = 0; i < recognizedReceipts.size(); i++) { RecognizedForm recognizedReceipt = recognizedReceipts.get(i); Map> recognizedFields = recognizedReceipt.getFields(); - System.out.printf("----------- Recognized Receipt page %s -----------%n", i); + System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); - if (merchantNameField.getValue() instanceof String) { - String merchantName = (String) merchantNameField.getValue(); - System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantName, merchantNameField.getConfidence()); + if (merchantNameField != null) { + if (FieldValueType.STRING.equals(merchantNameField.getValueType())) { + String merchantName = FieldValueType.STRING.cast(merchantNameField); + System.out.printf("Merchant Name: %s, confidence: %.2f%n", + merchantName, merchantNameField.getConfidence()); + } } + + FormField merchantPhoneNumberField = recognizedFields.get("MerchantPhoneNumber"); + if (merchantPhoneNumberField != null) { + if (FieldValueType.PHONE_NUMBER.equals(merchantNameField.getValueType())) { + String merchantAddress = FieldValueType.PHONE_NUMBER.cast(merchantPhoneNumberField); + System.out.printf("Merchant Phone number: %s, confidence: %.2f%n", + merchantAddress, merchantPhoneNumberField.getConfidence()); + } + } + FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField.getValue() instanceof LocalDate) { - LocalDate transactionDate = (LocalDate) transactionDateField.getValue(); - System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDate, transactionDateField.getConfidence()); + if (transactionDateField != null) { + if (FieldValueType.DATE.equals(transactionDateField.getValueType())) { + LocalDate transactionDate = FieldValueType.DATE.cast(transactionDateField); + System.out.printf("Transaction Date: %s, confidence: %.2f%n", + transactionDate, transactionDateField.getConfidence()); + } } + FormField receiptItemsField = recognizedFields.get("Items"); - System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getValue() instanceof List) { - List> receiptItems = (List>) receiptItemsField.getValue(); - receiptItems.forEach(receiptItem -> { - if (receiptItem.getValue() instanceof Map) { - ((Map>) receiptItem.getValue()) - .forEach((key, formField) -> { + if (receiptItemsField != null) { + System.out.printf("Receipt Items: %n"); + if (FieldValueType.LIST.equals(receiptItemsField.getValueType())) { + List> receiptItems = FieldValueType.LIST.cast(receiptItemsField); + receiptItems.forEach(receiptItem -> { + if (FieldValueType.MAP.equals(receiptItem.getValueType())) { + + Map> formFieldMap = FieldValueType.MAP.cast(receiptItem); + formFieldMap.forEach((key, formField) -> { if ("Quantity".equals(key)) { - if (formField.getValue() instanceof Integer) { - Integer quantity = (Integer) formField.getValue(); - System.out.printf("Quantity: %s, confidence: %.2f%n", + if (FieldValueType.FLOAT.equals(formField.getValueType())) { + Float quantity = FieldValueType.FLOAT.cast(formField); + System.out.printf("Quantity: %f, confidence: %.2f%n", quantity, formField.getConfidence()); } } }); - } - }); + } + }); + } } } } @@ -443,7 +478,6 @@ public void beginRecognizeReceipts() throws IOException { * * @throws IOException Exception thrown when there is an error in reading all the bytes from the File. */ - @SuppressWarnings("unchecked") public void beginRecognizeReceiptsWithOptions() throws IOException { // BEGIN: com.azure.ai.formrecognizer.FormRecognizerAsyncClient.beginRecognizeReceipts#Flux-long-recognizeOptions File receipt = new File("{local/file_path/fileName.jpg}"); @@ -463,35 +497,53 @@ public void beginRecognizeReceiptsWithOptions() throws IOException { Map> recognizedFields = recognizedReceipt.getFields(); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); - if (merchantNameField.getValue() instanceof String) { - String merchantName = (String) merchantNameField.getValue(); - System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantName, merchantNameField.getConfidence()); + if (merchantNameField != null) { + if (FieldValueType.STRING.equals(merchantNameField.getValueType())) { + String merchantName = FieldValueType.STRING.cast(merchantNameField); + System.out.printf("Merchant Name: %s, confidence: %.2f%n", + merchantName, merchantNameField.getConfidence()); + } } + + FormField merchantPhoneNumberField = recognizedFields.get("MerchantPhoneNumber"); + if (merchantPhoneNumberField != null) { + if (FieldValueType.PHONE_NUMBER.equals(merchantNameField.getValueType())) { + String merchantAddress = FieldValueType.PHONE_NUMBER.cast(merchantPhoneNumberField); + System.out.printf("Merchant Phone number: %s, confidence: %.2f%n", + merchantAddress, merchantPhoneNumberField.getConfidence()); + } + } + FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField.getValue() instanceof LocalDate) { - LocalDate transactionDate = (LocalDate) transactionDateField.getValue(); - System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDate, transactionDateField.getConfidence()); + if (transactionDateField != null) { + if (FieldValueType.DATE.equals(transactionDateField.getValueType())) { + LocalDate transactionDate = FieldValueType.DATE.cast(transactionDateField); + System.out.printf("Transaction Date: %s, confidence: %.2f%n", + transactionDate, transactionDateField.getConfidence()); + } } + FormField receiptItemsField = recognizedFields.get("Items"); - System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getValue() instanceof List) { - List> receiptItems = (List>) receiptItemsField.getValue(); - receiptItems.forEach(receiptItem -> { - if (receiptItem.getValue() instanceof Map) { - ((Map>) receiptItem.getValue()) - .forEach((key, formField) -> { + if (receiptItemsField != null) { + System.out.printf("Receipt Items: %n"); + if (FieldValueType.LIST.equals(receiptItemsField.getValueType())) { + List> receiptItems = FieldValueType.LIST.cast(receiptItemsField); + receiptItems.forEach(receiptItem -> { + if (FieldValueType.MAP.equals(receiptItem.getValueType())) { + + Map> formFieldMap = FieldValueType.MAP.cast(receiptItem); + formFieldMap.forEach((key, formField) -> { if ("Quantity".equals(key)) { - if (formField.getValue() instanceof Integer) { - Integer quantity = (Integer) formField.getValue(); - System.out.printf("Quantity: %d, confidence: %.2f%n", + if (FieldValueType.FLOAT.equals(formField.getValueType())) { + Float quantity = FieldValueType.FLOAT.cast(formField); + System.out.printf("Quantity: %f, confidence: %.2f%n", quantity, formField.getConfidence()); } } }); - } - }); + } + }); + } } } } diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerClientJavaDocCodeSnippets.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerClientJavaDocCodeSnippets.java index dcae95a99e7f..83f544bbd493 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerClientJavaDocCodeSnippets.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerClientJavaDocCodeSnippets.java @@ -3,6 +3,7 @@ package com.azure.ai.formrecognizer; +import com.azure.ai.formrecognizer.models.FieldValueType; import com.azure.ai.formrecognizer.models.FormContentType; import com.azure.ai.formrecognizer.models.FormField; import com.azure.ai.formrecognizer.models.RecognizeOptions; @@ -245,7 +246,6 @@ public void beginRecognizeContentWithOptions() throws IOException { /** * Code snippet for {@link FormRecognizerClient#beginRecognizeReceiptsFromUrl(String)} */ - @SuppressWarnings("unchecked") public void beginRecognizeReceiptsFromUrl() { // BEGIN: com.azure.ai.formrecognizer.FormRecognizerClient.beginRecognizeReceiptsFromUrl#string String receiptUrl = "{file_source_url}"; @@ -253,34 +253,52 @@ public void beginRecognizeReceiptsFromUrl() { .forEach(recognizedReceipt -> { Map> recognizedFields = recognizedReceipt.getFields(); FormField merchantNameField = recognizedFields.get("MerchantName"); - if (merchantNameField.getValue() instanceof String) { - String merchantName = (String) merchantNameField.getValue(); - System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantName, merchantNameField.getConfidence()); + if (merchantNameField != null) { + if (FieldValueType.STRING.equals(merchantNameField.getValueType())) { + String merchantName = FieldValueType.STRING.cast(merchantNameField); + System.out.printf("Merchant Name: %s, confidence: %.2f%n", + merchantName, merchantNameField.getConfidence()); + } + } + + FormField merchantPhoneNumberField = recognizedFields.get("MerchantPhoneNumber"); + if (merchantPhoneNumberField != null) { + if (FieldValueType.PHONE_NUMBER.equals(merchantNameField.getValueType())) { + String merchantAddress = FieldValueType.PHONE_NUMBER.cast(merchantPhoneNumberField); + System.out.printf("Merchant Phone number: %s, confidence: %.2f%n", + merchantAddress, merchantPhoneNumberField.getConfidence()); + } } + FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField.getValue() instanceof LocalDate) { - LocalDate transactionDate = (LocalDate) transactionDateField.getValue(); - System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDate, transactionDateField.getConfidence()); + if (transactionDateField != null) { + if (FieldValueType.DATE.equals(transactionDateField.getValueType())) { + LocalDate transactionDate = FieldValueType.DATE.cast(transactionDateField); + System.out.printf("Transaction Date: %s, confidence: %.2f%n", + transactionDate, transactionDateField.getConfidence()); + } } + FormField receiptItemsField = recognizedFields.get("Items"); - System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getValue() instanceof List) { - List> receiptItems = (List>) receiptItemsField.getValue(); - receiptItems.forEach(receiptItem -> { - if (receiptItem.getValue() instanceof Map) { - ((Map>) receiptItem.getValue()).forEach((key, formField) -> { - if ("Quantity".equals(key)) { - if (formField.getValue() instanceof Integer) { - Integer quantity = (Integer) formField.getValue(); - System.out.printf("Quantity: %s, confidence: %.2f%n", - quantity, formField.getConfidence()); + if (receiptItemsField != null) { + System.out.printf("Receipt Items: %n"); + if (FieldValueType.LIST.equals(receiptItemsField.getValueType())) { + List> receiptItems = FieldValueType.LIST.cast(receiptItemsField); + receiptItems.forEach(receiptItem -> { + if (FieldValueType.MAP.equals(receiptItem.getValueType())) { + Map> formFieldMap = FieldValueType.MAP.cast(receiptItem); + formFieldMap.forEach((key, formField) -> { + if ("Quantity".equals(key)) { + if (FieldValueType.FLOAT.equals(formField.getValueType())) { + Float quantity = FieldValueType.FLOAT.cast(formField); + System.out.printf("Quantity: %d, confidence: %.2f%n", + quantity, formField.getConfidence()); + } } - } - }); - } - }); + }); + } + }); + } } }); // END: com.azure.ai.formrecognizer.FormRecognizerClient.beginRecognizeReceiptsFromUrl#string @@ -333,7 +351,6 @@ public void beginRecognizeReceiptsFromUrlWithOptions() { * * @throws IOException Exception thrown when there is an error in reading all the bytes from the File. */ - @SuppressWarnings("unchecked") public void beginRecognizeReceipts() throws IOException { // BEGIN: com.azure.ai.formrecognizer.FormRecognizerClient.beginRecognizeReceipts#InputStream-long File receipt = new File("{file_source_url}"); @@ -344,34 +361,52 @@ public void beginRecognizeReceipts() throws IOException { .getFinalResult().forEach(recognizedReceipt -> { Map> recognizedFields = recognizedReceipt.getFields(); FormField merchantNameField = recognizedFields.get("MerchantName"); - if (merchantNameField.getValue() instanceof String) { - String merchantName = (String) merchantNameField.getValue(); - System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantName, merchantNameField.getConfidence()); + if (merchantNameField != null) { + if (FieldValueType.STRING.equals(merchantNameField.getValueType())) { + String merchantName = FieldValueType.STRING.cast(merchantNameField); + System.out.printf("Merchant Name: %s, confidence: %.2f%n", + merchantName, merchantNameField.getConfidence()); + } } + + FormField merchantPhoneNumberField = recognizedFields.get("MerchantPhoneNumber"); + if (merchantPhoneNumberField != null) { + if (FieldValueType.PHONE_NUMBER.equals(merchantNameField.getValueType())) { + String merchantAddress = FieldValueType.PHONE_NUMBER.cast(merchantPhoneNumberField); + System.out.printf("Merchant Phone number: %s, confidence: %.2f%n", + merchantAddress, merchantPhoneNumberField.getConfidence()); + } + } + FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField.getValue() instanceof LocalDate) { - LocalDate transactionDate = (LocalDate) transactionDateField.getValue(); - System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDate, transactionDateField.getConfidence()); + if (transactionDateField != null) { + if (FieldValueType.DATE.equals(transactionDateField.getValueType())) { + LocalDate transactionDate = FieldValueType.DATE.cast(transactionDateField); + System.out.printf("Transaction Date: %s, confidence: %.2f%n", + transactionDate, transactionDateField.getConfidence()); + } } + FormField receiptItemsField = recognizedFields.get("Items"); - System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getValue() instanceof List) { - List> receiptItems = (List>) receiptItemsField.getValue(); - receiptItems.forEach(receiptItem -> { - if (receiptItem.getValue() instanceof Map) { - ((Map>) receiptItem.getValue()).forEach((key, formField) -> { - if ("Quantity".equals(key)) { - if (formField.getValue() instanceof Integer) { - Integer quantity = (Integer) formField.getValue(); - System.out.printf("Quantity: %d, confidence: %.2f%n", - quantity, formField.getConfidence()); + if (receiptItemsField != null) { + System.out.printf("Receipt Items: %n"); + if (FieldValueType.LIST.equals(receiptItemsField.getValueType())) { + List> receiptItems = FieldValueType.LIST.cast(receiptItemsField); + receiptItems.forEach(receiptItem -> { + if (FieldValueType.MAP.equals(receiptItem.getValueType())) { + Map> formFieldMap = FieldValueType.MAP.cast(receiptItem); + formFieldMap.forEach((key, formField) -> { + if ("Quantity".equals(key)) { + if (FieldValueType.FLOAT.equals(formField.getValueType())) { + Float quantity = FieldValueType.FLOAT.cast(formField); + System.out.printf("Quantity: %d, confidence: %.2f%n", + quantity, formField.getConfidence()); + } } - } - }); - } - }); + }); + } + }); + } } }); // END: com.azure.ai.formrecognizer.FormRecognizerClient.beginRecognizeReceipts#InputStream-long @@ -383,7 +418,6 @@ public void beginRecognizeReceipts() throws IOException { * * @throws IOException Exception thrown when there is an error in reading all the bytes from the File. */ - @SuppressWarnings("unchecked") public void beginRecognizeReceiptsWithOptions() throws IOException { // BEGIN: com.azure.ai.formrecognizer.FormRecognizerClient.beginRecognizeReceipts#InputStream-long-recognizeOptions @@ -399,34 +433,52 @@ public void beginRecognizeReceiptsWithOptions() throws IOException { .getFinalResult().forEach(recognizedReceipt -> { Map> recognizedFields = recognizedReceipt.getFields(); FormField merchantNameField = recognizedFields.get("MerchantName"); - if (merchantNameField.getValue() instanceof String) { - String merchantName = (String) merchantNameField.getValue(); - System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantName, merchantNameField.getConfidence()); + if (merchantNameField != null) { + if (FieldValueType.STRING.equals(merchantNameField.getValueType())) { + String merchantName = FieldValueType.STRING.cast(merchantNameField); + System.out.printf("Merchant Name: %s, confidence: %.2f%n", + merchantName, merchantNameField.getConfidence()); + } + } + + FormField merchantPhoneNumberField = recognizedFields.get("MerchantPhoneNumber"); + if (merchantPhoneNumberField != null) { + if (FieldValueType.PHONE_NUMBER.equals(merchantNameField.getValueType())) { + String merchantAddress = FieldValueType.PHONE_NUMBER.cast(merchantPhoneNumberField); + System.out.printf("Merchant Phone number: %s, confidence: %.2f%n", + merchantAddress, merchantPhoneNumberField.getConfidence()); + } } + FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField.getValue() instanceof LocalDate) { - LocalDate transactionDate = (LocalDate) transactionDateField.getValue(); - System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDate, transactionDateField.getConfidence()); + if (transactionDateField != null) { + if (FieldValueType.DATE.equals(transactionDateField.getValueType())) { + LocalDate transactionDate = FieldValueType.DATE.cast(transactionDateField); + System.out.printf("Transaction Date: %s, confidence: %.2f%n", + transactionDate, transactionDateField.getConfidence()); + } } + FormField receiptItemsField = recognizedFields.get("Items"); - System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getValue() instanceof List) { - List> receiptItems = (List>) receiptItemsField.getValue(); - receiptItems.forEach(receiptItem -> { - if (receiptItem.getValue() instanceof Map) { - ((Map>) receiptItem.getValue()).forEach((key, formField) -> { - if ("Quantity".equals(key)) { - if (formField.getValue() instanceof Integer) { - Integer quantity = (Integer) formField.getValue(); - System.out.printf("Quantity: %d, confidence: %.2f%n", - quantity, formField.getConfidence()); + if (receiptItemsField != null) { + System.out.printf("Receipt Items: %n"); + if (FieldValueType.LIST.equals(receiptItemsField.getValueType())) { + List> receiptItems = FieldValueType.LIST.cast(receiptItemsField); + receiptItems.forEach(receiptItem -> { + if (FieldValueType.MAP.equals(receiptItem.getValueType())) { + Map> formFieldMap = FieldValueType.MAP.cast(receiptItem); + formFieldMap.forEach((key, formField) -> { + if ("Quantity".equals(key)) { + if (FieldValueType.FLOAT.equals(formField.getValueType())) { + Float quantity = FieldValueType.FLOAT.cast(formField); + System.out.printf("Quantity: %d, confidence: %.2f%n", + quantity, formField.getConfidence()); + } } - } - }); - } - }); + }); + } + }); + } } }); // END: com.azure.ai.formrecognizer.FormRecognizerClient.beginRecognizeReceipts#InputStream-long-recognizeOptions diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java index 644819153e9f..ad481a37d77f 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java @@ -6,6 +6,7 @@ import com.azure.ai.formrecognizer.models.AccountProperties; import com.azure.ai.formrecognizer.models.CustomFormModel; import com.azure.ai.formrecognizer.models.CustomFormModelInfo; +import com.azure.ai.formrecognizer.models.FieldValueType; import com.azure.ai.formrecognizer.models.FormContentType; import com.azure.ai.formrecognizer.models.FormField; import com.azure.ai.formrecognizer.models.FormPage; @@ -138,7 +139,6 @@ public void recognizeContent() throws IOException { } } - @SuppressWarnings("unchecked") public void recognizeReceipt() { String receiptUrl = "https://docs.microsoft.com/en-us/azure/cognitive-services/form-recognizer/media" + "/contoso-allinone.jpg"; @@ -151,41 +151,52 @@ public void recognizeReceipt() { Map> recognizedFields = recognizedReceipt.getFields(); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); - if (merchantNameField.getValue() instanceof String) { - String merchantName = (String) merchantNameField.getValue(); - System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantName, merchantNameField.getConfidence()); + if (merchantNameField != null) { + if (FieldValueType.STRING.equals(merchantNameField.getValueType())) { + String merchantName = FieldValueType.STRING.cast(merchantNameField); + System.out.printf("Merchant Name: %s, confidence: %.2f%n", + merchantName, merchantNameField.getConfidence()); + } } + + FormField merchantPhoneNumberField = recognizedFields.get("MerchantPhoneNumber"); + if (merchantPhoneNumberField != null) { + if (FieldValueType.PHONE_NUMBER.equals(merchantNameField.getValueType())) { + String merchantAddress = FieldValueType.PHONE_NUMBER.cast(merchantPhoneNumberField); + System.out.printf("Merchant Phone number: %s, confidence: %.2f%n", + merchantAddress, merchantPhoneNumberField.getConfidence()); + } + } + FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField.getValue() instanceof LocalDate) { - LocalDate transactionDate = (LocalDate) transactionDateField.getValue(); - System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDate, transactionDateField.getConfidence()); + if (transactionDateField != null) { + if (FieldValueType.DATE.equals(transactionDateField.getValueType())) { + LocalDate transactionDate = FieldValueType.DATE.cast(transactionDateField); + System.out.printf("Transaction Date: %s, confidence: %.2f%n", + transactionDate, transactionDateField.getConfidence()); + } } + FormField receiptItemsField = recognizedFields.get("Items"); - System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getValue() instanceof List) { - List> receiptItems = (List>) receiptItemsField.getValue(); - receiptItems.forEach(receiptItem -> { - if (receiptItem.getValue() instanceof Map) { - ((Map>) receiptItem.getValue()).forEach((key, formField) -> { - if ("Name".equals(key)) { - if (formField.getValue() instanceof String) { - String name = (String) formField.getValue(); - System.out.printf("Name: %s, confidence: %.2fs%n", - name, formField.getConfidence()); - } - } - if ("Quantity".equals(key)) { - if (formField.getValue() instanceof Integer) { - Integer quantity = (Integer) formField.getValue(); - System.out.printf("Quantity: %d, confidence: %.2f%n", - quantity, formField.getConfidence()); + if (receiptItemsField != null) { + System.out.printf("Receipt Items: %n"); + if (FieldValueType.LIST.equals(receiptItemsField.getValueType())) { + List> receiptItems = FieldValueType.LIST.cast(receiptItemsField); + receiptItems.forEach(receiptItem -> { + if (FieldValueType.MAP.equals(receiptItem.getValueType())) { + Map> formFieldMap = FieldValueType.MAP.cast(receiptItem); + formFieldMap.forEach((key, formField) -> { + if ("Quantity".equals(key)) { + if (FieldValueType.FLOAT.equals(formField.getValueType())) { + Float quantity = FieldValueType.FLOAT.cast(formField); + System.out.printf("Quantity: %f, confidence: %.2f%n", + quantity, formField.getConfidence()); + } } - } - }); - } - }); + }); + } + }); + } } } } diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceipts.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceipts.java index 6e3ec66e527c..c98bc29d99e9 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceipts.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceipts.java @@ -33,7 +33,6 @@ public class RecognizeReceipts { * * @throws IOException from reading file. */ - @SuppressWarnings("unchecked") public static void main(final String[] args) throws IOException { // Instantiate a client that will be used to call the service. FormRecognizerClient client = new FormRecognizerClientBuilder() @@ -57,19 +56,26 @@ public static void main(final String[] args) throws IOException { System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); if (merchantNameField != null) { - Object merchantNameFieldValue = merchantNameField.getValue(); - if (merchantNameFieldValue instanceof String) { - String merchantName = (String) merchantNameFieldValue; + if (FieldValueType.STRING.equals(merchantNameField.getValueType())) { + String merchantName = FieldValueType.STRING.cast(merchantNameField); System.out.printf("Merchant Name: %s, confidence: %.2f%n", merchantName, merchantNameField.getConfidence()); } } + FormField merchantPhoneNumberField = recognizedFields.get("MerchantPhoneNumber"); + if (merchantPhoneNumberField != null) { + if (FieldValueType.PHONE_NUMBER.equals(merchantNameField.getValueType())) { + String merchantAddress = FieldValueType.PHONE_NUMBER.cast(merchantPhoneNumberField); + System.out.printf("Merchant Phone number: %s, confidence: %.2f%n", + merchantAddress, merchantPhoneNumberField.getConfidence()); + } + } + FormField merchantAddressField = recognizedFields.get("MerchantAddress"); if (merchantAddressField != null) { - Object merchantAddressFieldValue = merchantAddressField.getValue(); - if (merchantAddressFieldValue instanceof String) { - String merchantAddress = (String) merchantAddressFieldValue; + if (FieldValueType.STRING.equals(merchantNameField.getValueType())) { + String merchantAddress = FieldValueType.STRING.cast(merchantAddressField); System.out.printf("Merchant Address: %s, confidence: %.2f%n", merchantAddress, merchantAddressField.getConfidence()); } @@ -77,9 +83,8 @@ public static void main(final String[] args) throws IOException { FormField transactionDateField = recognizedFields.get("TransactionDate"); if (transactionDateField != null) { - Object transactionDateFieldValue = transactionDateField.getValue(); - if (transactionDateFieldValue instanceof LocalDate) { - LocalDate transactionDate = (LocalDate) transactionDateFieldValue; + if (FieldValueType.DATE.equals(transactionDateField.getValueType())) { + LocalDate transactionDate = FieldValueType.DATE.cast(transactionDateField); System.out.printf("Transaction Date: %s, confidence: %.2f%n", transactionDate, transactionDateField.getConfidence()); } @@ -88,35 +93,36 @@ public static void main(final String[] args) throws IOException { FormField receiptItemsField = recognizedFields.get("Items"); if (receiptItemsField != null) { System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getValue() instanceof List) { - List> receiptItems = (List>) receiptItemsField.getValue(); + if (FieldValueType.LIST.equals(receiptItemsField.getValueType())) { + List> receiptItems = FieldValueType.LIST.cast(receiptItemsField); receiptItems.forEach(receiptItem -> { - if (receiptItem.getValue() instanceof Map) { - ((Map>) receiptItem.getValue()).forEach((key, formField) -> { + if (FieldValueType.MAP.equals(receiptItem.getValueType())) { + Map> formFieldMap = FieldValueType.MAP.cast(receiptItem); + formFieldMap.forEach((key, formField) -> { if ("Name".equals(key)) { - if (formField.getValue() instanceof String) { - String name = (String) formField.getValue(); + if (FieldValueType.STRING.equals(formField.getValueType())) { + String name = FieldValueType.STRING.cast(formField); System.out.printf("Name: %s, confidence: %.2fs%n", name, formField.getConfidence()); } } if ("Quantity".equals(key)) { - if (formField.getValue() instanceof Integer) { - Integer quantity = (Integer) formField.getValue(); - System.out.printf("Quantity: %d, confidence: %.2f%n", + if (FieldValueType.FLOAT.equals(formField.getValueType())) { + Float quantity = FieldValueType.FLOAT.cast(formField); + System.out.printf("Quantity: %f, confidence: %.2f%n", quantity, formField.getConfidence()); } } if ("Price".equals(key)) { - if (formField.getValue() instanceof Float) { - Float price = (Float) formField.getValue(); + if (FieldValueType.FLOAT.equals(formField.getValueType())) { + Float price = FieldValueType.FLOAT.cast(formField); System.out.printf("Price: %f, confidence: %.2f%n", price, formField.getConfidence()); } } if ("TotalPrice".equals(key)) { - if (formField.getValue() instanceof Float) { - Float totalPrice = (Float) formField.getValue(); + if (FieldValueType.FLOAT.equals(formField.getValueType())) { + Float totalPrice = FieldValueType.FLOAT.cast(formField); System.out.printf("Total Price: %f, confidence: %.2f%n", totalPrice, formField.getConfidence()); } diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsAsync.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsAsync.java index 5d6cba54a629..f4e4f182629b 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsAsync.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsAsync.java @@ -38,7 +38,6 @@ public class RecognizeReceiptsAsync { * * @throws IOException Exception thrown when there is an error in reading all the bytes from the File. */ - @SuppressWarnings("unchecked") public static void main(final String[] args) throws IOException { // Instantiate a client that will be used to call the service. FormRecognizerAsyncClient client = new FormRecognizerClientBuilder() @@ -68,69 +67,81 @@ public static void main(final String[] args) throws IOException { } }); - receiptPageResultsMono.subscribe(receiptPageResults -> { - for (int i = 0; i < receiptPageResults.size(); i++) { - RecognizedForm recognizedReceipt = receiptPageResults.get(i); - Map> recognizedFields = recognizedReceipt.getFields(); - System.out.printf("----------- Recognized Receipt page %d -----------%n", i); - FormField merchantNameField = recognizedFields.get("MerchantName"); - if (merchantNameField != null) { - if (merchantNameField.getFieldValue().getType() == FieldValueType.STRING) { - System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantNameField.getFieldValue().asString(), - merchantNameField.getConfidence()); - } + for (int i = 0; i < receiptPageResults.size(); i++) { + RecognizedForm recognizedReceipt = receiptPageResults.get(i); + Map> recognizedFields = recognizedReceipt.getFields(); + System.out.printf("----------- Recognized Receipt page %d -----------%n", i); + FormField merchantNameField = recognizedFields.get("MerchantName"); + if (merchantNameField != null) { + if (FieldValueType.STRING.equals(merchantNameField.getValueType())) { + String merchantName = FieldValueType.STRING.cast(merchantNameField); + System.out.printf("Merchant Name: %s, confidence: %.2f%n", + merchantName, merchantNameField.getConfidence()); } - FormField merchantAddressField = recognizedFields.get("MerchantAddress"); - if (merchantAddressField != null) { - if (merchantAddressField.getFieldValue().getType() == FieldValueType.STRING) { - System.out.printf("Merchant Address: %s, confidence: %.2f%n", - merchantAddressField.getFieldValue().asString(), - merchantAddressField.getConfidence()); - } + } + + FormField merchantPhoneNumberField = recognizedFields.get("MerchantPhoneNumber"); + if (merchantPhoneNumberField != null) { + if (FieldValueType.PHONE_NUMBER.equals(merchantNameField.getValueType())) { + String merchantAddress = FieldValueType.PHONE_NUMBER.cast(merchantPhoneNumberField); + System.out.printf("Merchant Phone number: %s, confidence: %.2f%n", + merchantAddress, merchantPhoneNumberField.getConfidence()); } - FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField != null) { - if (transactionDateField.getFieldValue().getType() == FieldValueType.DATE) { - System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDateField.getFieldValue().asDate(), - transactionDateField.getConfidence()); - } + } + + FormField merchantAddressField = recognizedFields.get("MerchantAddress"); + if (merchantAddressField != null) { + if (FieldValueType.STRING.equals(merchantNameField.getValueType())) { + String merchantAddress = FieldValueType.STRING.cast(merchantAddressField); + System.out.printf("Merchant Address: %s, confidence: %.2f%n", + merchantAddress, merchantAddressField.getConfidence()); + } + } + + FormField transactionDateField = recognizedFields.get("TransactionDate"); + if (transactionDateField != null) { + if (FieldValueType.DATE.equals(transactionDateField.getValueType())) { + LocalDate transactionDate = FieldValueType.DATE.cast(transactionDateField); + System.out.printf("Transaction Date: %s, confidence: %.2f%n", + transactionDate, transactionDateField.getConfidence()); } - FormField receiptItemsField = recognizedFields.get("Items"); - if (receiptItemsField != null) { - System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getFieldValue().getType() == FieldValueType.LIST) { - List receiptItems = receiptItemsField.getFieldValue().asList(); - receiptItems.forEach(receiptItem -> { - if (receiptItem.getFieldValue().getType() == FieldValueType.MAP) { - receiptItem.getFieldValue().asMap().forEach((key, formField) -> { - if (key.equals("Name")) { - if (formField.getFieldValue().getType() == FieldValueType.STRING) { - System.out.printf("Name: %s, confidence: %.2fs%n", - formField.getFieldValue().asString(), - formField.getConfidence()); - } + } + + FormField receiptItemsField = recognizedFields.get("Items"); + if (receiptItemsField != null) { + System.out.printf("Receipt Items: %n"); + if (FieldValueType.LIST.equals(receiptItemsField.getValueType())) { + List> receiptItems = FieldValueType.LIST.cast(receiptItemsField); + receiptItems.forEach(receiptItem -> { + if (FieldValueType.MAP.equals(receiptItem.getValueType())) { + Map> formFieldMap = FieldValueType.MAP.cast(receiptItem); + formFieldMap.forEach((key, formField) -> { + if ("Name".equals(key)) { + if (FieldValueType.STRING.equals(formField.getValueType())) { + String name = FieldValueType.STRING.cast(formField); + System.out.printf("Name: %s, confidence: %.2fs%n", + name, formField.getConfidence()); } - if (key.equals("Quantity")) { - if (formField.getFieldValue().getType() == FieldValueType.INTEGER) { - System.out.printf("Quantity: %d, confidence: %.2f%n", - formField.getFieldValue().asInteger(), formField.getConfidence()); - } + } + if ("Quantity".equals(key)) { + if (FieldValueType.FLOAT.equals(formField.getValueType())) { + Float quantity = FieldValueType.FLOAT.cast(formField); + System.out.printf("Quantity: %f, confidence: %.2f%n", + quantity, formField.getConfidence()); } - if (key.equals("Price")) { - if (formField.getFieldValue().getType() == FieldValueType.FLOAT) { - System.out.printf("Price: %f, confidence: %.2f%n", - formField.getFieldValue().asFloat(), - formField.getConfidence()); - } + } + if ("Price".equals(key)) { + if (FieldValueType.FLOAT.equals(formField.getValueType())) { + Float price = FieldValueType.FLOAT.cast(formField); + System.out.printf("Price: %f, confidence: %.2f%n", + price, formField.getConfidence()); } - if (key.equals("TotalPrice")) { - if (formField.getFieldValue().getType() == FieldValueType.FLOAT) { - System.out.printf("Total Price: %f, confidence: %.2f%n", - formField.getFieldValue().asFloat(), - formField.getConfidence()); - } + } + if ("TotalPrice".equals(key)) { + if (FieldValueType.FLOAT.equals(formField.getValueType())) { + Float totalPrice = FieldValueType.FLOAT.cast(formField); + System.out.printf("Total Price: %f, confidence: %.2f%n", + totalPrice, formField.getConfidence()); } }); } diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrl.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrl.java index 2ab5efec5f21..74f017b95e7b 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrl.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrl.java @@ -3,6 +3,7 @@ package com.azure.ai.formrecognizer; +import com.azure.ai.formrecognizer.models.FieldValueType; import com.azure.ai.formrecognizer.models.FormField; import com.azure.ai.formrecognizer.models.OperationResult; import com.azure.ai.formrecognizer.models.RecognizedForm; @@ -26,7 +27,6 @@ public class RecognizeReceiptsFromUrl { * * @param args Unused. Arguments to the program. */ - @SuppressWarnings("unchecked") public static void main(final String[] args) { // Instantiate a client that will be used to call the service. FormRecognizerClient client = new FormRecognizerClientBuilder() @@ -47,9 +47,8 @@ public static void main(final String[] args) { System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); if (merchantNameField != null) { - Object merchantNameFieldValue = merchantNameField.getValue(); - if (merchantNameFieldValue instanceof String) { - String merchantName = (String) merchantNameFieldValue; + if (FieldValueType.STRING.equals(merchantNameField.getValueType())) { + String merchantName = FieldValueType.STRING.cast(merchantNameField); System.out.printf("Merchant Name: %s, confidence: %.2f%n", merchantName, merchantNameField.getConfidence()); } @@ -57,19 +56,26 @@ public static void main(final String[] args) { FormField merchantAddressField = recognizedFields.get("MerchantAddress"); if (merchantAddressField != null) { - Object merchantAddressFieldValue = merchantAddressField.getValue(); - if (merchantAddressFieldValue instanceof String) { - String merchantAddress = (String) merchantAddressFieldValue; + if (FieldValueType.STRING.equals(merchantNameField.getValueType())) { + String merchantAddress = FieldValueType.STRING.cast(merchantAddressField); System.out.printf("Merchant Address: %s, confidence: %.2f%n", merchantAddress, merchantAddressField.getConfidence()); } } + FormField merchantPhoneNumberField = recognizedFields.get("MerchantPhoneNumber"); + if (merchantPhoneNumberField != null) { + if (FieldValueType.PHONE_NUMBER.equals(merchantNameField.getValueType())) { + String merchantAddress = FieldValueType.PHONE_NUMBER.cast(merchantPhoneNumberField); + System.out.printf("Merchant Phone number: %s, confidence: %.2f%n", + merchantAddress, merchantPhoneNumberField.getConfidence()); + } + } + FormField transactionDateField = recognizedFields.get("TransactionDate"); if (transactionDateField != null) { - Object transactionDateFieldValue = transactionDateField.getValue(); - if (transactionDateFieldValue instanceof LocalDate) { - LocalDate transactionDate = (LocalDate) transactionDateFieldValue; + if (FieldValueType.DATE.equals(transactionDateField.getValueType())) { + LocalDate transactionDate = FieldValueType.DATE.cast(transactionDateField); System.out.printf("Transaction Date: %s, confidence: %.2f%n", transactionDate, transactionDateField.getConfidence()); } @@ -78,35 +84,36 @@ public static void main(final String[] args) { FormField receiptItemsField = recognizedFields.get("Items"); if (receiptItemsField != null) { System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getValue() instanceof List) { - List> receiptItems = (List>) receiptItemsField.getValue(); + if (FieldValueType.LIST.equals(receiptItemsField.getValueType())) { + List> receiptItems = FieldValueType.LIST.cast(receiptItemsField); receiptItems.forEach(receiptItem -> { - if (receiptItem.getValue() instanceof Map) { - ((Map>) receiptItem.getValue()).forEach((key, formField) -> { + if (FieldValueType.MAP.equals(receiptItem.getValueType())) { + Map> formFieldMap = FieldValueType.MAP.cast(receiptItem); + formFieldMap.forEach((key, formField) -> { if ("Name".equals(key)) { - if (formField.getValue() instanceof String) { - String name = (String) formField.getValue(); + if (FieldValueType.STRING.equals(formField.getValueType())) { + String name = FieldValueType.STRING.cast(formField); System.out.printf("Name: %s, confidence: %.2fs%n", name, formField.getConfidence()); } } if ("Quantity".equals(key)) { - if (formField.getValue() instanceof Integer) { - Integer quantity = (Integer) formField.getValue(); - System.out.printf("Quantity: %d, confidence: %.2f%n", + if (FieldValueType.FLOAT.equals(formField.getValueType())) { + Float quantity = FieldValueType.FLOAT.cast(formField); + System.out.printf("Quantity: %f, confidence: %.2f%n", quantity, formField.getConfidence()); } } if ("Price".equals(key)) { - if (formField.getValue() instanceof Float) { - Float price = (Float) formField.getValue(); + if (FieldValueType.FLOAT.equals(formField.getValueType())) { + Float price = FieldValueType.FLOAT.cast(formField); System.out.printf("Price: %f, confidence: %.2f%n", price, formField.getConfidence()); } } if ("TotalPrice".equals(key)) { - if (formField.getValue() instanceof Float) { - Float totalPrice = (Float) formField.getValue(); + if (FieldValueType.FLOAT.equals(formField.getValueType())) { + Float totalPrice = FieldValueType.FLOAT.cast(formField); System.out.printf("Total Price: %f, confidence: %.2f%n", totalPrice, formField.getConfidence()); } diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrlAsync.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrlAsync.java index 2f76fb83dfaa..19cbd0886da5 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrlAsync.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrlAsync.java @@ -3,6 +3,7 @@ package com.azure.ai.formrecognizer; +import com.azure.ai.formrecognizer.models.FieldValueType; import com.azure.ai.formrecognizer.models.FormField; import com.azure.ai.formrecognizer.models.OperationResult; import com.azure.ai.formrecognizer.models.RecognizedForm; @@ -28,7 +29,6 @@ public class RecognizeReceiptsFromUrlAsync { * * @param args Unused. Arguments to the program. */ - @SuppressWarnings("unchecked") public static void main(final String[] args) { // Instantiate a client that will be used to call the service. FormRecognizerAsyncClient client = new FormRecognizerClientBuilder() @@ -61,19 +61,26 @@ public static void main(final String[] args) { System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); if (merchantNameField != null) { - Object merchantNameFieldValue = merchantNameField.getValue(); - if (merchantNameFieldValue instanceof String) { - String merchantName = (String) merchantNameFieldValue; + if (FieldValueType.STRING.equals(merchantNameField.getValueType())) { + String merchantName = FieldValueType.STRING.cast(merchantNameField); System.out.printf("Merchant Name: %s, confidence: %.2f%n", merchantName, merchantNameField.getConfidence()); } } + FormField merchantPhoneNumberField = recognizedFields.get("MerchantPhoneNumber"); + if (merchantPhoneNumberField != null) { + if (FieldValueType.PHONE_NUMBER.equals(merchantNameField.getValueType())) { + String merchantAddress = FieldValueType.PHONE_NUMBER.cast(merchantPhoneNumberField); + System.out.printf("Merchant Address: %s, confidence: %.2f%n", + merchantAddress, merchantPhoneNumberField.getConfidence()); + } + } + FormField merchantAddressField = recognizedFields.get("MerchantAddress"); if (merchantAddressField != null) { - Object merchantAddressFieldValue = merchantAddressField.getValue(); - if (merchantAddressFieldValue instanceof String) { - String merchantAddress = (String) merchantAddressFieldValue; + if (FieldValueType.STRING.equals(merchantNameField.getValueType())) { + String merchantAddress = FieldValueType.STRING.cast(merchantAddressField); System.out.printf("Merchant Address: %s, confidence: %.2f%n", merchantAddress, merchantAddressField.getConfidence()); } @@ -81,9 +88,8 @@ public static void main(final String[] args) { FormField transactionDateField = recognizedFields.get("TransactionDate"); if (transactionDateField != null) { - Object transactionDateFieldValue = transactionDateField.getValue(); - if (transactionDateFieldValue instanceof LocalDate) { - LocalDate transactionDate = (LocalDate) transactionDateFieldValue; + if (FieldValueType.DATE.equals(transactionDateField.getValueType())) { + LocalDate transactionDate = FieldValueType.DATE.cast(transactionDateField); System.out.printf("Transaction Date: %s, confidence: %.2f%n", transactionDate, transactionDateField.getConfidence()); } @@ -92,35 +98,37 @@ public static void main(final String[] args) { FormField receiptItemsField = recognizedFields.get("Items"); if (receiptItemsField != null) { System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getValue() instanceof List) { - List> receiptItems = (List>) receiptItemsField.getValue(); + if (FieldValueType.LIST.equals(receiptItemsField.getValueType())) { + List> receiptItems = FieldValueType.LIST.cast(receiptItemsField); receiptItems.forEach(receiptItem -> { - if (receiptItem.getValue() instanceof Map) { - ((Map>) receiptItem.getValue()).forEach((key, formField) -> { + if (FieldValueType.MAP.equals(receiptItem.getValueType())) { + // we still have to cast or assign + Map> formFieldMap = FieldValueType.MAP.cast(receiptItem); + formFieldMap.forEach((key, formField) -> { if ("Name".equals(key)) { - if (formField.getValue() instanceof String) { - String name = (String) formField.getValue(); + if (FieldValueType.STRING.equals(formField.getValueType())) { + String name = FieldValueType.STRING.cast(formField); System.out.printf("Name: %s, confidence: %.2fs%n", name, formField.getConfidence()); } } if ("Quantity".equals(key)) { - if (formField.getValue() instanceof Integer) { - Integer quantity = (Integer) formField.getValue(); - System.out.printf("Quantity: %d, confidence: %.2f%n", + if (FieldValueType.FLOAT.equals(formField.getValueType())) { + Float quantity = FieldValueType.FLOAT.cast(formField); + System.out.printf("Quantity: %f, confidence: %.2f%n", quantity, formField.getConfidence()); } } if ("Price".equals(key)) { - if (formField.getValue() instanceof Float) { - Float price = (Float) formField.getValue(); + if (FieldValueType.FLOAT.equals(formField.getValueType())) { + Float price = FieldValueType.FLOAT.cast(formField); System.out.printf("Price: %f, confidence: %.2f%n", price, formField.getConfidence()); } } if ("TotalPrice".equals(key)) { - if (formField.getValue() instanceof Float) { - Float totalPrice = (Float) formField.getValue(); + if (FieldValueType.FLOAT.equals(formField.getValueType())) { + Float totalPrice = FieldValueType.FLOAT.cast(formField); System.out.printf("Total Price: %f, confidence: %.2f%n", totalPrice, formField.getConfidence()); } @@ -130,6 +138,7 @@ public static void main(final String[] args) { }); } } + System.out.print("-----------------------------------"); } }); diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTestBase.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTestBase.java index 6d458491499b..48aac0677528 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTestBase.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTestBase.java @@ -16,6 +16,7 @@ import com.azure.ai.formrecognizer.implementation.models.TextLine; import com.azure.ai.formrecognizer.implementation.models.TextWord; import com.azure.ai.formrecognizer.models.BoundingBox; +import com.azure.ai.formrecognizer.models.FieldValueType; import com.azure.ai.formrecognizer.models.FormElement; import com.azure.ai.formrecognizer.models.FormField; import com.azure.ai.formrecognizer.models.FormLine; @@ -265,23 +266,23 @@ private static void validateFieldValueTransforms(FieldValue expectedFieldValue, } switch (expectedFieldValue.getType()) { case NUMBER: - assertEquals(expectedFieldValue.getValueNumber(), actualFormField.getValue()); + assertEquals(expectedFieldValue.getValueNumber(), FieldValueType.FLOAT.cast(actualFormField)); break; case DATE: - assertEquals(expectedFieldValue.getValueDate(), actualFormField.getValue()); + assertEquals(expectedFieldValue.getValueDate(), FieldValueType.DATE.cast(actualFormField)); break; case TIME: assertEquals(LocalTime.parse(expectedFieldValue.getValueTime(), - DateTimeFormatter.ofPattern("HH:mm:ss")), actualFormField.getValue()); + DateTimeFormatter.ofPattern("HH:mm:ss")), FieldValueType.TIME.cast(actualFormField)); break; case STRING: - assertEquals(expectedFieldValue.getValueString(), actualFormField.getValue()); + assertEquals(expectedFieldValue.getValueString(), FieldValueType.STRING.cast(actualFormField)); break; case INTEGER: - assertEquals(expectedFieldValue.getValueInteger(), actualFormField.getValue()); + assertEquals(expectedFieldValue.getValueInteger(), FieldValueType.INTEGER.cast(actualFormField)); break; case PHONE_NUMBER: - assertEquals(expectedFieldValue.getValuePhoneNumber(), actualFormField.getValue()); + assertEquals(expectedFieldValue.getValuePhoneNumber(), FieldValueType.PHONE_NUMBER.cast(actualFormField)); break; case OBJECT: expectedFieldValue.getValueObject().forEach((key, fieldValue) -> { @@ -498,7 +499,7 @@ void validateReceiptDataFields(Map> actualRecognizedReceip Map expectedReceiptFields = documentResult.getFields(); assertEquals(expectedReceiptFields.get("ReceiptType").getValueString(), - actualRecognizedFormFields.get("ReceiptType").getFieldValue()); + FieldValueType.STRING.cast(actualRecognizedReceiptFields.get("ReceiptType"))); assertEquals(expectedReceiptFields.get("ReceiptType").getConfidence(), actualRecognizedFormFields.get("ReceiptType").getConfidence()); validateFieldValueTransforms(expectedReceiptFields.get("MerchantName"), From 8637588f5f663501a36415078cd9fd2d3ec9c0b2 Mon Sep 17 00:00:00 2001 From: Sameeksha Vaity Date: Tue, 30 Jun 2020 13:23:35 -0700 Subject: [PATCH 5/9] update testing validation --- .../ai/formrecognizer/models/FieldValueType.java | 6 +++--- .../FormRecognizerClientTestBase.java | 13 +++++-------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValueType.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValueType.java index f3c675ff1b5b..d70ff2a0d083 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValueType.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValueType.java @@ -37,7 +37,7 @@ public final class FieldValueType extends ExpandableStringEnum recognizedReceipts assertEquals(3, receiptPage3.getFormPageRange().getFirstPageNumber()); assertEquals(3, receiptPage3.getFormPageRange().getLastPageNumber()); Map> receiptPage3Fields = receiptPage3.getFields(); - assertEquals(EXPECTED_MULTIPAGE_ADDRESS_VALUE, receiptPage3Fields.get("MerchantAddress") - .getValue()); - assertEquals("Frodo Baggins", receiptPage3Fields.get("MerchantName") - .getValue()); - assertEquals(EXPECTED_MULTIPAGE_PHONE_NUMBER_VALUE, receiptPage3Fields.get("MerchantPhoneNumber") - .getValue()); + assertEquals(EXPECTED_MULTIPAGE_ADDRESS_VALUE, FieldValueType.STRING.cast(receiptPage3Fields.get("MerchantAddress"))); + assertEquals("Frodo Baggins", FieldValueType.STRING.cast(receiptPage3Fields.get("MerchantName"))); + assertEquals(EXPECTED_MULTIPAGE_PHONE_NUMBER_VALUE, FieldValueType.PHONE_NUMBER.cast(receiptPage3Fields.get("MerchantPhoneNumber"))); assertNotNull(receiptPage3Fields.get("Total").getValue()); // why isn't tip returned by service? // total value 1000 returned by service but should be 4300, service bug - assertEquals(3000.0f, receiptPage3Fields.get("Subtotal").getValue()); - assertEquals(ITEMIZED_RECEIPT_VALUE, receiptPage3Fields.get("ReceiptType").getValue()); + assertEquals(3000.0f, (Float) receiptPage3Fields.get("Subtotal").getValue()); + assertEquals(ITEMIZED_RECEIPT_VALUE, FieldValueType.STRING.cast(receiptPage3Fields.get("ReceiptType"))); } protected String getEndpoint() { From 88364a320496c1acc842ba9703c28a342132f30e Mon Sep 17 00:00:00 2001 From: Sameeksha Vaity Date: Tue, 30 Jun 2020 14:40:20 -0700 Subject: [PATCH 6/9] Integer enum --- .../azure-ai-formrecognizer/README.md | 24 ++-- .../FormRecognizerAsyncClient.java | 13 +- .../formrecognizer/FormRecognizerClient.java | 10 +- .../azure/ai/formrecognizer/Transforms.java | 10 +- .../formrecognizer/models/FieldValueType.java | 2 +- .../AdvancedDiffLabeledUnlabeledData.java | 2 +- ...ognizerAsyncClientJavaDocCodeSnippets.java | 98 +++++++------ ...rmRecognizerClientJavaDocCodeSnippets.java | 84 ++++++----- .../RecognizeReceiptsAsync.java | 130 +++++++++--------- .../StronglyTypedRecognizedForm.java | 1 - .../FormRecognizerAsyncClientTest.java | 41 +++--- .../FormRecognizerClientTest.java | 22 +-- .../FormRecognizerClientTestBase.java | 41 ++---- .../FormTrainingAsyncClientTest.java | 4 +- .../FormTrainingClientTest.java | 4 +- .../FormTrainingClientTestBase.java | 8 +- 16 files changed, 255 insertions(+), 239 deletions(-) diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/README.md b/sdk/formrecognizer/azure-ai-formrecognizer/README.md index c3d4f7994a17..fd4e921a88a6 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/README.md +++ b/sdk/formrecognizer/azure-ai-formrecognizer/README.md @@ -81,14 +81,14 @@ resource, or by running the following Azure CLI command to get the key from the az cognitiveservices account keys list --resource-group --name ``` Use the API key as the credential parameter to authenticate the client: - + ```java FormRecognizerClient formRecognizerClient = new FormRecognizerClientBuilder() .credential(new AzureKeyCredential("{key}")) .endpoint("{endpoint}") .buildClient(); ``` - + ```java FormTrainingClient formTrainingClient = new FormTrainingClientBuilder() .credential(new AzureKeyCredential("{key}")) @@ -98,7 +98,7 @@ FormTrainingClient formTrainingClient = new FormTrainingClientBuilder() The Azure Form Recognizer client library provides a way to **rotate the existing key**. - + ```java AzureKeyCredential credential = new AzureKeyCredential("{key}"); FormRecognizerClient formRecognizerClient = new FormRecognizerClientBuilder() @@ -137,7 +137,7 @@ Authorization is easiest using [DefaultAzureCredential][wiki_identity]. It finds running environment. For more information about using Azure Active Directory authorization with Form Recognizer, please refer to [the associated documentation][aad_authorization]. - + ```java TokenCredential credential = new DefaultAzureCredentialBuilder().build(); FormRecognizerClient formRecognizerClient = new FormRecognizerClientBuilder() @@ -195,7 +195,7 @@ The following section provides several code snippets covering some of the most c ### Recognize Forms Using a Custom Model Recognize name/value pairs and table data from forms. These models are trained with your own data, so they're tailored to your forms. You should only recognize forms of the same form type that the custom model was trained on. - + ```java String formUrl = "{form_url}"; String modelId = "{custom_trained_model_id}"; @@ -219,7 +219,7 @@ for (int i = 0; i < recognizedForms.size(); i++) { ### Recognize Content Recognize text and table structures, along with their bounding box coordinates, from documents. - + ```java // recognize form content using file input stream File form = new File("local/file_path/filename.png"); @@ -251,7 +251,7 @@ for (int i = 0; i < contentPageResults.size(); i++) { Recognize data from a USA sales receipts using a prebuilt model. [Here][service_recognize_receipt] are the fields the service returns for a recognized receipt. See [StronglyTypedRecognizedForm.java][strongly_typed_sample] for a suggested approach to extract information from receipts. - + ```java String receiptUrl = "https://docs.microsoft.com/en-us/azure/cognitive-services/form-recognizer/media" + "/contoso-allinone.jpg"; @@ -302,7 +302,7 @@ for (int i = 0; i < receiptPageResults.size(); i++) { if ("Quantity".equals(key)) { if (FieldValueType.FLOAT.equals(formField.getValueType())) { Float quantity = FieldValueType.FLOAT.cast(formField); - System.out.printf("Quantity: %d, confidence: %.2f%n", + System.out.printf("Quantity: %f, confidence: %.2f%n", quantity, formField.getConfidence()); } } @@ -318,7 +318,7 @@ for (int i = 0; i < receiptPageResults.size(); i++) { Train a machine-learned model on your own form type. The resulting model will be able to recognize values from the types of forms it was trained on. Provide a container SAS url to your Azure Storage Blob container where you're storing the training documents. See details on setting this up in the [service quickstart documentation][quickstart_training]. - + ```java String trainingFilesUrl = "{SAS-URL-of-your-container-in-blob-storage}"; SyncPoller trainingPoller = @@ -345,7 +345,7 @@ customFormModel.getSubmodels().forEach(customFormSubmodel -> { ### Manage your models Manage the custom models attached to your account. - + ```java AtomicReference modelId = new AtomicReference<>(); // First, we see how many custom models we have, and what our limit is @@ -387,7 +387,7 @@ to provide an invalid file source URL an `HttpResponseException` would be raised In the following code snippet, the error is handled gracefully by catching the exception and display the additional information about the error. - + ```java try { formRecognizerClient.beginRecognizeContentFromUrl("invalidSourceUrl"); @@ -425,7 +425,7 @@ These code samples show common scenario operations with the Azure Form Recognize #### Async APIs All the examples shown so far have been using synchronous APIs, but we provide full support for async APIs as well. You'll need to use `FormRecognizerAsyncClient` - + ```java FormRecognizerAsyncClient formRecognizerAsyncClient = new FormRecognizerClientBuilder() .credential(new AzureKeyCredential("{key}")) diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClient.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClient.java index 9dacc70ecf4b..6e9dc5a0a962 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClient.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClient.java @@ -362,17 +362,17 @@ public PollerFlux> beginRecognizeContent(Flux> + public PollerFlux> beginRecognizeReceiptsFromUrl(String receiptUrl, RecognizeOptions recognizeOptions) { try { recognizeOptions = getRecognizeOptionsProperties(recognizeOptions); - return new PollerFlux>( + return new PollerFlux>( recognizeOptions.getPollInterval(), receiptAnalyzeActivationOperation(receiptUrl, recognizeOptions.isIncludeFieldElements()), extractReceiptPollOperation(), @@ -407,7 +407,7 @@ public PollerFlux> beginRecognizeContent(Flux> beginRecognizeReceipts( + public PollerFlux> beginRecognizeReceipts( Flux receipt, long length) { return beginRecognizeReceipts(receipt, length, null); } @@ -437,7 +437,7 @@ public PollerFlux> beginRecognizeReceip * @throws NullPointerException If {@code recognizeOptions} is {@code null}. */ @ServiceMethod(returns = ReturnType.COLLECTION) - public PollerFlux> + public PollerFlux> beginRecognizeReceipts(Flux receipt, long length, RecognizeOptions recognizeOptions) { try { recognizeOptions = getRecognizeOptionsProperties(recognizeOptions); @@ -520,7 +520,8 @@ private Function, Mono> receipt return service.getAnalyzeReceiptResultWithResponseAsync(resultUid) .map(modelSimpleResponse -> { throwIfAnalyzeStatusInvalid(modelSimpleResponse.getValue()); - return toRecognizedForm(modelSimpleResponse.getValue().getAnalyzeResult(), includeFieldElements); + return toRecognizedForm(modelSimpleResponse.getValue().getAnalyzeResult(), + includeFieldElements); }) .onErrorMap(Utility::mapToHttpResponseExceptionIfExist); } catch (RuntimeException ex) { diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/FormRecognizerClient.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/FormRecognizerClient.java index eea9a9f857b6..be8c2332fc80 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/FormRecognizerClient.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/FormRecognizerClient.java @@ -262,7 +262,7 @@ public SyncPoller> beginRecognizeContent(InputSt * @throws NullPointerException If {@code receiptUrl} is {@code null}. */ @ServiceMethod(returns = ReturnType.COLLECTION) - public SyncPoller> beginRecognizeReceiptsFromUrl(String receiptUrl) { + public SyncPoller> beginRecognizeReceiptsFromUrl(String receiptUrl) { return beginRecognizeReceiptsFromUrl(receiptUrl, null); } @@ -280,13 +280,13 @@ public SyncPoller> beginRecognizeReceip * analyzing a receipt. Include text lines and element references in the result. * * @return A {@link SyncPoller} to poll the progress of the recognize receipt operation until it has completed, - * has failed, or has been cancelled. The completed operation returns a List of {@link RecognizedReceipt}. + * has failed, or has been cancelled. The completed operation returns a List of {@link RecognizedForm}. * @throws FormRecognizerException If recognize operation fails and the {@link AnalyzeOperationResult} returned with * an {@link OperationStatus#FAILED}. * @throws NullPointerException If {@code receiptUrl} is {@code null}. */ @ServiceMethod(returns = ReturnType.COLLECTION) - public SyncPoller> + public SyncPoller> beginRecognizeReceiptsFromUrl(String receiptUrl, RecognizeOptions recognizeOptions) { return client.beginRecognizeReceiptsFromUrl(receiptUrl, recognizeOptions).getSyncPoller(); } @@ -311,7 +311,7 @@ public SyncPoller> beginRecognizeReceip * @throws NullPointerException If {@code receipt} is {@code null}. */ @ServiceMethod(returns = ReturnType.COLLECTION) - public SyncPoller> + public SyncPoller> beginRecognizeReceipts(InputStream receipt, long length) { return beginRecognizeReceipts(receipt, length, null); } @@ -338,7 +338,7 @@ public SyncPoller> beginRecognizeReceip * @throws NullPointerException If {@code recognizeOptions} is {@code null}. */ @ServiceMethod(returns = ReturnType.COLLECTION) - public SyncPoller> + public SyncPoller> beginRecognizeReceipts(InputStream receipt, long length, RecognizeOptions recognizeOptions) { Flux buffer = Utility.toFluxByteBuffer(receipt); return client.beginRecognizeReceipts(buffer, length, recognizeOptions).getSyncPoller(); diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/Transforms.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/Transforms.java index 2d85708db24b..eef4208bd74c 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/Transforms.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/Transforms.java @@ -13,9 +13,7 @@ import com.azure.ai.formrecognizer.implementation.models.TextWord; import com.azure.ai.formrecognizer.models.BoundingBox; import com.azure.ai.formrecognizer.models.FieldData; -import com.azure.ai.formrecognizer.models.FieldText; import com.azure.ai.formrecognizer.models.FieldValueType; -import com.azure.ai.formrecognizer.models.FormContent; import com.azure.ai.formrecognizer.models.FormElement; import com.azure.ai.formrecognizer.models.FormField; import com.azure.ai.formrecognizer.models.FormLine; @@ -218,7 +216,7 @@ private static Map> getUnlabeledFieldMap(DocumentResult doc extractedFieldMap.put(key, setFormField(labelText, key, fieldValue, valueText, pageNumber, readResults)); } else { - FieldText labelText = new FieldText(key, null, null, null); + FieldData labelText = new FieldData(key, null, null, null); extractedFieldMap.put(key, new FormField<>(DEFAULT_CONFIDENCE_VALUE, labelText, key, null, null, null)); } @@ -240,8 +238,8 @@ private static Map> getUnlabeledFieldMap(DocumentResult doc * * @return The strongly typed {@link FormField} for the field input. */ - private static FormField setFormField(FieldText labelText, String key, FieldValue fieldValue, - FieldText valueText, Integer pageNumber, List readResults) { + private static FormField setFormField(FieldData labelText, String key, FieldValue fieldValue, + FieldData valueText, Integer pageNumber, List readResults) { FormField value; switch (fieldValue.getType()) { case PHONE_NUMBER: @@ -386,7 +384,7 @@ private static Map> getLabeledFieldMap(boolean includeField String fieldName = "field-" + index; FormField formField = new FormField<>(setDefaultConfidenceValue(keyValuePair.getConfidence()), - labelFieldText, fieldName, keyValuePair.getValue().getText(), valueText, FieldValueType.STRING); + labelFieldData, fieldName, keyValuePair.getValue().getText(), valueText, FieldValueType.STRING); formFieldMap.put(fieldName, formField); })); return formFieldMap; diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValueType.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValueType.java index d70ff2a0d083..56d1a016bc01 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValueType.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValueType.java @@ -127,7 +127,7 @@ public T cast(FormField formField) { } } if (INTEGER.equals(this)) { - if (FLOAT == formField.getValueType()) { + if (INTEGER == formField.getValueType()) { return (T) formField.getValue(); } else { throw logger.logExceptionAsError(new UnsupportedOperationException(String.format("Unsupported cast " diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/AdvancedDiffLabeledUnlabeledData.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/AdvancedDiffLabeledUnlabeledData.java index 01a79d42d4a8..b3a96dd6c895 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/AdvancedDiffLabeledUnlabeledData.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/AdvancedDiffLabeledUnlabeledData.java @@ -120,7 +120,7 @@ public static void main(String[] args) throws IOException { System.out.printf("Field %s has value %s based on %s within bounding box %s with a confidence score " + "of %.2f.%n", - label, formField.getFieldValue(), formField.getValueData().getText(), boundingBoxStr, + label, formField.getValue(), formField.getValueData().getText(), boundingBoxStr, formField.getConfidence()); // Find the value of a specific unlabeled field. The specific key "Vendor Name:" provided in the example diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientJavaDocCodeSnippets.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientJavaDocCodeSnippets.java index abe1cd755f0e..ba76ad4a4bfe 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientJavaDocCodeSnippets.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientJavaDocCodeSnippets.java @@ -3,7 +3,7 @@ package com.azure.ai.formrecognizer; -import com.azure.ai.formrecognizer.implementation.models.FieldValueType; +import com.azure.ai.formrecognizer.models.FieldValueType; import com.azure.ai.formrecognizer.models.FormContentType; import com.azure.ai.formrecognizer.models.FormField; import com.azure.ai.formrecognizer.models.RecognizeOptions; @@ -77,7 +77,7 @@ public void beginRecognizeCustomFormsFromUrl() { recognizedForms.forEach(recognizedForm -> { recognizedForm.getFields().forEach((fieldText, fieldValue) -> { System.out.printf("Field text: %s%n", fieldText); - System.out.printf("Field value: %s%n", fieldValue.getFieldValue()); + System.out.printf("Field value: %s%n", fieldValue.getValue()); System.out.printf("Confidence score: %.2f%n", fieldValue.getConfidence()); }); })); @@ -104,7 +104,7 @@ public void beginRecognizeCustomFormsFromUrlWithOptions() { recognizedForms.forEach(recognizedForm -> { recognizedForm.getFields().forEach((fieldText, fieldValue) -> { System.out.printf("Field text: %s%n", fieldText); - System.out.printf("Field value: %s%n", fieldValue.getFieldValue()); + System.out.printf("Field value: %s%n", fieldValue.getValue()); System.out.printf("Confidence score: %.2f%n", fieldValue.getConfidence()); }); })); @@ -130,7 +130,7 @@ public void beginRecognizeCustomForms() throws IOException { recognizedForms.forEach(recognizedForm -> { recognizedForm.getFields().forEach((fieldText, fieldValue) -> { System.out.printf("Field text: %s%n", fieldText); - System.out.printf("Field value: %s%n", fieldValue.getFieldValue()); + System.out.printf("Field value: %s%n", fieldValue.getValue()); System.out.printf("Confidence score: %.2f%n", fieldValue.getConfidence()); }); })); @@ -163,7 +163,7 @@ public void beginRecognizeCustomFormsWithOptions() throws IOException { recognizedForms.forEach(recognizedForm -> { recognizedForm.getFields().forEach((fieldText, fieldValue) -> { System.out.printf("Field text: %s%n", fieldText); - System.out.printf("Field value: %s%n", fieldValue.getFieldValue()); + System.out.printf("Field value: %s%n", fieldValue.getValue()); System.out.printf("Confidence score: %.2f%n", fieldValue.getConfidence()); }); })); @@ -363,37 +363,57 @@ public void beginRecognizeReceiptsFromUrlWithOptions() { recognizePollingOperation.getFinalResult()) .subscribe(recognizedReceipts -> { for (int i = 0; i < recognizedReceipts.size(); i++) { - RecognizedReceipt recognizedReceipt = recognizedReceipts.get(i); - Map recognizedFields = recognizedReceipt.getRecognizedForm().getFields(); - System.out.printf("----------- Recognized Receipt page %s -----------%n", i); - FormField merchantNameField = recognizedFields.get("MerchantName"); - if (merchantNameField.getFieldValue().getType() == FieldValueType.STRING) { - System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantNameField.getFieldValue().asString(), - merchantNameField.getConfidence()); + RecognizedForm recognizedReceipt = recognizedReceipts.get(i); + Map> recognizedFields = recognizedReceipt.getFields(); + System.out.printf("----------- Recognized Receipt page %d -----------%n", i); + FormField merchantNameField = recognizedFields.get("MerchantName"); + if (merchantNameField != null) { + if (FieldValueType.STRING.equals(merchantNameField.getValueType())) { + String merchantName = FieldValueType.STRING.cast(merchantNameField); + System.out.printf("Merchant Name: %s, confidence: %.2f%n", + merchantName, merchantNameField.getConfidence()); + } } - FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField.getFieldValue().getType() == FieldValueType.DATE) { - System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDateField.getFieldValue().asDate(), - transactionDateField.getConfidence()); + + FormField merchantPhoneNumberField = recognizedFields.get("MerchantPhoneNumber"); + if (merchantPhoneNumberField != null) { + if (FieldValueType.PHONE_NUMBER.equals(merchantNameField.getValueType())) { + String merchantAddress = FieldValueType.PHONE_NUMBER.cast(merchantPhoneNumberField); + System.out.printf("Merchant Phone number: %s, confidence: %.2f%n", + merchantAddress, merchantPhoneNumberField.getConfidence()); + } } - FormField receiptItemsField = recognizedFields.get("Items"); - System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getFieldValue().getType() == FieldValueType.LIST) { - List receiptItems = receiptItemsField.getFieldValue().asList(); - receiptItems.forEach(receiptItem -> { - if (receiptItem.getFieldValue().getType() == FieldValueType.MAP) { - receiptItem.getFieldValue().asMap().forEach((key, formField) -> { - if (key.equals("Quantity")) { - if (formField.getFieldValue().getType() == FieldValueType.INTEGER) { - System.out.printf("Quantity: %s, confidence: %.2f%n", - formField.getFieldValue().asInteger(), formField.getConfidence()); + + FormField transactionDateField = recognizedFields.get("TransactionDate"); + if (transactionDateField != null) { + if (FieldValueType.DATE.equals(transactionDateField.getValueType())) { + LocalDate transactionDate = FieldValueType.DATE.cast(transactionDateField); + System.out.printf("Transaction Date: %s, confidence: %.2f%n", + transactionDate, transactionDateField.getConfidence()); + } + } + + FormField receiptItemsField = recognizedFields.get("Items"); + if (receiptItemsField != null) { + System.out.printf("Receipt Items: %n"); + if (FieldValueType.LIST.equals(receiptItemsField.getValueType())) { + List> receiptItems = FieldValueType.LIST.cast(receiptItemsField); + receiptItems.forEach(receiptItem -> { + if (FieldValueType.MAP.equals(receiptItem.getValueType())) { + + Map> formFieldMap = FieldValueType.MAP.cast(receiptItem); + formFieldMap.forEach((key, formField) -> { + if ("Quantity".equals(key)) { + if (FieldValueType.FLOAT.equals(formField.getValueType())) { + Float quantity = FieldValueType.FLOAT.cast(formField); + System.out.printf("Quantity: %f, confidence: %.2f%n", + quantity, formField.getConfidence()); + } } - } - }); - } - }); + }); + } + }); + } } } }); @@ -410,7 +430,7 @@ public void beginRecognizeReceipts() throws IOException { File receipt = new File("{file_source_url}"); Flux buffer = toFluxByteBuffer(new ByteArrayInputStream(Files.readAllBytes(receipt.toPath()))); formRecognizerAsyncClient.beginRecognizeReceipts(buffer, receipt.length()) - .flatMap(recognizePollingOperation -> + .subscribe(recognizePollingOperation -> // if training polling operation completed, retrieve the final result. recognizePollingOperation.getFinalResult().subscribe(recognizedReceipts -> { for (int i = 0; i < recognizedReceipts.size(); i++) { @@ -466,9 +486,7 @@ public void beginRecognizeReceipts() throws IOException { }); } } - } - } - }); + }})); // END: com.azure.ai.formrecognizer.FormRecognizerAsyncClient.beginRecognizeReceipts#Flux-long } @@ -489,7 +507,7 @@ public void beginRecognizeReceiptsWithOptions() throws IOException { .setContentType(FormContentType.IMAGE_JPEG) .setIncludeFieldElements(includeFieldElements) .setPollInterval(Duration.ofSeconds(5))) - .flatMap(recognizePollingOperation -> + .subscribe(recognizePollingOperation -> // if training polling operation completed, retrieve the final result. recognizePollingOperation.getFinalResult().subscribe(recognizedReceipts -> { for (int i = 0; i < recognizedReceipts.size(); i++) { @@ -546,8 +564,8 @@ public void beginRecognizeReceiptsWithOptions() throws IOException { } } } - } - }); + })); + // END: com.azure.ai.formrecognizer.FormRecognizerAsyncClient.beginRecognizeReceipts#Flux-long-recognizeOptions } } diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerClientJavaDocCodeSnippets.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerClientJavaDocCodeSnippets.java index 83f544bbd493..ce9f24f1819d 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerClientJavaDocCodeSnippets.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerClientJavaDocCodeSnippets.java @@ -68,13 +68,12 @@ public void beginRecognizeCustomFormsFromUrl() { String modelId = "{custom_trained_model_id}"; formRecognizerClient.beginRecognizeCustomFormsFromUrl(formUrl, modelId).getFinalResult() - .forEach(recognizedForm -> { + .forEach(recognizedForm -> recognizedForm.getFields().forEach((fieldText, fieldValue) -> { System.out.printf("Field text: %s%n", fieldText); System.out.printf("Field value: %s%n", fieldValue.getValue()); System.out.printf("Confidence score: %.2f%n", fieldValue.getConfidence()); - }); - }); + })); // END: com.azure.ai.formrecognizer.FormRecognizerClient.beginRecognizeCustomFormsFromUrl#string-string } @@ -95,7 +94,7 @@ public void beginRecognizeCustomFormsFromUrlWithOptions() { .getFinalResult() .forEach(recognizedForm -> recognizedForm.getFields().forEach((fieldText, fieldValue) -> { System.out.printf("Field text: %s%n", fieldText); - System.out.printf("Field value: %s%n", fieldValue.getFieldValue()); + System.out.printf("Field value: %s%n", fieldValue.getValue()); System.out.printf("Confidence score: %.2f%n", fieldValue.getConfidence()); })); // END: com.azure.ai.formrecognizer.FormRecognizerClient.beginRecognizeCustomFormsFromUrl#string-string-recognizeOptions @@ -146,7 +145,7 @@ public void beginRecognizeCustomFormsWithOptions() throws IOException { .getFinalResult() .forEach(recognizedForm -> recognizedForm.getFields().forEach((fieldText, fieldValue) -> { System.out.printf("Field text: %s%n", fieldText); - System.out.printf("Field value: %s%n", fieldValue.getFieldValue()); + System.out.printf("Field value: %s%n", fieldValue.getValue()); System.out.printf("Confidence score: %.2f%n", fieldValue.getConfidence()); })); // END: com.azure.ai.formrecognizer.FormRecognizerClient.beginRecognizeCustomForms#InputStream-long-string-recognizeOptions @@ -309,38 +308,57 @@ public void beginRecognizeReceiptsFromUrl() { */ public void beginRecognizeReceiptsFromUrlWithOptions() { // BEGIN: com.azure.ai.formrecognizer.FormRecognizerClient.beginRecognizeReceiptsFromUrl#string-recognizeOptions - String receiptUrl = "{file_source_url}"; + String receiptUrl = "{receipt_url}"; formRecognizerClient.beginRecognizeReceiptsFromUrl(receiptUrl).getFinalResult() .forEach(recognizedReceipt -> { - Map recognizedFields = recognizedReceipt.getRecognizedForm().getFields(); - FormField merchantNameField = recognizedFields.get("MerchantName"); - if (merchantNameField.getFieldValue().getType() == FieldValueType.STRING) { - System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantNameField.getFieldValue().asString(), - merchantNameField.getConfidence()); + Map> recognizedFields = recognizedReceipt.getFields(); + FormField merchantNameField = recognizedFields.get("MerchantName"); + if (merchantNameField != null) { + if (FieldValueType.STRING.equals(merchantNameField.getValueType())) { + String merchantName = FieldValueType.STRING.cast(merchantNameField); + System.out.printf("Merchant Name: %s, confidence: %.2f%n", + merchantName, merchantNameField.getConfidence()); + } } - FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField.getFieldValue().getType() == FieldValueType.DATE) { - System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDateField.getFieldValue().asDate(), - transactionDateField.getConfidence()); + + FormField merchantPhoneNumberField = recognizedFields.get("MerchantPhoneNumber"); + if (merchantPhoneNumberField != null) { + if (FieldValueType.PHONE_NUMBER.equals(merchantNameField.getValueType())) { + String merchantAddress = FieldValueType.PHONE_NUMBER.cast(merchantPhoneNumberField); + System.out.printf("Merchant Phone number: %s, confidence: %.2f%n", + merchantAddress, merchantPhoneNumberField.getConfidence()); + } + } + + FormField transactionDateField = recognizedFields.get("TransactionDate"); + if (transactionDateField != null) { + if (FieldValueType.DATE.equals(transactionDateField.getValueType())) { + LocalDate transactionDate = FieldValueType.DATE.cast(transactionDateField); + System.out.printf("Transaction Date: %s, confidence: %.2f%n", + transactionDate, transactionDateField.getConfidence()); + } } - FormField receiptItemsField = recognizedFields.get("Items"); - System.out.printf("Receipt Items: %n"); - if (receiptItemsField.getFieldValue().getType() == FieldValueType.LIST) { - List receiptItems = receiptItemsField.getFieldValue().asList(); - receiptItems.forEach(receiptItem -> { - if (receiptItem.getFieldValue().getType() == FieldValueType.MAP) { - receiptItem.getFieldValue().asMap().forEach((key, formField) -> { - if (key.equals("Quantity")) { - if (formField.getFieldValue().getType() == FieldValueType.INTEGER) { - System.out.printf("Quantity: %s, confidence: %.2f%n", - formField.getFieldValue().asInteger(), formField.getConfidence()); + + FormField receiptItemsField = recognizedFields.get("Items"); + if (receiptItemsField != null) { + System.out.printf("Receipt Items: %n"); + if (FieldValueType.LIST.equals(receiptItemsField.getValueType())) { + List> receiptItems = FieldValueType.LIST.cast(receiptItemsField); + receiptItems.forEach(receiptItem -> { + if (FieldValueType.MAP.equals(receiptItem.getValueType())) { + Map> formFieldMap = FieldValueType.MAP.cast(receiptItem); + formFieldMap.forEach((key, formField) -> { + if ("Quantity".equals(key)) { + if (FieldValueType.FLOAT.equals(formField.getValueType())) { + Float quantity = FieldValueType.FLOAT.cast(formField); + System.out.printf("Quantity: %d, confidence: %.2f%n", + quantity, formField.getConfidence()); + } } - } - }); - } - }); + }); + } + }); + } } }); // END: com.azure.ai.formrecognizer.FormRecognizerClient.beginRecognizeReceiptsFromUrl#string-recognizeOptions @@ -353,7 +371,7 @@ public void beginRecognizeReceiptsFromUrlWithOptions() { */ public void beginRecognizeReceipts() throws IOException { // BEGIN: com.azure.ai.formrecognizer.FormRecognizerClient.beginRecognizeReceipts#InputStream-long - File receipt = new File("{file_source_url}"); + File receipt = new File("{receipt_url}"); byte[] fileContent = Files.readAllBytes(receipt.toPath()); InputStream targetStream = new ByteArrayInputStream(fileContent); diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsAsync.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsAsync.java index f4e4f182629b..0f670c3d8f94 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsAsync.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsAsync.java @@ -67,81 +67,83 @@ public static void main(final String[] args) throws IOException { } }); - for (int i = 0; i < receiptPageResults.size(); i++) { - RecognizedForm recognizedReceipt = receiptPageResults.get(i); - Map> recognizedFields = recognizedReceipt.getFields(); - System.out.printf("----------- Recognized Receipt page %d -----------%n", i); - FormField merchantNameField = recognizedFields.get("MerchantName"); - if (merchantNameField != null) { - if (FieldValueType.STRING.equals(merchantNameField.getValueType())) { - String merchantName = FieldValueType.STRING.cast(merchantNameField); - System.out.printf("Merchant Name: %s, confidence: %.2f%n", - merchantName, merchantNameField.getConfidence()); + receiptPageResultsMono.subscribe(receiptPageResults -> { + for (int i = 0; i < receiptPageResults.size(); i++) { + RecognizedForm recognizedReceipt = receiptPageResults.get(i); + Map> recognizedFields = recognizedReceipt.getFields(); + System.out.printf("----------- Recognized Receipt page %d -----------%n", i); + FormField merchantNameField = recognizedFields.get("MerchantName"); + if (merchantNameField != null) { + if (FieldValueType.STRING.equals(merchantNameField.getValueType())) { + String merchantName = FieldValueType.STRING.cast(merchantNameField); + System.out.printf("Merchant Name: %s, confidence: %.2f%n", + merchantName, merchantNameField.getConfidence()); + } } - } - FormField merchantPhoneNumberField = recognizedFields.get("MerchantPhoneNumber"); - if (merchantPhoneNumberField != null) { - if (FieldValueType.PHONE_NUMBER.equals(merchantNameField.getValueType())) { - String merchantAddress = FieldValueType.PHONE_NUMBER.cast(merchantPhoneNumberField); - System.out.printf("Merchant Phone number: %s, confidence: %.2f%n", - merchantAddress, merchantPhoneNumberField.getConfidence()); + FormField merchantPhoneNumberField = recognizedFields.get("MerchantPhoneNumber"); + if (merchantPhoneNumberField != null) { + if (FieldValueType.PHONE_NUMBER.equals(merchantNameField.getValueType())) { + String merchantAddress = FieldValueType.PHONE_NUMBER.cast(merchantPhoneNumberField); + System.out.printf("Merchant Phone number: %s, confidence: %.2f%n", + merchantAddress, merchantPhoneNumberField.getConfidence()); + } } - } - FormField merchantAddressField = recognizedFields.get("MerchantAddress"); - if (merchantAddressField != null) { - if (FieldValueType.STRING.equals(merchantNameField.getValueType())) { - String merchantAddress = FieldValueType.STRING.cast(merchantAddressField); - System.out.printf("Merchant Address: %s, confidence: %.2f%n", - merchantAddress, merchantAddressField.getConfidence()); + FormField merchantAddressField = recognizedFields.get("MerchantAddress"); + if (merchantAddressField != null) { + if (FieldValueType.STRING.equals(merchantNameField.getValueType())) { + String merchantAddress = FieldValueType.STRING.cast(merchantAddressField); + System.out.printf("Merchant Address: %s, confidence: %.2f%n", + merchantAddress, merchantAddressField.getConfidence()); + } } - } - FormField transactionDateField = recognizedFields.get("TransactionDate"); - if (transactionDateField != null) { - if (FieldValueType.DATE.equals(transactionDateField.getValueType())) { - LocalDate transactionDate = FieldValueType.DATE.cast(transactionDateField); - System.out.printf("Transaction Date: %s, confidence: %.2f%n", - transactionDate, transactionDateField.getConfidence()); + FormField transactionDateField = recognizedFields.get("TransactionDate"); + if (transactionDateField != null) { + if (FieldValueType.DATE.equals(transactionDateField.getValueType())) { + LocalDate transactionDate = FieldValueType.DATE.cast(transactionDateField); + System.out.printf("Transaction Date: %s, confidence: %.2f%n", + transactionDate, transactionDateField.getConfidence()); + } } - } - FormField receiptItemsField = recognizedFields.get("Items"); - if (receiptItemsField != null) { - System.out.printf("Receipt Items: %n"); - if (FieldValueType.LIST.equals(receiptItemsField.getValueType())) { - List> receiptItems = FieldValueType.LIST.cast(receiptItemsField); - receiptItems.forEach(receiptItem -> { - if (FieldValueType.MAP.equals(receiptItem.getValueType())) { - Map> formFieldMap = FieldValueType.MAP.cast(receiptItem); - formFieldMap.forEach((key, formField) -> { - if ("Name".equals(key)) { - if (FieldValueType.STRING.equals(formField.getValueType())) { - String name = FieldValueType.STRING.cast(formField); - System.out.printf("Name: %s, confidence: %.2fs%n", - name, formField.getConfidence()); + FormField receiptItemsField = recognizedFields.get("Items"); + if (receiptItemsField != null) { + System.out.printf("Receipt Items: %n"); + if (FieldValueType.LIST.equals(receiptItemsField.getValueType())) { + List> receiptItems = FieldValueType.LIST.cast(receiptItemsField); + receiptItems.forEach(receiptItem -> { + if (FieldValueType.MAP.equals(receiptItem.getValueType())) { + Map> formFieldMap = FieldValueType.MAP.cast(receiptItem); + formFieldMap.forEach((key, formField) -> { + if ("Name".equals(key)) { + if (FieldValueType.STRING.equals(formField.getValueType())) { + String name = FieldValueType.STRING.cast(formField); + System.out.printf("Name: %s, confidence: %.2fs%n", + name, formField.getConfidence()); + } } - } - if ("Quantity".equals(key)) { - if (FieldValueType.FLOAT.equals(formField.getValueType())) { - Float quantity = FieldValueType.FLOAT.cast(formField); - System.out.printf("Quantity: %f, confidence: %.2f%n", - quantity, formField.getConfidence()); + if ("Quantity".equals(key)) { + if (FieldValueType.FLOAT.equals(formField.getValueType())) { + Float quantity = FieldValueType.FLOAT.cast(formField); + System.out.printf("Quantity: %f, confidence: %.2f%n", + quantity, formField.getConfidence()); + } } - } - if ("Price".equals(key)) { - if (FieldValueType.FLOAT.equals(formField.getValueType())) { - Float price = FieldValueType.FLOAT.cast(formField); - System.out.printf("Price: %f, confidence: %.2f%n", - price, formField.getConfidence()); + if ("Price".equals(key)) { + if (FieldValueType.FLOAT.equals(formField.getValueType())) { + Float price = FieldValueType.FLOAT.cast(formField); + System.out.printf("Price: %f, confidence: %.2f%n", + price, formField.getConfidence()); + } } - } - if ("TotalPrice".equals(key)) { - if (FieldValueType.FLOAT.equals(formField.getValueType())) { - Float totalPrice = FieldValueType.FLOAT.cast(formField); - System.out.printf("Total Price: %f, confidence: %.2f%n", - totalPrice, formField.getConfidence()); + if ("TotalPrice".equals(key)) { + if (FieldValueType.FLOAT.equals(formField.getValueType())) { + Float totalPrice = FieldValueType.FLOAT.cast(formField); + System.out.printf("Total Price: %f, confidence: %.2f%n", + totalPrice, formField.getConfidence()); + } } }); } diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/StronglyTypedRecognizedForm.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/StronglyTypedRecognizedForm.java index 0cd13c96f56e..912c080ad360 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/StronglyTypedRecognizedForm.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/StronglyTypedRecognizedForm.java @@ -22,7 +22,6 @@ public class StronglyTypedRecognizedForm { * * @param args Unused. Arguments to the program. */ - @SuppressWarnings("unchecked") public static void main(final String[] args) { // Instantiate a client that will be used to call the service. FormRecognizerClient client = new FormRecognizerClientBuilder() diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientTest.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientTest.java index 30de4f63a8e7..5aa35327f249 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientTest.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientTest.java @@ -35,6 +35,7 @@ import static com.azure.ai.formrecognizer.TestUtils.LAYOUT_LOCAL_URL; import static com.azure.ai.formrecognizer.TestUtils.RECEIPT_FILE_LENGTH; import static com.azure.ai.formrecognizer.TestUtils.RECEIPT_LOCAL_URL; +import static com.azure.ai.formrecognizer.TestUtils.RECEIPT_PNG_FILE_LENGTH; import static com.azure.ai.formrecognizer.TestUtils.getReplayableBufferData; import static com.azure.ai.formrecognizer.implementation.Utility.toFluxByteBuffer; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -76,7 +77,7 @@ private FormTrainingAsyncClient getFormTrainingAsyncClient(HttpClient httpClient public void recognizeReceiptData(HttpClient httpClient, FormRecognizerServiceVersion serviceVersion) { client = getFormRecognizerAsyncClient(httpClient, serviceVersion); receiptDataRunner((data, dataLength) -> { - SyncPoller> syncPoller = + SyncPoller> syncPoller = client.beginRecognizeReceipts(toFluxByteBuffer(data), dataLength, new RecognizeOptions() .setContentType(FormContentType.IMAGE_JPEG).setPollInterval(durationTestMode)) .getSyncPoller(); @@ -97,15 +98,21 @@ public void recognizeReceiptDataNullData(HttpClient httpClient, .getSyncPoller()); } - @Override - void recognizeReceiptDataWithContentTypeAutoDetection(HttpClient httpClient, + /** + * Verifies content type will be auto detected when using custom form API with input stream data overload. + */ + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) + @MethodSource("com.azure.ai.formrecognizer.TestUtils#getTestParameters") + public void recognizeReceiptDataWithContentTypeAutoDetection(HttpClient httpClient, FormRecognizerServiceVersion serviceVersion) { client = getFormRecognizerAsyncClient(httpClient, serviceVersion); - SyncPoller> syncPoller = client.beginRecognizeReceipts( + SyncPoller> syncPoller = client.beginRecognizeReceipts( getReplayableBufferData(RECEIPT_LOCAL_URL), RECEIPT_FILE_LENGTH, new RecognizeOptions() .setPollInterval(durationTestMode)).getSyncPoller(); + syncPoller.waitForCompletion(); + validateReceiptResultData(syncPoller.getFinalResult(), false); } /** @@ -116,7 +123,7 @@ void recognizeReceiptDataWithContentTypeAutoDetection(HttpClient httpClient, public void recognizeReceiptDataIncludeFieldElements(HttpClient httpClient, FormRecognizerServiceVersion serviceVersion) { client = getFormRecognizerAsyncClient(httpClient, serviceVersion); receiptDataRunnerFieldElements((data, includeFieldElements) -> { - SyncPoller> syncPoller = client.beginRecognizeReceipts( + SyncPoller> syncPoller = client.beginRecognizeReceipts( toFluxByteBuffer(data), RECEIPT_FILE_LENGTH, new RecognizeOptions() .setContentType(FormContentType.IMAGE_JPEG).setIncludeFieldElements(includeFieldElements) .setPollInterval(durationTestMode)).getSyncPoller(); @@ -134,7 +141,7 @@ public void recognizeReceiptDataWithPngFile(HttpClient httpClient, FormRecognizerServiceVersion serviceVersion) { client = getFormRecognizerAsyncClient(httpClient, serviceVersion); receiptPngDataRunnerFieldElements((data, includeFieldElements) -> { - SyncPoller> syncPoller = + SyncPoller> syncPoller = client.beginRecognizeReceipts(toFluxByteBuffer(data), RECEIPT_PNG_FILE_LENGTH, new RecognizeOptions() .setContentType(FormContentType.IMAGE_PNG).setIncludeFieldElements(includeFieldElements) .setPollInterval(durationTestMode)).getSyncPoller(); @@ -152,7 +159,7 @@ public void recognizeReceiptDataWithBlankPdf(HttpClient httpClient, FormRecognizerServiceVersion serviceVersion) { client = getFormRecognizerAsyncClient(httpClient, serviceVersion); blankPdfDataRunner((data, dataLength) -> { - SyncPoller> syncPoller = + SyncPoller> syncPoller = client.beginRecognizeReceipts(toFluxByteBuffer(data), dataLength, new RecognizeOptions() .setContentType(FormContentType.APPLICATION_PDF).setPollInterval(durationTestMode)) .getSyncPoller(); @@ -166,12 +173,13 @@ public void recognizeReceiptDataWithBlankPdf(HttpClient httpClient, public void recognizeReceiptFromDataMultiPage(HttpClient httpClient, FormRecognizerServiceVersion serviceVersion) { client = getFormRecognizerAsyncClient(httpClient, serviceVersion); multipageFromDataRunner((data, dataLength) -> { - SyncPoller> syncPoller = client.beginRecognizeReceipts( + SyncPoller> syncPoller = client.beginRecognizeReceipts( toFluxByteBuffer(data), dataLength, new RecognizeOptions() .setContentType(FormContentType.APPLICATION_PDF).setPollInterval(durationTestMode)) .getSyncPoller(); syncPoller.waitForCompletion(); validateMultipageReceiptData(syncPoller.getFinalResult()); + }); } // Receipt - URL @@ -183,11 +191,9 @@ public void recognizeReceiptFromDataMultiPage(HttpClient httpClient, FormRecogni @MethodSource("com.azure.ai.formrecognizer.TestUtils#getTestParameters") public void recognizeReceiptSourceUrl(HttpClient httpClient, FormRecognizerServiceVersion serviceVersion) { client = getFormRecognizerAsyncClient(httpClient, serviceVersion); - receiptDataRunnerTextDetails((data, includeTextContent) -> { + receiptSourceUrlRunner(sourceUrl -> { SyncPoller> syncPoller = - client.beginRecognizeReceipts(new RecognizeOptions(toFluxByteBuffer(data), RECEIPT_FILE_LENGTH) - .setFormContentType(FormContentType.IMAGE_JPEG).setIncludeTextContent(includeTextContent)) - .getSyncPoller(); + client.beginRecognizeReceiptsFromUrl(sourceUrl).getSyncPoller(); syncPoller.waitForCompletion(); validateReceiptResultData(syncPoller.getFinalResult(), false); }); @@ -220,7 +226,7 @@ public void recognizeReceiptFromUrlIncludeFieldElements(HttpClient httpClient, FormRecognizerServiceVersion serviceVersion) { client = getFormRecognizerAsyncClient(httpClient, serviceVersion); receiptSourceUrlRunnerFieldElements((sourceUrl, includeFieldElements) -> { - SyncPoller> syncPoller = client.beginRecognizeReceiptsFromUrl( + SyncPoller> syncPoller = client.beginRecognizeReceiptsFromUrl( sourceUrl, new RecognizeOptions().setIncludeFieldElements(includeFieldElements) .setPollInterval(durationTestMode)).getSyncPoller(); syncPoller.waitForCompletion(); @@ -238,7 +244,7 @@ public void recognizeReceiptSourceUrlWithPngFile(HttpClient httpClient, FormRecognizerServiceVersion serviceVersion) { client = getFormRecognizerAsyncClient(httpClient, serviceVersion); receiptPngSourceUrlRunnerFieldElements((sourceUrl, includeFieldElements) -> { - SyncPoller> syncPoller = client.beginRecognizeReceiptsFromUrl( + SyncPoller> syncPoller = client.beginRecognizeReceiptsFromUrl( sourceUrl, new RecognizeOptions().setIncludeFieldElements(includeFieldElements) .setPollInterval(durationTestMode)) .getSyncPoller(); @@ -252,7 +258,7 @@ sourceUrl, new RecognizeOptions().setIncludeFieldElements(includeFieldElements) public void recognizeReceiptFromUrlMultiPage(HttpClient httpClient, FormRecognizerServiceVersion serviceVersion) { client = getFormRecognizerAsyncClient(httpClient, serviceVersion); multipageFromUrlRunner(fileUrl -> { - SyncPoller> syncPoller = client.beginRecognizeReceiptsFromUrl( + SyncPoller> syncPoller = client.beginRecognizeReceiptsFromUrl( fileUrl, new RecognizeOptions().setPollInterval(durationTestMode)).getSyncPoller(); syncPoller.waitForCompletion(); validateMultipageReceiptData(syncPoller.getFinalResult()); @@ -854,11 +860,6 @@ public void recognizeCustomFormInvalidSourceUrl(HttpClient httpClient, }); } - @Override - void recognizeCustomFormInvalidSourceUrl(HttpClient httpClient, FormRecognizerServiceVersion serviceVersion) { - - } - /** * Verifies an exception thrown for a null model id when recognizing custom form from URL. */ diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTest.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTest.java index 244fe1dabecc..ca8741c86814 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTest.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTest.java @@ -62,7 +62,7 @@ private FormTrainingClient getFormTrainingClient(HttpClient httpClient, public void recognizeReceiptData(HttpClient httpClient, FormRecognizerServiceVersion serviceVersion) { client = getFormRecognizerClient(httpClient, serviceVersion); receiptDataRunner((data, dataLength) -> { - SyncPoller> syncPoller = + SyncPoller> syncPoller = client.beginRecognizeReceipts(data, dataLength, new RecognizeOptions() .setContentType(FormContentType.IMAGE_JPEG).setPollInterval(durationTestMode)); syncPoller.waitForCompletion(); @@ -90,7 +90,7 @@ public void recognizeReceiptDataNullData(HttpClient httpClient, public void recognizeReceiptDataWithContentTypeAutoDetection(HttpClient httpClient, FormRecognizerServiceVersion serviceVersion) { client = getFormRecognizerClient(httpClient, serviceVersion); - SyncPoller> syncPoller = client.beginRecognizeReceipts( + SyncPoller> syncPoller = client.beginRecognizeReceipts( getContentDetectionFileData(RECEIPT_LOCAL_URL), RECEIPT_FILE_LENGTH, new RecognizeOptions() .setPollInterval(durationTestMode)); syncPoller.waitForCompletion(); @@ -106,7 +106,7 @@ public void recognizeReceiptDataWithContentTypeAutoDetection(HttpClient httpClie public void recognizeReceiptDataIncludeFieldElements(HttpClient httpClient, FormRecognizerServiceVersion serviceVersion) { client = getFormRecognizerClient(httpClient, serviceVersion); receiptDataRunnerFieldElements((data, includeFieldElements) -> { - SyncPoller> syncPoller = client.beginRecognizeReceipts( + SyncPoller> syncPoller = client.beginRecognizeReceipts( data, RECEIPT_FILE_LENGTH, new RecognizeOptions().setContentType(FormContentType.IMAGE_JPEG) .setIncludeFieldElements(includeFieldElements).setPollInterval(durationTestMode)); syncPoller.waitForCompletion(); @@ -123,7 +123,7 @@ public void recognizeReceiptDataWithPngFile(HttpClient httpClient, FormRecognizerServiceVersion serviceVersion) { client = getFormRecognizerClient(httpClient, serviceVersion); receiptPngDataRunnerFieldElements((data, includeFieldElements) -> { - SyncPoller> syncPoller = + SyncPoller> syncPoller = client.beginRecognizeReceipts(data, RECEIPT_PNG_FILE_LENGTH, new RecognizeOptions().setContentType( FormContentType.IMAGE_PNG).setIncludeFieldElements(includeFieldElements) .setPollInterval(durationTestMode)); @@ -141,7 +141,7 @@ public void recognizeReceiptDataWithBlankPdf(HttpClient httpClient, FormRecognizerServiceVersion serviceVersion) { client = getFormRecognizerClient(httpClient, serviceVersion); blankPdfDataRunner((data, dataLength) -> { - SyncPoller> syncPoller = client.beginRecognizeReceipts( + SyncPoller> syncPoller = client.beginRecognizeReceipts( data, dataLength, new RecognizeOptions().setContentType(FormContentType.APPLICATION_PDF) .setPollInterval(durationTestMode)); syncPoller.waitForCompletion(); @@ -154,7 +154,7 @@ data, dataLength, new RecognizeOptions().setContentType(FormContentType.APPLICAT public void recognizeReceiptFromDataMultiPage(HttpClient httpClient, FormRecognizerServiceVersion serviceVersion) { client = getFormRecognizerClient(httpClient, serviceVersion); multipageFromDataRunner((data, dataLength) -> { - SyncPoller> syncPoller = client.beginRecognizeReceipts( + SyncPoller> syncPoller = client.beginRecognizeReceipts( data, dataLength, new RecognizeOptions().setContentType(FormContentType.APPLICATION_PDF) .setPollInterval(durationTestMode)); syncPoller.waitForCompletion(); @@ -172,7 +172,7 @@ data, dataLength, new RecognizeOptions().setContentType(FormContentType.APPLICAT public void recognizeReceiptSourceUrl(HttpClient httpClient, FormRecognizerServiceVersion serviceVersion) { client = getFormRecognizerClient(httpClient, serviceVersion); receiptSourceUrlRunner((sourceUrl) -> { - SyncPoller> syncPoller = + SyncPoller> syncPoller = client.beginRecognizeReceiptsFromUrl(sourceUrl); syncPoller.waitForCompletion(); validateReceiptResultData(syncPoller.getFinalResult(), false); @@ -201,7 +201,7 @@ public void recognizeReceiptFromUrlIncludeFieldElements(HttpClient httpClient, FormRecognizerServiceVersion serviceVersion) { client = getFormRecognizerClient(httpClient, serviceVersion); receiptSourceUrlRunnerFieldElements((sourceUrl, includeFieldElements) -> { - SyncPoller> syncPoller = client.beginRecognizeReceiptsFromUrl( + SyncPoller> syncPoller = client.beginRecognizeReceiptsFromUrl( sourceUrl, new RecognizeOptions().setIncludeFieldElements(includeFieldElements) .setPollInterval(durationTestMode)); syncPoller.waitForCompletion(); @@ -219,7 +219,7 @@ public void recognizeReceiptSourceUrlWithPngFile(HttpClient httpClient, FormRecognizerServiceVersion serviceVersion) { client = getFormRecognizerClient(httpClient, serviceVersion); receiptPngSourceUrlRunnerFieldElements((sourceUrl, includeFieldElements) -> { - SyncPoller> syncPoller = client.beginRecognizeReceiptsFromUrl( + SyncPoller> syncPoller = client.beginRecognizeReceiptsFromUrl( sourceUrl, new RecognizeOptions().setIncludeFieldElements(includeFieldElements) .setPollInterval(durationTestMode)); @@ -233,7 +233,7 @@ public void recognizeReceiptSourceUrlWithPngFile(HttpClient httpClient, public void recognizeReceiptFromUrlMultiPage(HttpClient httpClient, FormRecognizerServiceVersion serviceVersion) { client = getFormRecognizerClient(httpClient, serviceVersion); multipageFromUrlRunner(receiptUrl -> { - SyncPoller> syncPoller = client.beginRecognizeReceiptsFromUrl( + SyncPoller> syncPoller = client.beginRecognizeReceiptsFromUrl( receiptUrl, new RecognizeOptions().setPollInterval(durationTestMode)); syncPoller.waitForCompletion(); validateMultipageReceiptData(syncPoller.getFinalResult()); @@ -410,7 +410,7 @@ public void recognizeCustomFormLabeledDataWithJpgContentType(HttpClient httpClie beginTrainingLabeledRunner((trainingFilesUrl, useTrainingLabels) -> { SyncPoller trainingPoller = getFormTrainingClient(httpClient, serviceVersion).beginTraining(trainingFilesUrl, useTrainingLabels, - null, durationTestMode); + null, durationTestMode); trainingPoller.waitForCompletion(); SyncPoller> syncPoller = client.beginRecognizeCustomForms( diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTestBase.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTestBase.java index 06c12f2655af..6cc01b8b9c22 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTestBase.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTestBase.java @@ -253,7 +253,8 @@ private static void validateBoundingBoxData(List expectedBoundingBox, Bou } } - private static void validateFieldValueTransforms(FieldValue expectedFieldValue, FormField actualFormField, + @SuppressWarnings("unchecked") + private static void validateFieldValueTransforms(FieldValue expectedFieldValue, FormField actualFormField, List readResults, boolean includeFieldElements) { if (expectedFieldValue != null) { if (expectedFieldValue.getBoundingBox() != null) { @@ -492,7 +493,7 @@ abstract void recognizeCustomFormUrlMultiPageLabeled(HttpClient httpClient, FormRecognizerServiceVersion serviceVersion); // Receipt - void validateReceiptDataFields(Map> actualRecognizedReceiptFields, boolean includeFieldElements) { + void validateReceiptDataFields(Map> actualRecognizedReceiptFields, boolean includeFieldElements) { final AnalyzeResult analyzeResult = getAnalyzeRawResponse().getAnalyzeResult(); List readResults = analyzeResult.getReadResults(); DocumentResult documentResult = analyzeResult.getDocumentResults().get(0); @@ -501,9 +502,8 @@ void validateReceiptDataFields(Map> actualRecognizedReceip assertEquals(expectedReceiptFields.get("ReceiptType").getValueString(), FieldValueType.STRING.cast(actualRecognizedReceiptFields.get("ReceiptType"))); assertEquals(expectedReceiptFields.get("ReceiptType").getConfidence(), - actualRecognizedFormFields.get("ReceiptType").getConfidence()); + actualRecognizedReceiptFields.get("ReceiptType").getConfidence()); validateFieldValueTransforms(expectedReceiptFields.get("MerchantName"), -<<<<<<< HEAD actualRecognizedReceiptFields.get("MerchantName"), readResults, includeFieldElements); validateFieldValueTransforms(expectedReceiptFields.get("MerchantPhoneNumber"), actualRecognizedReceiptFields.get("MerchantPhoneNumber"), readResults, includeFieldElements); @@ -548,23 +548,13 @@ void validateContentResultData(List actualFormPageList, boolean includ } } -<<<<<<< HEAD - void validateReceiptResultData(List actualReceiptList, boolean includeFieldElements) { - final AnalyzeResult rawResponse = getAnalyzeRawResponse().getAnalyzeResult(); - for (int i = 0; i < actualReceiptList.size(); i++) { - final RecognizedReceipt actualReceipt = actualReceiptList.get(i); - validateLabeledData(actualReceipt.getRecognizedForm(), includeFieldElements, rawResponse.getReadResults(), - rawResponse.getDocumentResults().get(i)); - validateReceiptDataFields(actualReceipt.getRecognizedForm().getFields(), includeFieldElements); -======= - void validateReceiptResultData(List actualReceiptList, boolean includeTextContent) { + void validateReceiptResultData(List actualReceiptList, boolean includeFieldElements) { final AnalyzeResult rawResponse = getAnalyzeRawResponse().getAnalyzeResult(); for (int i = 0; i < actualReceiptList.size(); i++) { final RecognizedForm actualReceipt = actualReceiptList.get(i); - validateLabeledData(actualReceipt, includeTextContent, rawResponse.getReadResults(), + validateLabeledData(actualReceipt, includeFieldElements, rawResponse.getReadResults(), rawResponse.getDocumentResults().get(i)); - validateReceiptDataFields(actualReceipt.getFields(), includeTextContent); ->>>>>>> 6c5c3d603c... receipt design update + validateReceiptDataFields(actualReceipt.getFields(), includeFieldElements); } } @@ -752,15 +742,9 @@ static void validateMultiPageDataLabeled(List actualRecognizedFo assertEquals(3, recognizedForm.getPages().size()); recognizedForm.getFields().forEach((label, formField) -> { assertNotNull(formField.getName()); -<<<<<<< HEAD - assertNotNull(formField.getFieldValue()); + assertNotNull(formField.getValue()); assertNotNull(formField.getValueData().getText()); assertNotNull(formField.getLabelData().getText()); -======= - assertNotNull(formField.getValue()); - assertNotNull(formField.getValueText().getText()); - assertNotNull(formField.getLabelText().getText()); ->>>>>>> 15ade76b8b... update changelog and add casting in samples }); }); } @@ -771,15 +755,10 @@ static void validateMultiPageDataUnlabeled(List actualRecognized assertEquals(1, (long) recognizedForm.getPages().size()); recognizedForm.getFields().forEach((label, formField) -> { assertNotNull(formField.getName()); -<<<<<<< HEAD - assertNotNull(formField.getFieldValue()); + assertNotNull(formField.getValue()); assertNotNull(formField.getValueData().getText()); assertNotNull(formField.getLabelData().getText()); -======= - assertNotNull(formField.getValue()); - assertNotNull(formField.getValueText().getText()); - assertNotNull(formField.getLabelText().getText()); ->>>>>>> 15ade76b8b... update changelog and add casting in samples + }); }); } diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormTrainingAsyncClientTest.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormTrainingAsyncClientTest.java index 7d660cffb838..804537d907f1 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormTrainingAsyncClientTest.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormTrainingAsyncClientTest.java @@ -12,7 +12,7 @@ import com.azure.ai.formrecognizer.models.FormRecognizerException; import com.azure.ai.formrecognizer.models.OperationResult; import com.azure.ai.formrecognizer.models.RecognizeOptions; -import com.azure.ai.formrecognizer.models.RecognizedReceipt; +import com.azure.ai.formrecognizer.models.RecognizedForm; import com.azure.ai.formrecognizer.models.TrainingFileFilter; import com.azure.ai.formrecognizer.training.FormTrainingAsyncClient; import com.azure.core.exception.HttpResponseException; @@ -70,7 +70,7 @@ void getFormRecognizerClientAndValidate(HttpClient httpClient, FormRecognizerSer FormRecognizerAsyncClient formRecognizerClient = getFormTrainingAsyncClient(httpClient, serviceVersion) .getFormRecognizerAsyncClient(); blankPdfDataRunner(data -> { - SyncPoller> syncPoller = + SyncPoller> syncPoller = formRecognizerClient.beginRecognizeReceipts(toFluxByteBuffer(data), BLANK_FORM_FILE_LENGTH, new RecognizeOptions() .setContentType(FormContentType.APPLICATION_PDF) diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormTrainingClientTest.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormTrainingClientTest.java index beb6aa4bd0fd..340889097b86 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormTrainingClientTest.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormTrainingClientTest.java @@ -13,7 +13,7 @@ import com.azure.ai.formrecognizer.models.FormRecognizerException; import com.azure.ai.formrecognizer.models.OperationResult; import com.azure.ai.formrecognizer.models.RecognizeOptions; -import com.azure.ai.formrecognizer.models.RecognizedReceipt; +import com.azure.ai.formrecognizer.models.RecognizedForm; import com.azure.ai.formrecognizer.models.TrainingFileFilter; import com.azure.ai.formrecognizer.training.FormTrainingClient; import com.azure.core.exception.HttpResponseException; @@ -55,7 +55,7 @@ public void getFormRecognizerClientAndValidate(HttpClient httpClient, FormRecogn FormRecognizerClient formRecognizerClient = getFormTrainingClient(httpClient, serviceVersion) .getFormRecognizerClient(); blankPdfDataRunner(data -> { - SyncPoller> syncPoller = + SyncPoller> syncPoller = formRecognizerClient.beginRecognizeReceipts(data, BLANK_FORM_FILE_LENGTH, new RecognizeOptions() .setContentType(FormContentType.APPLICATION_PDF).setPollInterval(durationTestMode)); syncPoller.waitForCompletion(); diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormTrainingClientTestBase.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormTrainingClientTestBase.java index cc3ed0e43fd8..3ce2fd70e2a5 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormTrainingClientTestBase.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormTrainingClientTestBase.java @@ -12,7 +12,7 @@ import com.azure.ai.formrecognizer.models.CustomFormSubmodel; import com.azure.ai.formrecognizer.models.ErrorInformation; import com.azure.ai.formrecognizer.models.FormRecognizerError; -import com.azure.ai.formrecognizer.models.RecognizedReceipt; +import com.azure.ai.formrecognizer.models.RecognizedForm; import com.azure.ai.formrecognizer.models.TrainingDocumentInfo; import com.azure.ai.formrecognizer.training.FormTrainingClientBuilder; import com.azure.core.credential.AzureKeyCredential; @@ -348,10 +348,10 @@ String getEndpoint() { : Configuration.getGlobalConfiguration().get(AZURE_FORM_RECOGNIZER_ENDPOINT); } - void validateBlankPdfResultData(List actualReceiptList) { + void validateBlankPdfResultData(List actualReceiptList) { assertEquals(1, actualReceiptList.size()); - final RecognizedReceipt actualReceipt = actualReceiptList.get(0); - assertTrue(actualReceipt.getRecognizedForm().getFields().isEmpty()); + final RecognizedForm actualReceipt = actualReceiptList.get(0); + assertTrue(actualReceipt.getFields().isEmpty()); } void blankPdfDataRunner(Consumer testRunner) { From b3f9ae47994460dacf2189bd67a294c88357bb14 Mon Sep 17 00:00:00 2001 From: Sameeksha Vaity Date: Mon, 6 Jul 2020 09:22:09 -0700 Subject: [PATCH 7/9] add best value conversion --- .../checkstyle/checkstyle-suppressions.xml | 2 + .../azure/ai/formrecognizer/Transforms.java | 4 +- .../formrecognizer/models/FieldValueType.java | 223 +++++---- .../ai/formrecognizer/Authentication.java | 8 +- ...ognizerAsyncClientJavaDocCodeSnippets.java | 24 +- ...rmRecognizerClientJavaDocCodeSnippets.java | 12 +- .../ai/formrecognizer/ReadmeSamples.java | 8 +- .../ai/formrecognizer/RecognizeReceipts.java | 16 +- .../RecognizeReceiptsAsync.java | 16 +- .../RecognizeReceiptsFromUrl.java | 16 +- .../RecognizeReceiptsFromUrlAsync.java | 16 +- .../StronglyTypedRecognizedForm.java | 10 +- .../FieldValueTypeCastTest.java | 429 ++++++++++++++++++ .../FormRecognizerClientTestBase.java | 4 +- 14 files changed, 628 insertions(+), 160 deletions(-) create mode 100644 sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FieldValueTypeCastTest.java diff --git a/eng/code-quality-reports/src/main/resources/checkstyle/checkstyle-suppressions.xml b/eng/code-quality-reports/src/main/resources/checkstyle/checkstyle-suppressions.xml index 11048593d743..e7baf627fd47 100755 --- a/eng/code-quality-reports/src/main/resources/checkstyle/checkstyle-suppressions.xml +++ b/eng/code-quality-reports/src/main/resources/checkstyle/checkstyle-suppressions.xml @@ -417,6 +417,8 @@ + + diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/Transforms.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/Transforms.java index eef4208bd74c..9ddbefa914a1 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/Transforms.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/Transforms.java @@ -262,11 +262,11 @@ private static FormField setFormField(FieldData labelText, String key, FieldV break; case INTEGER: value = new FormField<>(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText, - key, fieldValue.getValueInteger(), valueText, FieldValueType.INTEGER); + key, fieldValue.getValueInteger(), valueText, FieldValueType.LONG); break; case NUMBER: value = new FormField<>(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText, - key, fieldValue.getValueNumber(), valueText, FieldValueType.FLOAT); + key, fieldValue.getValueNumber(), valueText, FieldValueType.DOUBLE); break; case ARRAY: value = new FormField<>(setDefaultConfidenceValue(fieldValue.getConfidence()), null, key, diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValueType.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValueType.java index 56d1a016bc01..a2c908d1f050 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValueType.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValueType.java @@ -3,70 +3,175 @@ package com.azure.ai.formrecognizer.models; -import com.azure.core.util.ExpandableStringEnum; import com.azure.core.util.logging.ClientLogger; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; import java.util.Objects; /** * Define enum values for FieldValue types. */ -public final class FieldValueType extends ExpandableStringEnum { - private final ClientLogger logger = new ClientLogger(FieldValueType.class); - +@SuppressWarnings("unchecked") +public enum FieldValueType { /** * Static value string for FieldValueType. */ - public static final FieldValueType STRING = fromString("string"); + STRING { + @Override + public T cast(FormField formField) { + if (getDefaultOrNull(formField)) { + return null; + } + return (T) String.valueOf(formField.getValue()); + } + }, /** * Static value date for FieldValueType. */ - public static final FieldValueType DATE = fromString("date"); + DATE { + @Override + public T cast(FormField formField) { + if (getDefaultOrNull(formField)) { + return null; + } + if (this == formField.getValueType()) { + return (T) formField.getValue(); + } else if (STRING == formField.getValueType()) { + return (T) LocalDate.parse(formField.getValue().toString(), DateTimeFormatter.ofPattern("yyyy/MM/dd")); + } else { + throw LOGGER.logExceptionAsError(new UnsupportedOperationException(String.format("Cannot cast from " + + "field value of type %s to type %s", formField.getValueType(), DATE))); + } + } + }, /** * Static value time for FieldValueType. */ - public static final FieldValueType TIME = fromString("time"); + TIME { + @Override + public T cast(FormField formField) { + if (getDefaultOrNull(formField)) { + return null; + } + if (this == formField.getValueType()) { + return (T) formField.getValue(); + } else if (STRING == formField.getValueType()) { + return (T) LocalTime.parse(formField.getValue().toString(), DateTimeFormatter.ofPattern("HH:mm:ss")); + } else { + throw LOGGER.logExceptionAsError(new UnsupportedOperationException(String.format("Cannot cast from " + + "field value of type %s to type %s", formField.getValueType(), TIME))); + } + } + }, /** * Static value phone number for FieldValueType. */ - public static final FieldValueType PHONE_NUMBER = fromString("phoneNumber"); + PHONE_NUMBER { + @Override + public T cast(FormField formField) { + if (getDefaultOrNull(formField)) { + return null; + } + if (this == formField.getValueType()) { + return (T) formField.getValue(); + } else if (STRING == formField.getValueType()) { + return (T) formField.getValue().toString(); + } else { + throw LOGGER.logExceptionAsError(new UnsupportedOperationException(String.format("Cannot cast from " + + "field value of type %s to type %s", formField.getValueType(), PHONE_NUMBER))); + } + } + }, /** - * Static value float for FieldValueType. + * Static value double for FieldValueType. */ - public static final FieldValueType FLOAT = fromString("number"); + DOUBLE { + @Override + public T cast(FormField formField) { + if (getDefaultOrNull(formField)) { + return null; + } + if (this == formField.getValueType()) { + return (T) formField.getValue(); + } else if (STRING == formField.getValueType()) { + return (T) Double.valueOf(formField.getValue().toString()); + } else { + throw LOGGER.logExceptionAsError(new UnsupportedOperationException(String.format("Cannot cast from " + + "field value of type %s to type %s", formField.getValueType(), DOUBLE))); + } + } + }, /** - * Static value integer for FieldValueType. + * Static value long for FieldValueType. */ - public static final FieldValueType INTEGER = fromString("integer"); + LONG { + @Override + public T cast(FormField formField) { + if (getDefaultOrNull(formField)) { + return null; + } + if (this == formField.getValueType()) { + return (T) formField.getValue(); + } else if (STRING == formField.getValueType()) { + return (T) Long.valueOf(formField.getValue().toString()); + } else { + throw LOGGER.logExceptionAsError(new UnsupportedOperationException(String.format("Cannot cast from " + + "field value of type %s to type %s", formField.getValueType(), LONG))); + } + } + }, /** * Static value list for FieldValueType. */ - public static final FieldValueType LIST = fromString("array"); + LIST { + @Override + public T cast(FormField formField) { + return getCollectionTypeCast(formField); + } + }, /** * Static value map for FieldValueType. */ - public static final FieldValueType MAP = fromString("object"); + MAP { + @Override + public T cast(FormField formField) { + return getCollectionTypeCast(formField); + } + }; - /** - * Parses a serialized value to a {@link FieldValueType} instance. - * - * @param value the serialized value to parse. - * - * @return the parsed FieldValueType object, or null if unable to parse. - */ - public static FieldValueType fromString(String value) { - return fromString(value, FieldValueType.class); + static boolean getDefaultOrNull(FormField formField) { + Objects.requireNonNull(formField, "'formField' cannot be null"); + if (formField.getValue() == null) { + return true; + } + return false; } + T getCollectionTypeCast(FormField formField) { + if (getDefaultOrNull(formField)) { + return null; + } + if (this == formField.getValueType()) { + return (T) formField.getValue(); + } else { + throw LOGGER.logExceptionAsError(new UnsupportedOperationException(String.format("Cannot cast from " + + "field value of type %s to type %s", formField.getValueType(), this))); + } + } + + private static final ClientLogger LOGGER = new ClientLogger(FieldValueType.class); + /** - * Converts the form field value to a specific expandable string enum type. + * Converts the form field value to a specific enum type. * * @param formField The recognized field value that needs to be converted. * @param the class of the field. @@ -75,73 +180,5 @@ public static FieldValueType fromString(String value) { * @throws UnsupportedOperationException if the {@code formField} type does not match the casting value type. * @throws NullPointerException if {@code formField} is {@code null} */ - @SuppressWarnings({"unchecked"}) - public T cast(FormField formField) { - Objects.requireNonNull(formField, "'formField' cannot be null"); - if (DATE.equals(this)) { - if (DATE == formField.getValueType()) { - return (T) formField.getValue(); - } else { - logger.logExceptionAsError(new UnsupportedOperationException(String.format("Unsupported cast operation " - + "or field value of type: %s", formField.getValueType()))); - } - } - if (TIME.equals(this)) { - if (TIME == formField.getValueType()) { - return (T) formField.getValue(); - } else { - logger.logExceptionAsError(new UnsupportedOperationException(String.format("Unsupported cast operation " - + "or field value of type: %s", formField.getValueType()))); - } - } - if (PHONE_NUMBER.equals(this)) { - if (PHONE_NUMBER == formField.getValueType()) { - return (T) formField.getValue(); - } else { - throw logger.logExceptionAsError(new UnsupportedOperationException(String.format("Unsupported cast " - + "operation for field value of type: %s", formField.getValueType()))); - } - } - if (LIST.equals(this)) { - if (LIST == formField.getValueType()) { - return (T) formField.getValue(); - } else { - throw logger.logExceptionAsError(new UnsupportedOperationException(String.format("Unsupported cast " - + "operation or field value of type: %s", formField.getValueType()))); - } - } - if (MAP.equals(this)) { - if (MAP == formField.getValueType()) { - return (T) formField.getValue(); - } else { - throw logger.logExceptionAsError(new UnsupportedOperationException(String.format("Unsupported cast " - + "operation or field value of type: %s", formField.getValueType()))); - } - } - if (FLOAT.equals(this)) { - if (FLOAT == formField.getValueType()) { - return (T) formField.getValue(); - } else { - throw logger.logExceptionAsError(new UnsupportedOperationException(String.format("Unsupported cast " - + "operation or field value of type: %s", formField.getValueType()))); - } - } - if (INTEGER.equals(this)) { - if (INTEGER == formField.getValueType()) { - return (T) formField.getValue(); - } else { - throw logger.logExceptionAsError(new UnsupportedOperationException(String.format("Unsupported cast " - + "operation or field value of type: %s", formField.getValueType()))); - } - } - if (STRING.equals(this)) { - if (STRING == formField.getValueType()) { - return (T) formField.getValue(); - } else { - throw logger.logExceptionAsError(new UnsupportedOperationException(String.format("Unsupported cast " - + "operation or field value of type: %s", formField.getValueType()))); - } - } - return (T) formField.getValue(); - } + public abstract T cast(FormField formField); } diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/Authentication.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/Authentication.java index e68d4ad05556..121fa1b04037 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/Authentication.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/Authentication.java @@ -90,8 +90,8 @@ private static void beginRecognizeCustomFormsFromUrl(FormRecognizerClient formRe List receiptPageResults = recognizeReceiptPoller.getFinalResult(); for (int i = 0; i < receiptPageResults.size(); i++) { - RecognizedForm recognizedReceipt = receiptPageResults.get(i); - Map> recognizedFields = recognizedReceipt.getFields(); + RecognizedForm recognizedForm = receiptPageResults.get(i); + Map> recognizedFields = recognizedForm.getFields(); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); if (merchantNameField != null) { @@ -137,8 +137,8 @@ private static void beginRecognizeCustomFormsFromUrl(FormRecognizerClient formRe } } if ("Quantity".equals(key)) { - if (FieldValueType.FLOAT.equals(formField.getValueType())) { - Float quantity = FieldValueType.FLOAT.cast(formField); + if (FieldValueType.DOUBLE.equals(formField.getValueType())) { + Float quantity = FieldValueType.DOUBLE.cast(formField); System.out.printf("Quantity: %f, confidence: %.2f%n", quantity, formField.getConfidence()); } diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientJavaDocCodeSnippets.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientJavaDocCodeSnippets.java index ba76ad4a4bfe..2f5da61ccf40 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientJavaDocCodeSnippets.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientJavaDocCodeSnippets.java @@ -290,8 +290,8 @@ public void beginRecognizeReceiptsFromUrl() { recognizePollingOperation.getFinalResult()) .subscribe(recognizedReceipts -> { for (int i = 0; i < recognizedReceipts.size(); i++) { - RecognizedForm recognizedReceipt = recognizedReceipts.get(i); - Map> recognizedFields = recognizedReceipt.getFields(); + RecognizedForm recognizedForm = recognizedReceipts.get(i); + Map> recognizedFields = recognizedForm.getFields(); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); if (merchantNameField != null) { @@ -331,8 +331,8 @@ public void beginRecognizeReceiptsFromUrl() { Map> formFieldMap = FieldValueType.MAP.cast(receiptItem); formFieldMap.forEach((key, formField) -> { if ("Quantity".equals(key)) { - if (FieldValueType.FLOAT.equals(formField.getValueType())) { - Float quantity = FieldValueType.FLOAT.cast(formField); + if (FieldValueType.DOUBLE.equals(formField.getValueType())) { + Float quantity = FieldValueType.DOUBLE.cast(formField); System.out.printf("Quantity: %f, confidence: %.2f%n", quantity, formField.getConfidence()); } @@ -434,8 +434,8 @@ public void beginRecognizeReceipts() throws IOException { // if training polling operation completed, retrieve the final result. recognizePollingOperation.getFinalResult().subscribe(recognizedReceipts -> { for (int i = 0; i < recognizedReceipts.size(); i++) { - RecognizedForm recognizedReceipt = recognizedReceipts.get(i); - Map> recognizedFields = recognizedReceipt.getFields(); + RecognizedForm recognizedForm = recognizedReceipts.get(i); + Map> recognizedFields = recognizedForm.getFields(); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); if (merchantNameField != null) { @@ -475,8 +475,8 @@ public void beginRecognizeReceipts() throws IOException { Map> formFieldMap = FieldValueType.MAP.cast(receiptItem); formFieldMap.forEach((key, formField) -> { if ("Quantity".equals(key)) { - if (FieldValueType.FLOAT.equals(formField.getValueType())) { - Float quantity = FieldValueType.FLOAT.cast(formField); + if (FieldValueType.DOUBLE.equals(formField.getValueType())) { + Float quantity = FieldValueType.DOUBLE.cast(formField); System.out.printf("Quantity: %f, confidence: %.2f%n", quantity, formField.getConfidence()); } @@ -511,8 +511,8 @@ public void beginRecognizeReceiptsWithOptions() throws IOException { // if training polling operation completed, retrieve the final result. recognizePollingOperation.getFinalResult().subscribe(recognizedReceipts -> { for (int i = 0; i < recognizedReceipts.size(); i++) { - RecognizedForm recognizedReceipt = recognizedReceipts.get(i); - Map> recognizedFields = recognizedReceipt.getFields(); + RecognizedForm recognizedForm = recognizedReceipts.get(i); + Map> recognizedFields = recognizedForm.getFields(); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); if (merchantNameField != null) { @@ -552,8 +552,8 @@ public void beginRecognizeReceiptsWithOptions() throws IOException { Map> formFieldMap = FieldValueType.MAP.cast(receiptItem); formFieldMap.forEach((key, formField) -> { if ("Quantity".equals(key)) { - if (FieldValueType.FLOAT.equals(formField.getValueType())) { - Float quantity = FieldValueType.FLOAT.cast(formField); + if (FieldValueType.DOUBLE.equals(formField.getValueType())) { + Float quantity = FieldValueType.DOUBLE.cast(formField); System.out.printf("Quantity: %f, confidence: %.2f%n", quantity, formField.getConfidence()); } diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerClientJavaDocCodeSnippets.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerClientJavaDocCodeSnippets.java index ce9f24f1819d..47b3d56459c4 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerClientJavaDocCodeSnippets.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerClientJavaDocCodeSnippets.java @@ -288,8 +288,8 @@ public void beginRecognizeReceiptsFromUrl() { Map> formFieldMap = FieldValueType.MAP.cast(receiptItem); formFieldMap.forEach((key, formField) -> { if ("Quantity".equals(key)) { - if (FieldValueType.FLOAT.equals(formField.getValueType())) { - Float quantity = FieldValueType.FLOAT.cast(formField); + if (FieldValueType.DOUBLE.equals(formField.getValueType())) { + Float quantity = FieldValueType.DOUBLE.cast(formField); System.out.printf("Quantity: %d, confidence: %.2f%n", quantity, formField.getConfidence()); } @@ -415,8 +415,8 @@ public void beginRecognizeReceipts() throws IOException { Map> formFieldMap = FieldValueType.MAP.cast(receiptItem); formFieldMap.forEach((key, formField) -> { if ("Quantity".equals(key)) { - if (FieldValueType.FLOAT.equals(formField.getValueType())) { - Float quantity = FieldValueType.FLOAT.cast(formField); + if (FieldValueType.DOUBLE.equals(formField.getValueType())) { + Float quantity = FieldValueType.DOUBLE.cast(formField); System.out.printf("Quantity: %d, confidence: %.2f%n", quantity, formField.getConfidence()); } @@ -487,8 +487,8 @@ public void beginRecognizeReceiptsWithOptions() throws IOException { Map> formFieldMap = FieldValueType.MAP.cast(receiptItem); formFieldMap.forEach((key, formField) -> { if ("Quantity".equals(key)) { - if (FieldValueType.FLOAT.equals(formField.getValueType())) { - Float quantity = FieldValueType.FLOAT.cast(formField); + if (FieldValueType.DOUBLE.equals(formField.getValueType())) { + Float quantity = FieldValueType.DOUBLE.cast(formField); System.out.printf("Quantity: %d, confidence: %.2f%n", quantity, formField.getConfidence()); } diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java index ad481a37d77f..cf4f57a3d3b5 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java @@ -147,8 +147,8 @@ public void recognizeReceipt() { List receiptPageResults = syncPoller.getFinalResult(); for (int i = 0; i < receiptPageResults.size(); i++) { - RecognizedForm recognizedReceipt = receiptPageResults.get(i); - Map> recognizedFields = recognizedReceipt.getFields(); + RecognizedForm recognizedForm = receiptPageResults.get(i); + Map> recognizedFields = recognizedForm.getFields(); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); if (merchantNameField != null) { @@ -187,8 +187,8 @@ public void recognizeReceipt() { Map> formFieldMap = FieldValueType.MAP.cast(receiptItem); formFieldMap.forEach((key, formField) -> { if ("Quantity".equals(key)) { - if (FieldValueType.FLOAT.equals(formField.getValueType())) { - Float quantity = FieldValueType.FLOAT.cast(formField); + if (FieldValueType.DOUBLE.equals(formField.getValueType())) { + Float quantity = FieldValueType.DOUBLE.cast(formField); System.out.printf("Quantity: %f, confidence: %.2f%n", quantity, formField.getConfidence()); } diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceipts.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceipts.java index c98bc29d99e9..e425a535d253 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceipts.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceipts.java @@ -51,8 +51,8 @@ public static void main(final String[] args) throws IOException { List receiptPageResults = analyzeReceiptPoller.getFinalResult(); for (int i = 0; i < receiptPageResults.size(); i++) { - RecognizedForm recognizedReceipt = receiptPageResults.get(i); - Map> recognizedFields = recognizedReceipt.getFields(); + RecognizedForm recognizedForm = receiptPageResults.get(i); + Map> recognizedFields = recognizedForm.getFields(); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); if (merchantNameField != null) { @@ -107,22 +107,22 @@ public static void main(final String[] args) throws IOException { } } if ("Quantity".equals(key)) { - if (FieldValueType.FLOAT.equals(formField.getValueType())) { - Float quantity = FieldValueType.FLOAT.cast(formField); + if (FieldValueType.DOUBLE.equals(formField.getValueType())) { + Float quantity = FieldValueType.DOUBLE.cast(formField); System.out.printf("Quantity: %f, confidence: %.2f%n", quantity, formField.getConfidence()); } } if ("Price".equals(key)) { - if (FieldValueType.FLOAT.equals(formField.getValueType())) { - Float price = FieldValueType.FLOAT.cast(formField); + if (FieldValueType.DOUBLE.equals(formField.getValueType())) { + Float price = FieldValueType.DOUBLE.cast(formField); System.out.printf("Price: %f, confidence: %.2f%n", price, formField.getConfidence()); } } if ("TotalPrice".equals(key)) { - if (FieldValueType.FLOAT.equals(formField.getValueType())) { - Float totalPrice = FieldValueType.FLOAT.cast(formField); + if (FieldValueType.DOUBLE.equals(formField.getValueType())) { + Float totalPrice = FieldValueType.DOUBLE.cast(formField); System.out.printf("Total Price: %f, confidence: %.2f%n", totalPrice, formField.getConfidence()); } diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsAsync.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsAsync.java index 0f670c3d8f94..d9c1b3849187 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsAsync.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsAsync.java @@ -69,8 +69,8 @@ public static void main(final String[] args) throws IOException { receiptPageResultsMono.subscribe(receiptPageResults -> { for (int i = 0; i < receiptPageResults.size(); i++) { - RecognizedForm recognizedReceipt = receiptPageResults.get(i); - Map> recognizedFields = recognizedReceipt.getFields(); + RecognizedForm recognizedForm = receiptPageResults.get(i); + Map> recognizedFields = recognizedForm.getFields(); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); if (merchantNameField != null) { @@ -125,22 +125,22 @@ public static void main(final String[] args) throws IOException { } } if ("Quantity".equals(key)) { - if (FieldValueType.FLOAT.equals(formField.getValueType())) { - Float quantity = FieldValueType.FLOAT.cast(formField); + if (FieldValueType.DOUBLE.equals(formField.getValueType())) { + Float quantity = FieldValueType.DOUBLE.cast(formField); System.out.printf("Quantity: %f, confidence: %.2f%n", quantity, formField.getConfidence()); } } if ("Price".equals(key)) { - if (FieldValueType.FLOAT.equals(formField.getValueType())) { - Float price = FieldValueType.FLOAT.cast(formField); + if (FieldValueType.DOUBLE.equals(formField.getValueType())) { + Float price = FieldValueType.DOUBLE.cast(formField); System.out.printf("Price: %f, confidence: %.2f%n", price, formField.getConfidence()); } } if ("TotalPrice".equals(key)) { - if (FieldValueType.FLOAT.equals(formField.getValueType())) { - Float totalPrice = FieldValueType.FLOAT.cast(formField); + if (FieldValueType.DOUBLE.equals(formField.getValueType())) { + Float totalPrice = FieldValueType.DOUBLE.cast(formField); System.out.printf("Total Price: %f, confidence: %.2f%n", totalPrice, formField.getConfidence()); } diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrl.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrl.java index 74f017b95e7b..df9c21ca7d09 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrl.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrl.java @@ -42,8 +42,8 @@ public static void main(final String[] args) { List receiptPageResults = recognizeReceiptPoller.getFinalResult(); for (int i = 0; i < receiptPageResults.size(); i++) { - RecognizedForm recognizedReceipt = receiptPageResults.get(i); - Map> recognizedFields = recognizedReceipt.getFields(); + RecognizedForm recognizedForm = receiptPageResults.get(i); + Map> recognizedFields = recognizedForm.getFields(); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); if (merchantNameField != null) { @@ -98,22 +98,22 @@ public static void main(final String[] args) { } } if ("Quantity".equals(key)) { - if (FieldValueType.FLOAT.equals(formField.getValueType())) { - Float quantity = FieldValueType.FLOAT.cast(formField); + if (FieldValueType.DOUBLE.equals(formField.getValueType())) { + Float quantity = FieldValueType.DOUBLE.cast(formField); System.out.printf("Quantity: %f, confidence: %.2f%n", quantity, formField.getConfidence()); } } if ("Price".equals(key)) { - if (FieldValueType.FLOAT.equals(formField.getValueType())) { - Float price = FieldValueType.FLOAT.cast(formField); + if (FieldValueType.DOUBLE.equals(formField.getValueType())) { + Float price = FieldValueType.DOUBLE.cast(formField); System.out.printf("Price: %f, confidence: %.2f%n", price, formField.getConfidence()); } } if ("TotalPrice".equals(key)) { - if (FieldValueType.FLOAT.equals(formField.getValueType())) { - Float totalPrice = FieldValueType.FLOAT.cast(formField); + if (FieldValueType.DOUBLE.equals(formField.getValueType())) { + Float totalPrice = FieldValueType.DOUBLE.cast(formField); System.out.printf("Total Price: %f, confidence: %.2f%n", totalPrice, formField.getConfidence()); } diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrlAsync.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrlAsync.java index 19cbd0886da5..4df763056b81 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrlAsync.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceiptsFromUrlAsync.java @@ -56,8 +56,8 @@ public static void main(final String[] args) { receiptPageResults.subscribe(recognizedReceipts -> { for (int i = 0; i < recognizedReceipts.size(); i++) { - RecognizedForm recognizedReceipt = recognizedReceipts.get(i); - Map> recognizedFields = recognizedReceipt.getFields(); + RecognizedForm recognizedForm = recognizedReceipts.get(i); + Map> recognizedFields = recognizedForm.getFields(); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); if (merchantNameField != null) { @@ -113,22 +113,22 @@ public static void main(final String[] args) { } } if ("Quantity".equals(key)) { - if (FieldValueType.FLOAT.equals(formField.getValueType())) { - Float quantity = FieldValueType.FLOAT.cast(formField); + if (FieldValueType.DOUBLE.equals(formField.getValueType())) { + Float quantity = FieldValueType.DOUBLE.cast(formField); System.out.printf("Quantity: %f, confidence: %.2f%n", quantity, formField.getConfidence()); } } if ("Price".equals(key)) { - if (FieldValueType.FLOAT.equals(formField.getValueType())) { - Float price = FieldValueType.FLOAT.cast(formField); + if (FieldValueType.DOUBLE.equals(formField.getValueType())) { + Float price = FieldValueType.DOUBLE.cast(formField); System.out.printf("Price: %f, confidence: %.2f%n", price, formField.getConfidence()); } } if ("TotalPrice".equals(key)) { - if (FieldValueType.FLOAT.equals(formField.getValueType())) { - Float totalPrice = FieldValueType.FLOAT.cast(formField); + if (FieldValueType.DOUBLE.equals(formField.getValueType())) { + Float totalPrice = FieldValueType.DOUBLE.cast(formField); System.out.printf("Total Price: %f, confidence: %.2f%n", totalPrice, formField.getConfidence()); } diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/StronglyTypedRecognizedForm.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/StronglyTypedRecognizedForm.java index 912c080ad360..f0144fdc9a56 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/StronglyTypedRecognizedForm.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/StronglyTypedRecognizedForm.java @@ -37,10 +37,10 @@ public static void main(final String[] args) { List receiptPageResults = recognizeReceiptPoller.getFinalResult(); for (int i = 0; i < receiptPageResults.size(); i++) { - final RecognizedForm recognizedReceipt = receiptPageResults.get(i); + final RecognizedForm recognizedForm = receiptPageResults.get(i); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); // Use Receipt model transform the recognized form to strongly typed US receipt fields - Receipt usReceipt = new Receipt(recognizedReceipt); + Receipt usReceipt = new Receipt(recognizedForm); System.out.printf("Merchant Name: %s, confidence: %.2f%n", usReceipt.getMerchantName().getValue(), usReceipt.getMerchantName().getConfidence()); System.out.printf("Merchant Address: %s, confidence: %.2f%n", @@ -61,15 +61,15 @@ public static void main(final String[] args) { receiptItem.getName().getConfidence()); } if (receiptItem.getQuantity() != null) { - System.out.printf("Quantity: %s, confidence: %.2f%n", receiptItem.getQuantity().getValue(), + System.out.printf("Quantity: %f, confidence: %.2f%n", receiptItem.getQuantity().getValue(), receiptItem.getQuantity().getConfidence()); } if (receiptItem.getPrice() != null) { - System.out.printf("Price: %s, confidence: %.2f%n", receiptItem.getPrice().getValue(), + System.out.printf("Price: %f, confidence: %.2f%n", receiptItem.getPrice().getValue(), receiptItem.getPrice().getConfidence()); } if (receiptItem.getTotalPrice() != null) { - System.out.printf("Total Price: %s, confidence: %.2f%n", + System.out.printf("Total Price: %f, confidence: %.2f%n", receiptItem.getTotalPrice().getValue(), receiptItem.getTotalPrice().getConfidence()); } }); diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FieldValueTypeCastTest.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FieldValueTypeCastTest.java new file mode 100644 index 000000000000..1c74acbfcb93 --- /dev/null +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FieldValueTypeCastTest.java @@ -0,0 +1,429 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.formrecognizer; + +import com.azure.ai.formrecognizer.models.FieldValueType; +import com.azure.ai.formrecognizer.models.FormField; +import org.junit.jupiter.api.Test; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class FieldValueTypeCastTest { + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to Date. + */ + @Test + public void toDateFromDate() { + LocalDate inputDate = LocalDate.of(2006, 6, 6); + LocalDate actualDate = FieldValueType.DATE.cast(new FormField<>(0, null, null, + inputDate, null, FieldValueType.DATE)); + assertEquals(inputDate, actualDate); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to Date from String. + */ + @Test + public void toDateFromString() { + String inputDateString = "2006/06/06"; + LocalDate inputDate = LocalDate.parse(inputDateString, DateTimeFormatter.ofPattern("yyyy/MM/dd")); + LocalDate actualDate = FieldValueType.DATE.cast(new FormField<>(0, null, null, + inputDateString, null, FieldValueType.STRING)); + assertEquals(inputDate, actualDate); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to Date from null field value. + */ + @Test + public void toDateFromNull() { + assertNull(FieldValueType.DATE.cast(new FormField<>(0, null, null, + null, null, FieldValueType.STRING))); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to Date from any other + * FieldValueType except for String. + */ + @Test + public void toDateFromPhoneNumber() { + final UnsupportedOperationException unsupportedOperationException = + assertThrows(UnsupportedOperationException.class, () -> + FieldValueType.DATE.cast(new FormField<>(0, null, null, + "19876543210", null, FieldValueType.PHONE_NUMBER))); + assertEquals(unsupportedOperationException.getMessage(), "Cannot cast from field value of " + + "type PHONE_NUMBER to type DATE"); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to TIME. + */ + @Test + public void toTimeFromTime() { + LocalTime inputTime = LocalTime.parse("13:59:00", DateTimeFormatter.ofPattern("HH:mm:ss")); + LocalTime actualTime = FieldValueType.TIME.cast(new FormField<>(0, null, null, + inputTime, null, FieldValueType.TIME)); + assertEquals(inputTime, actualTime); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to TIME from String. + */ + @Test + public void toTimeFromString() { + String inputTimeString = "13:59:00"; + LocalTime inputTime = LocalTime.parse(inputTimeString, DateTimeFormatter.ofPattern("HH:mm:ss")); + LocalTime actualTime = FieldValueType.TIME.cast(new FormField<>(0, null, null, + inputTimeString, null, FieldValueType.STRING)); + assertEquals(inputTime, actualTime); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to TIME from null field value. + */ + @Test + public void toTimeFromNull() { + assertNull(FieldValueType.TIME.cast(new FormField<>(0, null, null, + null, null, FieldValueType.TIME))); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to TIME from any other + * FieldValueType except for String. + */ + @Test + public void toTimeFromPhoneNumber() { + final UnsupportedOperationException unsupportedOperationException = + assertThrows(UnsupportedOperationException.class, () -> + FieldValueType.TIME.cast(new FormField<>(0, null, null, + "19876543210", null, FieldValueType.PHONE_NUMBER))); + assertEquals(unsupportedOperationException.getMessage(), "Cannot cast from field value of " + + "type PHONE_NUMBER to type TIME"); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to list. + */ + @Test + public void toListFromList() { + List inputList = new ArrayList<>(Arrays.asList("1")); + List actualList = FieldValueType.LIST.cast(new FormField<>(0, null, null, + inputList, null, FieldValueType.LIST)); + assertEquals(inputList, actualList); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to list from String. + */ + @Test + public void toListFromString() { + String listString = "1"; + final UnsupportedOperationException unsupportedOperationException = + assertThrows(UnsupportedOperationException.class, () -> + FieldValueType.LIST.cast(new FormField<>(0, null, null, + listString, null, FieldValueType.STRING))); + assertEquals(unsupportedOperationException.getMessage(), "Cannot cast from field value of " + + "type STRING to type LIST"); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to list from null field value. + */ + @Test + public void toListFromNull() { + assertNull(FieldValueType.LIST.cast(new FormField<>(0, null, null, + null, null, FieldValueType.LIST))); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to list from any other + * FieldValueType except for String. + */ + @Test + public void toListFromTime() { + LocalTime inputTime = LocalTime.parse("13:59:00", DateTimeFormatter.ofPattern("HH:mm:ss")); + final UnsupportedOperationException unsupportedOperationException = + assertThrows(UnsupportedOperationException.class, () -> + FieldValueType.LIST.cast(new FormField<>(0, null, null, + inputTime, null, FieldValueType.TIME))); + assertEquals(unsupportedOperationException.getMessage(), "Cannot cast from field value of " + + "type TIME to type LIST"); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to phone number. + */ + @Test + public void toPhoneNumberFromPhoneNumber() { + String phoneNumber = "19876543210"; + String actualPhoneNumber = FieldValueType.PHONE_NUMBER.cast(new FormField<>(0, null, null, + phoneNumber, null, FieldValueType.PHONE_NUMBER)); + assertEquals(phoneNumber, actualPhoneNumber); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to phone number from String. + */ + @Test + public void toPhoneNumberFromString() { + String phoneNumber = "19876543210"; + String actualPhoneNumber = FieldValueType.PHONE_NUMBER.cast(new FormField<>(0, null, null, + phoneNumber, null, FieldValueType.STRING)); + assertEquals(phoneNumber, actualPhoneNumber); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to phone number from null field value. + */ + @Test + public void toPhoneNumberFromNull() { + assertNull(FieldValueType.PHONE_NUMBER.cast(new FormField<>(0, null, null, + null, null, FieldValueType.PHONE_NUMBER))); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to phone number from any other + * FieldValueType except for String. + */ + @Test + public void toPhoneNumberFromTime() { + LocalTime inputTime = LocalTime.parse("13:59:00", DateTimeFormatter.ofPattern("HH:mm:ss")); + final UnsupportedOperationException unsupportedOperationException = + assertThrows(UnsupportedOperationException.class, () -> + FieldValueType.PHONE_NUMBER.cast(new FormField<>(0, null, null, + inputTime, null, FieldValueType.TIME))); + assertEquals(unsupportedOperationException.getMessage(), "Cannot cast from field value of " + + "type TIME to type PHONE_NUMBER"); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to map. + */ + @Test + public void toMapFromMap() { + Map inputMap = Collections.singletonMap("key", "value"); + Map actualList = FieldValueType.MAP.cast(new FormField<>(0, null, null, + inputMap, null, FieldValueType.MAP)); + assertEquals(inputMap, actualList); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to map from String. + */ + @Test + public void toMapFromString() { + String listString = "1"; + final UnsupportedOperationException unsupportedOperationException = + assertThrows(UnsupportedOperationException.class, () -> + FieldValueType.MAP.cast(new FormField<>(0, null, null, + listString, null, FieldValueType.STRING))); + assertEquals(unsupportedOperationException.getMessage(), "Cannot cast from field value of " + + "type STRING to type MAP"); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to map from null field value. + */ + @Test + public void toMapFromNull() { + assertNull(FieldValueType.MAP.cast(new FormField<>(0, null, null, + null, null, FieldValueType.MAP))); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to map from any other + * FieldValueType except for String. + */ + @Test + public void toMapFromTime() { + LocalTime inputTime = LocalTime.parse("13:59:00", DateTimeFormatter.ofPattern("HH:mm:ss")); + final UnsupportedOperationException unsupportedOperationException = + assertThrows(UnsupportedOperationException.class, () -> + FieldValueType.MAP.cast(new FormField<>(0, null, null, + inputTime, null, FieldValueType.TIME))); + assertEquals(unsupportedOperationException.getMessage(), "Cannot cast from field value of " + + "type TIME to type MAP"); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to double. + */ + @Test + public void toDoubleFromDouble() { + Double inputDouble = 2.2; + Double actualDoubleValue = FieldValueType.DOUBLE.cast(new FormField<>(0, null, null, + inputDouble, null, FieldValueType.DOUBLE)); + assertEquals(inputDouble, actualDoubleValue); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to double from String. + */ + @Test + public void toDoubleFromString() { + String doubleString = "2.2"; + Double actualDouble = FieldValueType.DOUBLE.cast(new FormField<>(0, null, null, + doubleString, null, FieldValueType.STRING)); + assertEquals(Double.valueOf(doubleString), actualDouble); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to double from null field value. + */ + @Test + public void toDoubleFromNull() { + assertNull(FieldValueType.DOUBLE.cast(new FormField<>(0, null, null, + null, null, FieldValueType.DOUBLE))); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to double from any other + * FieldValueType except for String. + */ + @Test + public void toDoubleFromTime() { + LocalTime inputTime = LocalTime.parse("13:59:00", DateTimeFormatter.ofPattern("HH:mm:ss")); + final UnsupportedOperationException unsupportedOperationException = + assertThrows(UnsupportedOperationException.class, () -> + FieldValueType.DOUBLE.cast(new FormField<>(0, null, null, + inputTime, null, FieldValueType.TIME))); + assertEquals(unsupportedOperationException.getMessage(), "Cannot cast from field value of " + + "type TIME to type DOUBLE"); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to long. + */ + @Test + public void toLongFromLong() { + long inputDouble = 22; + Long actualLongValue = FieldValueType.LONG.cast(new FormField<>(0, null, null, + inputDouble, null, FieldValueType.LONG)); + assertEquals(inputDouble, actualLongValue); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to long from String. + */ + @Test + public void toLongFromString() { + String inputDoubleString = "22"; + Long actualLongValue = FieldValueType.LONG.cast(new FormField<>(0, null, null, + inputDoubleString, null, FieldValueType.STRING)); + assertEquals(Long.valueOf(inputDoubleString), actualLongValue); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to long from null field value. + */ + @Test + public void toLongFromNull() { + assertNull(FieldValueType.LONG.cast(new FormField<>(0, null, null, + null, null, FieldValueType.LONG))); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to long from any other + * FieldValueType except for String. + */ + @Test + public void toLongFromTime() { + LocalTime inputTime = LocalTime.parse("13:59:00", DateTimeFormatter.ofPattern("HH:mm:ss")); + final UnsupportedOperationException unsupportedOperationException = + assertThrows(UnsupportedOperationException.class, () -> + FieldValueType.LONG.cast(new FormField<>(0, null, null, + inputTime, null, FieldValueType.TIME))); + assertEquals(unsupportedOperationException.getMessage(), "Cannot cast from field value of " + + "type TIME to type LONG"); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to String from TIME. + */ + @Test + public void toStringFromTime() { + LocalTime inputTime = LocalTime.parse("13:59:00", DateTimeFormatter.ofPattern("HH:mm:ss")); + String localTimeString = FieldValueType.STRING.cast(new FormField<>(0, null, null, + inputTime, null, FieldValueType.TIME)); + assertEquals(inputTime.toString(), localTimeString); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to String from String. + */ + @Test + public void toStringFromString() { + String stringValue = "String value"; + String actualStringValue = FieldValueType.STRING.cast(new FormField<>(0, null, null, + stringValue, null, FieldValueType.STRING)); + assertEquals(stringValue, actualStringValue); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to String from double. + */ + @Test + public void toStringFromDouble() { + Double doubleValue = 2.2; + String actualDouble = FieldValueType.STRING.cast(new FormField<>(0, null, null, + doubleValue, null, FieldValueType.DOUBLE)); + assertEquals(String.valueOf(doubleValue), actualDouble); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to long from String. + */ + @Test + public void toStringFromLong() { + Long inputLong = 22L; + String actualLongValue = FieldValueType.STRING.cast(new FormField<>(0, null, null, + inputLong, null, FieldValueType.LONG)); + assertEquals(String.valueOf(inputLong), actualLongValue); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to String from Map. + */ + @Test + public void toStringFromMap() { + Map inputMap = Collections.singletonMap("key", "value"); + String stringMap = FieldValueType.STRING.cast(new FormField<>(0, null, null, + inputMap, null, FieldValueType.MAP)); + assertEquals(inputMap.toString(), stringMap); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to String from Phone number. + */ + @Test + public void toStringFromPhoneNumber() { + String phoneNumber = "19876543210"; + String actualPhoneNumber = FieldValueType.STRING.cast(new FormField<>(0, null, null, + phoneNumber, null, FieldValueType.PHONE_NUMBER)); + assertEquals(phoneNumber, actualPhoneNumber); + } + + /** + * Test for {@link com.azure.ai.formrecognizer.models.FieldValueType#cast(FormField)} to String from List. + */ + @Test + public void toStringFromList() { + List inputList = Collections.singletonList("1"); + String actualStringList = FieldValueType.STRING.cast(new FormField<>(0, null, null, + inputList, null, FieldValueType.LIST)); + assertEquals(inputList.toString(), actualStringList); + } +} diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTestBase.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTestBase.java index 6cc01b8b9c22..4fa322aff744 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTestBase.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/test/java/com/azure/ai/formrecognizer/FormRecognizerClientTestBase.java @@ -267,7 +267,7 @@ private static void validateFieldValueTransforms(FieldValue expectedFieldValue, } switch (expectedFieldValue.getType()) { case NUMBER: - assertEquals(expectedFieldValue.getValueNumber(), FieldValueType.FLOAT.cast(actualFormField)); + assertEquals(expectedFieldValue.getValueNumber(), FieldValueType.DOUBLE.cast(actualFormField)); break; case DATE: assertEquals(expectedFieldValue.getValueDate(), FieldValueType.DATE.cast(actualFormField)); @@ -280,7 +280,7 @@ private static void validateFieldValueTransforms(FieldValue expectedFieldValue, assertEquals(expectedFieldValue.getValueString(), FieldValueType.STRING.cast(actualFormField)); break; case INTEGER: - assertEquals(expectedFieldValue.getValueInteger(), FieldValueType.INTEGER.cast(actualFormField)); + assertEquals(expectedFieldValue.getValueInteger(), FieldValueType.LONG.cast(actualFormField)); break; case PHONE_NUMBER: assertEquals(expectedFieldValue.getValuePhoneNumber(), FieldValueType.PHONE_NUMBER.cast(actualFormField)); From 0d91645c9f4b7c7a7ad0312fccc8a2dbe38fd5f0 Mon Sep 17 00:00:00 2001 From: Sameeksha Vaity Date: Mon, 6 Jul 2020 09:28:56 -0700 Subject: [PATCH 8/9] add readme update --- .../azure-ai-formrecognizer/README.md | 31 +++++++++---------- ...ognizerAsyncClientJavaDocCodeSnippets.java | 7 +++-- ...rmRecognizerClientJavaDocCodeSnippets.java | 4 +-- .../ai/formrecognizer/ReadmeSamples.java | 6 ++-- .../ai/formrecognizer/RecognizeReceipts.java | 3 +- 5 files changed, 25 insertions(+), 26 deletions(-) diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/README.md b/sdk/formrecognizer/azure-ai-formrecognizer/README.md index fd4e921a88a6..6fef4de94f21 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/README.md +++ b/sdk/formrecognizer/azure-ai-formrecognizer/README.md @@ -81,14 +81,14 @@ resource, or by running the following Azure CLI command to get the key from the az cognitiveservices account keys list --resource-group --name ``` Use the API key as the credential parameter to authenticate the client: - + ```java FormRecognizerClient formRecognizerClient = new FormRecognizerClientBuilder() .credential(new AzureKeyCredential("{key}")) .endpoint("{endpoint}") .buildClient(); ``` - + ```java FormTrainingClient formTrainingClient = new FormTrainingClientBuilder() .credential(new AzureKeyCredential("{key}")) @@ -98,7 +98,7 @@ FormTrainingClient formTrainingClient = new FormTrainingClientBuilder() The Azure Form Recognizer client library provides a way to **rotate the existing key**. - + ```java AzureKeyCredential credential = new AzureKeyCredential("{key}"); FormRecognizerClient formRecognizerClient = new FormRecognizerClientBuilder() @@ -137,7 +137,7 @@ Authorization is easiest using [DefaultAzureCredential][wiki_identity]. It finds running environment. For more information about using Azure Active Directory authorization with Form Recognizer, please refer to [the associated documentation][aad_authorization]. - + ```java TokenCredential credential = new DefaultAzureCredentialBuilder().build(); FormRecognizerClient formRecognizerClient = new FormRecognizerClientBuilder() @@ -177,7 +177,7 @@ followed by polling the service at intervals to determine whether the operation succeeded, to get the result. Methods that train models or recognize values from forms are modeled as long-running operations. The client exposes -a `begin` method that returns a `SyncPoller` or `PollerFlux` instance. +a `begin` method that returns a `SyncPoller` or `PollerFlux` instance. Callers should wait for the operation to completed by calling `getFinalResult()` on the returned operation from the `begin` method. Sample code snippets are provided to illustrate using long-running operations [below](#Examples). @@ -195,7 +195,7 @@ The following section provides several code snippets covering some of the most c ### Recognize Forms Using a Custom Model Recognize name/value pairs and table data from forms. These models are trained with your own data, so they're tailored to your forms. You should only recognize forms of the same form type that the custom model was trained on. - + ```java String formUrl = "{form_url}"; String modelId = "{custom_trained_model_id}"; @@ -206,14 +206,13 @@ List recognizedForms = recognizeFormPoller.getFinalResult(); for (int i = 0; i < recognizedForms.size(); i++) { RecognizedForm form = recognizedForms.get(i); - System.out.printf("----------- Recognized Form %d-----------%n", i); + System.out.printf("----------- Recognized Form %d -----------%n", i); System.out.printf("Form type: %s%n", form.getFormType()); form.getFields().forEach((label, formField) -> System.out.printf("Field %s has value %s with confidence score of %f.%n", label, formField.getValueData().getText(), - formField.getConfidence()); - }); - System.out.print("-----------------------------------"); + formField.getConfidence()) + ); } ``` @@ -233,7 +232,7 @@ List contentPageResults = recognizeContentPoller.getFinalResult(); for (int i = 0; i < contentPageResults.size(); i++) { FormPage formPage = contentPageResults.get(i); - System.out.printf("----Recognizing content for page %d----%n", i); + System.out.printf("----Recognizing content for page %d ----%n", i); // Table information System.out.printf("Has width: %f and height: %f, measured with unit: %s.%n", formPage.getWidth(), formPage.getHeight(), @@ -260,8 +259,8 @@ SyncPoller> syncPoller = List receiptPageResults = syncPoller.getFinalResult(); for (int i = 0; i < receiptPageResults.size(); i++) { - RecognizedForm recognizedReceipt = receiptPageResults.get(i); - Map> recognizedFields = recognizedReceipt.getFields(); + RecognizedForm recognizedForm = receiptPageResults.get(i); + Map> recognizedFields = recognizedForm.getFields(); System.out.printf("----------- Recognized Receipt page %d -----------%n", i); FormField merchantNameField = recognizedFields.get("MerchantName"); if (merchantNameField != null) { @@ -300,8 +299,8 @@ for (int i = 0; i < receiptPageResults.size(); i++) { Map> formFieldMap = FieldValueType.MAP.cast(receiptItem); formFieldMap.forEach((key, formField) -> { if ("Quantity".equals(key)) { - if (FieldValueType.FLOAT.equals(formField.getValueType())) { - Float quantity = FieldValueType.FLOAT.cast(formField); + if (FieldValueType.DOUBLE.equals(formField.getValueType())) { + Float quantity = FieldValueType.DOUBLE.cast(formField); System.out.printf("Quantity: %f, confidence: %.2f%n", quantity, formField.getConfidence()); } @@ -387,7 +386,7 @@ to provide an invalid file source URL an `HttpResponseException` would be raised In the following code snippet, the error is handled gracefully by catching the exception and display the additional information about the error. - + ```java try { formRecognizerClient.beginRecognizeContentFromUrl("invalidSourceUrl"); diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientJavaDocCodeSnippets.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientJavaDocCodeSnippets.java index 2f5da61ccf40..3ac36fa32243 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientJavaDocCodeSnippets.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerAsyncClientJavaDocCodeSnippets.java @@ -404,8 +404,8 @@ public void beginRecognizeReceiptsFromUrlWithOptions() { Map> formFieldMap = FieldValueType.MAP.cast(receiptItem); formFieldMap.forEach((key, formField) -> { if ("Quantity".equals(key)) { - if (FieldValueType.FLOAT.equals(formField.getValueType())) { - Float quantity = FieldValueType.FLOAT.cast(formField); + if (FieldValueType.DOUBLE.equals(formField.getValueType())) { + Float quantity = FieldValueType.DOUBLE.cast(formField); System.out.printf("Quantity: %f, confidence: %.2f%n", quantity, formField.getConfidence()); } @@ -486,7 +486,8 @@ public void beginRecognizeReceipts() throws IOException { }); } } - }})); + } + })); // END: com.azure.ai.formrecognizer.FormRecognizerAsyncClient.beginRecognizeReceipts#Flux-long } diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerClientJavaDocCodeSnippets.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerClientJavaDocCodeSnippets.java index 47b3d56459c4..3e88ff23d154 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerClientJavaDocCodeSnippets.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/FormRecognizerClientJavaDocCodeSnippets.java @@ -349,8 +349,8 @@ public void beginRecognizeReceiptsFromUrlWithOptions() { Map> formFieldMap = FieldValueType.MAP.cast(receiptItem); formFieldMap.forEach((key, formField) -> { if ("Quantity".equals(key)) { - if (FieldValueType.FLOAT.equals(formField.getValueType())) { - Float quantity = FieldValueType.FLOAT.cast(formField); + if (FieldValueType.DOUBLE.equals(formField.getValueType())) { + Float quantity = FieldValueType.DOUBLE.cast(formField); System.out.printf("Quantity: %d, confidence: %.2f%n", quantity, formField.getConfidence()); } diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java index cf4f57a3d3b5..e1851afe0cd4 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java @@ -7,7 +7,6 @@ import com.azure.ai.formrecognizer.models.CustomFormModel; import com.azure.ai.formrecognizer.models.CustomFormModelInfo; import com.azure.ai.formrecognizer.models.FieldValueType; -import com.azure.ai.formrecognizer.models.FormContentType; import com.azure.ai.formrecognizer.models.FormField; import com.azure.ai.formrecognizer.models.FormPage; import com.azure.ai.formrecognizer.models.OperationResult; @@ -96,14 +95,13 @@ public void recognizeCustomForm() { for (int i = 0; i < recognizedForms.size(); i++) { RecognizedForm form = recognizedForms.get(i); - System.out.printf("----------- Recognized Form %d-----------%n", i); + System.out.printf("----------- Recognized Form %d -----------%n", i); System.out.printf("Form type: %s%n", form.getFormType()); form.getFields().forEach((label, formField) -> System.out.printf("Field %s has value %s with confidence score of %f.%n", label, formField.getValueData().getText(), formField.getConfidence()) ); - System.out.print("-----------------------------------"); } } @@ -125,7 +123,7 @@ public void recognizeContent() throws IOException { for (int i = 0; i < contentPageResults.size(); i++) { FormPage formPage = contentPageResults.get(i); - System.out.printf("----Recognizing content for page %d----%n", i); + System.out.printf("----Recognizing content for page %d ----%n", i); // Table information System.out.printf("Has width: %f and height: %f, measured with unit: %s.%n", formPage.getWidth(), formPage.getHeight(), diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceipts.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceipts.java index e425a535d253..cd612e70d4a6 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceipts.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/java/com/azure/ai/formrecognizer/RecognizeReceipts.java @@ -3,6 +3,7 @@ package com.azure.ai.formrecognizer; +import com.azure.ai.formrecognizer.models.FieldValueType; import com.azure.ai.formrecognizer.models.FormField; import com.azure.ai.formrecognizer.models.OperationResult; import com.azure.ai.formrecognizer.models.RecognizedForm; @@ -45,7 +46,7 @@ public static void main(final String[] args) throws IOException { byte[] fileContent = Files.readAllBytes(sourceFile.toPath()); InputStream targetStream = new ByteArrayInputStream(fileContent); - SyncPoller> analyzeReceiptPoller = + SyncPoller> analyzeReceiptPoller = client.beginRecognizeReceipts(targetStream, sourceFile.length()); List receiptPageResults = analyzeReceiptPoller.getFinalResult(); From 8bc9e149d5c336bf6bffd07a56a520e465b91e11 Mon Sep 17 00:00:00 2001 From: Sameeksha Vaity Date: Mon, 6 Jul 2020 12:30:20 -0700 Subject: [PATCH 9/9] review comments --- .../formrecognizer/models/FieldValueType.java | 23 ++++++++----------- .../ai/formrecognizer/models/FormField.java | 3 +-- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValueType.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValueType.java index a2c908d1f050..975c61ae89c4 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValueType.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FieldValueType.java @@ -21,7 +21,7 @@ public enum FieldValueType { STRING { @Override public T cast(FormField formField) { - if (getDefaultOrNull(formField)) { + if (isFieldValueNull(formField)) { return null; } return (T) String.valueOf(formField.getValue()); @@ -34,7 +34,7 @@ public T cast(FormField formField) { DATE { @Override public T cast(FormField formField) { - if (getDefaultOrNull(formField)) { + if (isFieldValueNull(formField)) { return null; } if (this == formField.getValueType()) { @@ -54,7 +54,7 @@ public T cast(FormField formField) { TIME { @Override public T cast(FormField formField) { - if (getDefaultOrNull(formField)) { + if (isFieldValueNull(formField)) { return null; } if (this == formField.getValueType()) { @@ -74,13 +74,13 @@ public T cast(FormField formField) { PHONE_NUMBER { @Override public T cast(FormField formField) { - if (getDefaultOrNull(formField)) { + if (isFieldValueNull(formField)) { return null; } if (this == formField.getValueType()) { return (T) formField.getValue(); } else if (STRING == formField.getValueType()) { - return (T) formField.getValue().toString(); + return (T) formField.getValue(); } else { throw LOGGER.logExceptionAsError(new UnsupportedOperationException(String.format("Cannot cast from " + "field value of type %s to type %s", formField.getValueType(), PHONE_NUMBER))); @@ -94,7 +94,7 @@ public T cast(FormField formField) { DOUBLE { @Override public T cast(FormField formField) { - if (getDefaultOrNull(formField)) { + if (isFieldValueNull(formField)) { return null; } if (this == formField.getValueType()) { @@ -114,7 +114,7 @@ public T cast(FormField formField) { LONG { @Override public T cast(FormField formField) { - if (getDefaultOrNull(formField)) { + if (isFieldValueNull(formField)) { return null; } if (this == formField.getValueType()) { @@ -148,16 +148,13 @@ public T cast(FormField formField) { } }; - static boolean getDefaultOrNull(FormField formField) { + static boolean isFieldValueNull(FormField formField) { Objects.requireNonNull(formField, "'formField' cannot be null"); - if (formField.getValue() == null) { - return true; - } - return false; + return formField.getValue() == null; } T getCollectionTypeCast(FormField formField) { - if (getDefaultOrNull(formField)) { + if (isFieldValueNull(formField)) { return null; } if (this == formField.getValueType()) { diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FormField.java b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FormField.java index ddcf003a53c1..6eef6b191256 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FormField.java +++ b/sdk/formrecognizer/azure-ai-formrecognizer/src/main/java/com/azure/ai/formrecognizer/models/FormField.java @@ -75,10 +75,9 @@ public T getValue() { } /** - * Get the text, bounding box, and field elements for the field value. * The type of the value of the recognized field. * Possible types include: 'String', - * 'LocalDate', 'LocalTime', 'Integer', 'Float', 'Map', or 'List'. + * 'LocalDate', 'LocalTime', 'Long', 'Double', 'Map', or 'List'. * * @return the type of the value of the field. */