Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions sdk/formrecognizer/azure-ai-formrecognizer/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# Release History

## 1.0.0-beta.3 (Unreleased)
- Add `pageNumber` property to `FormPage` and `FormTable` model
- Remove `pageNumber` property from `FormField` model
- Update FormRecognizer API calls to return a `List` instead of `IterableStream`.
- Fix bug in FormRecognizer API's to support multipage document recognition.
- Add `getFormRecognizerClient()` and `getFormRecognizerAsyncClient()` in FormTrainingClient and FormTrainingAsyncClient
Expand Down
11 changes: 5 additions & 6 deletions sdk/formrecognizer/azure-ai-formrecognizer/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -195,19 +195,18 @@ for (int i = 0; i < contentPageResults.size(); i++) {

### Recognize receipts
Recognize data from a USA sales receipts using a prebuilt model.
<!-- embedme ./src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java#L105-L124 -->
<!-- embedme ./src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java#L105-L123 -->
```java
String receiptUrl = "https://docs.microsoft.com/en-us/azure/cognitive-services/form-recognizer/media"
+ "/contoso-allinone.jpg";
SyncPoller<OperationResult, List<RecognizedReceipt>> syncPoller =
SyncPoller<OperationResult, List<RecognizedReceipt>> syncPoller =
formRecognizerClient.beginRecognizeReceiptsFromUrl(receiptUrl);
List<RecognizedReceipt> receiptPageResults = syncPoller.getFinalResult();

for (int i = 0; i < receiptPageResults.size(); i++) {
System.out.printf("----Recognizing receipt for page %s%n----", i);
RecognizedReceipt recognizedReceipt = receiptPageResults.get(i);
USReceipt usReceipt = ReceiptExtensions.asUSReceipt(recognizedReceipt);
System.out.printf("Page Number: %s%n", usReceipt.getMerchantName().getPageNumber());
System.out.printf("Merchant Name %s%n", usReceipt.getMerchantName().getName());
System.out.printf("Merchant Name Value: %s%n", usReceipt.getMerchantName().getFieldValue());
System.out.printf("Merchant Address %s%n", usReceipt.getMerchantAddress().getName());
Expand All @@ -223,7 +222,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].
<!-- embedme ./src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java#L128-L148 -->
<!-- embedme ./src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java#L127-L147 -->
```java
String trainingFilesUrl = "{training_set_SAS_URL}";
SyncPoller<OperationResult, CustomFormModel> trainingPoller =
Expand All @@ -250,7 +249,7 @@ customFormModel.getSubModels().forEach(customFormSubModel -> {

### Manage your models
Manage the custom models attached to your account.
<!-- embedme ./src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java#L152-L181 -->
<!-- embedme ./src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java#L151-L180 -->
```java
AtomicReference<String> modelId = new AtomicReference<>();
// First, we see how many custom models we have, and what our limit is
Expand Down Expand Up @@ -292,7 +291,7 @@ to provide an invalid file source URL an `ErrorResponseException` would be raise
In the following code snippet, the error is handled
gracefully by catching the exception and display the additional information about the error.

<!-- embedme ./src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java#L188-L192 -->
<!-- embedme ./src/samples/java/com/azure/ai/formrecognizer/ReadmeSamples.java#L187-L191 -->
```java
try {
formRecognizerClient.beginRecognizeContentFromUrl("invalidSourceUrl");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ static List<FormTable> getPageTables(PageResult pageResultItem, List<ReadResult>
dataTableCell.isHeader() == null ? false : dataTableCell.isHeader(),
dataTableCell.isFooter() == null ? false : dataTableCell.isFooter(),
pageNumber, setReferenceElements(dataTableCell.getElements(), readResults, pageNumber)))
.collect(Collectors.toList())))
.collect(Collectors.toList()), pageNumber))
.collect(Collectors.toList());
}

Expand Down Expand Up @@ -231,7 +231,7 @@ private static Map<String, FormField<?>> getUnlabeledFieldMap(DocumentResult doc
} else {
FieldText labelText = new FieldText(key, null, null, null);
extractedFieldMap.put(key, new FormField<>(DEFAULT_CONFIDENCE_VALUE, labelText,
key, null, null, null));
key, null, null));
}
});
}
Expand All @@ -257,36 +257,36 @@ 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, pageNumber);
key, fieldValue.getValuePhoneNumber(), valueText);
break;
case STRING:
value = new FormField<>(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText,
key, fieldValue.getValueString(), valueText, pageNumber);
key, fieldValue.getValueString(), valueText);
break;
case TIME:
value = new FormField<>(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText,
key, fieldValue.getValueTime(), valueText, pageNumber);
key, fieldValue.getValueTime(), valueText);
break;
case DATE:
value = new FormField<>(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText,
key, fieldValue.getValueDate(), valueText, pageNumber);
key, fieldValue.getValueDate(), valueText);
break;
case INTEGER:
value = new FormField<>(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText,
key, fieldValue.getValueInteger(), valueText, pageNumber);
key, fieldValue.getValueInteger(), valueText);
break;
case NUMBER:
value = new FormField<Number>(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText,
key, fieldValue.getValueNumber(), valueText, pageNumber);
key, fieldValue.getValueNumber(), valueText);
break;
case ARRAY:
value = new FormField<>(setDefaultConfidenceValue(fieldValue.getConfidence()), null, key,
toFormFieldArray(fieldValue.getValueArray(), readResults), null, pageNumber);
toFormFieldArray(fieldValue.getValueArray(), readResults), null);
break;
case OBJECT:
value = new FormField<>(setDefaultConfidenceValue(fieldValue.getConfidence()), labelText,
key, toFormFieldObject(fieldValue.getValueObject(), pageNumber, readResults), valueText,
pageNumber);
key, toFormFieldObject(fieldValue.getValueObject(), pageNumber, readResults), valueText
);
break;
default:
throw LOGGER.logExceptionAsError(new RuntimeException("FieldValue Type not supported"));
Expand Down Expand Up @@ -360,8 +360,8 @@ private static FormPage getFormPage(ReadResult readResultItem, List<FormTable> p
DimensionUnit.fromString(readResultItem.getUnit().toString()),
readResultItem.getWidth(),
perPageLineList,
perPageTableList
);
perPageTableList,
readResultItem.getPage());
}

/**
Expand Down Expand Up @@ -395,7 +395,7 @@ private static Map<String, FormField<?>> getLabeledFieldMap(boolean includeTextD

String fieldName = "field-" + index;
FormField<String> formField = new FormField<>(setDefaultConfidenceValue(keyValuePair.getConfidence()),
labelFieldText, fieldName, keyValuePair.getValue().getText(), valueText, pageNumber);
labelFieldText, fieldName, keyValuePair.getValue().getText(), valueText);
formFieldMap.put(fieldName, formField);
}));
return formFieldMap;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,6 @@ public final class FormField<T> {
*/
private final FieldText valueText;

/*
* The 1 based page number.
*/
private final Integer pageNumber;

/**
* Constructs a FormField object.
*
Expand All @@ -51,16 +46,14 @@ public final class FormField<T> {
* @param name The name the field.
* @param fieldValue The value of the field.
* @param valueText The label value text for the field.
* @param pageNumber The label text value for the field.
*/
public FormField(final float confidence, final FieldText labelText, final String name, final T fieldValue,
final FieldText valueText, final Integer pageNumber) {
final FieldText valueText) {
this.confidence = confidence;
this.labelText = labelText;
this.name = name;
this.fieldValue = fieldValue;
this.valueText = valueText;
this.pageNumber = pageNumber;
}

/**
Expand Down Expand Up @@ -107,13 +100,4 @@ public T getFieldValue() {
public FieldText getValueText() {
return this.valueText;
}

/**
* Get the 1-based page number in the input document.
*
* @return the page number value.
*/
public Integer getPageNumber() {
return this.pageNumber;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,11 @@ public final class FormPage {
*/
private final float width;

/*
* The 1 based page number.
*/
private final Integer pageNumber;

/**
* Constructs a FormPage object.
*
Expand All @@ -54,15 +59,17 @@ public final class FormPage {
* @param width The width of the image/PDF in pixels/inches, respectively.
* @param lines When includeTextDetails is set to true, a list of recognized text lines.
* @param tables List of data tables extracted from the page.
* @param pageNumber the 1-based page number in the input document.
*/
public FormPage(final float height, final float textAngle, final DimensionUnit unit,
final float width, final List<FormLine> lines, final List<FormTable> tables) {
final float width, final List<FormLine> lines, final List<FormTable> tables, final Integer pageNumber) {
this.height = height;
this.textAngle = textAngle;
this.unit = unit;
this.width = width;
this.lines = lines;
this.tables = tables;
this.pageNumber = pageNumber;
}

/**
Expand Down Expand Up @@ -123,5 +130,14 @@ public DimensionUnit getUnit() {
public float getWidth() {
return this.width;
}

/**
* Get the 1-based page number in the input document.
*
* @return the page number value.
*/
public Integer getPageNumber() {
return this.pageNumber;
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,25 @@ public final class FormTable {
*/
private final List<FormTableCell> cells;

/*
* The 1 based page number.
*/
private final Integer pageNumber;

/**
* Constructs a FormTable object.
*
* @param rowCount Number of rows.
* @param columnCount Number of columns.
* @param cells ist of cells contained in the table.
* @param pageNumber the 1-based page number in the input document.
*/
public FormTable(final int rowCount, final int columnCount, final List<FormTableCell> cells) {
public FormTable(final int rowCount, final int columnCount, final List<FormTableCell> cells,
final Integer pageNumber) {
this.rowCount = rowCount;
this.columnCount = columnCount;
this.cells = cells;
this.pageNumber = pageNumber;
}

/**
Expand Down Expand Up @@ -67,4 +75,13 @@ public int getColumnCount() {
public List<FormTableCell> getCells() {
return this.cells;
}

/**
* Get the 1-based page number in the input document.
*
* @return the page number value.
*/
public Integer getPageNumber() {
return this.pageNumber;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,6 @@ public void beginRecognizeCustomFormsFromUrl() {
recognizePollingOperation.getFinalResult().subscribe(recognizedForms ->
recognizedForms.forEach(recognizedForm -> {
recognizedForm.getFields().forEach((fieldText, fieldValue) -> {
System.out.printf("Page number: %s%n", fieldValue.getPageNumber());
System.out.printf("Field text: %s%n", fieldText);
System.out.printf("Field value: %s%n", fieldValue.getFieldValue());
System.out.printf("Confidence score: %.2f%n", fieldValue.getConfidence());
Expand All @@ -95,7 +94,6 @@ public void beginRecognizeCustomFormsFromUrlWithOptions() {
recognizePollingOperation.getFinalResult().subscribe(recognizedForms ->
recognizedForms.forEach(recognizedForm -> {
recognizedForm.getFields().forEach((fieldText, fieldValue) -> {
System.out.printf("Page number: %s%n", fieldValue.getPageNumber());
System.out.printf("Field text: %s%n", fieldText);
System.out.printf("Field value: %s%n", fieldValue.getFieldValue());
System.out.printf("Confidence score: %.2f%n", fieldValue.getConfidence());
Expand Down Expand Up @@ -124,7 +122,6 @@ public void beginRecognizeCustomForms() throws IOException {
recognizePollingOperation.getFinalResult().subscribe(recognizedForms ->
recognizedForms.forEach(recognizedForm -> {
recognizedForm.getFields().forEach((fieldText, fieldValue) -> {
System.out.printf("Page number: %s%n", fieldValue.getPageNumber());
System.out.printf("Field text: %s%n", fieldText);
System.out.printf("Field value: %s%n", fieldValue.getFieldValue());
System.out.printf("Confidence score: %.2f%n", fieldValue.getConfidence());
Expand Down Expand Up @@ -155,7 +152,6 @@ public void beginRecognizeCustomFormsWithOptions() throws IOException {
recognizePollingOperation.getFinalResult().subscribe(recognizedForms ->
recognizedForms.forEach(recognizedForm -> {
recognizedForm.getFields().forEach((fieldText, fieldValue) -> {
System.out.printf("Page number: %s%n", fieldValue.getPageNumber());
System.out.printf("Field text: %s%n", fieldText);
System.out.printf("Field value: %s%n", fieldValue.getFieldValue());
System.out.printf("Confidence score: %.2f%n", fieldValue.getConfidence());
Expand Down Expand Up @@ -277,7 +273,6 @@ public void beginRecognizeReceiptsFromUrl() {
recognizePollingOperation.getFinalResult().subscribe(recognizedReceipts ->
recognizedReceipts.forEach(recognizedReceipt -> {
USReceipt usReceipt = ReceiptExtensions.asUSReceipt(recognizedReceipt);
System.out.printf("Page Number: %s%n", usReceipt.getMerchantName().getPageNumber());
System.out.printf("Merchant Name: %s, confidence: %.2f%n",
usReceipt.getMerchantName().getFieldValue(),
usReceipt.getMerchantName().getConfidence());
Expand Down Expand Up @@ -308,7 +303,6 @@ public void beginRecognizeReceiptsFromUrlWithOptions() {
recognizePollingOperation.getFinalResult().subscribe(recognizedReceipts ->
recognizedReceipts.forEach(recognizedReceipt -> {
USReceipt usReceipt = ReceiptExtensions.asUSReceipt(recognizedReceipt);
System.out.printf("Page Number: %s%n", usReceipt.getMerchantName().getPageNumber());
System.out.printf("Merchant Name: %s, confidence: %.2f%n",
usReceipt.getMerchantName().getFieldValue(),
usReceipt.getMerchantName().getConfidence());
Expand Down Expand Up @@ -342,7 +336,6 @@ public void beginRecognizeReceipts() throws IOException {
recognizePollingOperation.getFinalResult().subscribe(recognizedReceipts ->
recognizedReceipts.forEach(recognizedReceipt -> {
USReceipt usReceipt = ReceiptExtensions.asUSReceipt(recognizedReceipt);
System.out.printf("Page Number: %s%n", usReceipt.getMerchantName().getPageNumber());
System.out.printf("Merchant Name: %s, confidence: %.2f%n",
usReceipt.getMerchantName().getFieldValue(),
usReceipt.getMerchantName().getConfidence());
Expand Down Expand Up @@ -378,7 +371,6 @@ public void beginRecognizeReceiptsWithOptions() throws IOException {
recognizePollingOperation.getFinalResult().subscribe(recognizedReceipts ->
recognizedReceipts.forEach(recognizedReceipt -> {
USReceipt usReceipt = ReceiptExtensions.asUSReceipt(recognizedReceipt);
System.out.printf("Page Number: %s%n", usReceipt.getMerchantName().getPageNumber());
System.out.printf("Merchant Name: %s, confidence: %.2f%n",
usReceipt.getMerchantName().getFieldValue(),
usReceipt.getMerchantName().getConfidence());
Expand Down
Loading