Project: azure-ai-formrecognizer

Microsoft Azure Form Recognizer Client Library for Python

Project Details

Latest version
3.3.2
Home Page
https://github.com/Azure/azure-sdk-for-python
PyPI Page
https://pypi.org/project/azure-ai-formrecognizer/

Project Popularity

PageRank
0.003917536142434984
Number of downloads
406620

Azure Form Recognizer client library for Python

Azure Document Intelligence (previously known as Form Recognizer) is a cloud service that uses machine learning to analyze text and structured data from your documents. It includes the following main features:

  • Layout - Extract content and structure (ex. words, selection marks, tables) from documents.
  • Document - Analyze key-value pairs in addition to general layout from documents.
  • Read - Read page information from documents.
  • Prebuilt - Extract common field values from select document types (ex. receipts, invoices, business cards, ID documents, U.S. W-2 tax documents, among others) using prebuilt models.
  • Custom - Build custom models from your own data to extract tailored field values in addition to general layout from documents.
  • Classifiers - Build custom classification models that combine layout and language features to accurately detect and identify documents you process within your application.
  • Add-on capabilities - Extract barcodes/QR codes, formulas, font/style, etc. or enable high resolution mode for large documents with optional parameters.

Source code | Package (PyPI) | Package (Conda) | API reference documentation | Product documentation | Samples

Getting started

Prerequisites

Install the package

Install the Azure Form Recognizer client library for Python with pip:

pip install azure-ai-formrecognizer

Note: This version of the client library defaults to the 2023-07-31 version of the service.

This table shows the relationship between SDK versions and supported API versions of the service:

SDK version Supported API version of service
3.3.X - Latest GA release 2.0, 2.1, 2022-08-31, 2023-07-31 (default)
3.2.X 2.0, 2.1, 2022-08-31 (default)
3.1.X 2.0, 2.1 (default)
3.0.0 2.0

Note: Starting with version 3.2.X, a new set of clients were introduced to leverage the newest features of the Document Intelligence service. Please see the Migration Guide for detailed instructions on how to update application code from client library version 3.1.X or lower to the latest version. Additionally, see the Changelog for more detailed information. The below table describes the relationship of each client and its supported API version(s):

API version Supported clients
2023-07-31 DocumentAnalysisClient and DocumentModelAdministrationClient
2022-08-31 DocumentAnalysisClient and DocumentModelAdministrationClient
2.1 FormRecognizerClient and FormTrainingClient
2.0 FormRecognizerClient and FormTrainingClient

Create a Cognitive Services or Form Recognizer resource

Document Intelligence supports both multi-service and single-service access. Create a Cognitive Services resource if you plan to access multiple cognitive services under a single endpoint/key. For Document Intelligence access only, create a Form Recognizer resource. Please note that you will need a single-service resource if you intend to use Azure Active Directory authentication.

You can create either resource using:

Below is an example of how you can create a Form Recognizer resource using the CLI:

# Create a new resource group to hold the Form Recognizer resource
# if using an existing resource group, skip this step
az group create --name <your-resource-name> --location <location>
# Create form recognizer
az cognitiveservices account create \
    --name <your-resource-name> \
    --resource-group <your-resource-group-name> \
    --kind FormRecognizer \
    --sku <sku> \
    --location <location> \
    --yes

For more information about creating the resource or how to get the location and sku information see here.

Authenticate the client

In order to interact with the Document Intelligence service, you will need to create an instance of a client. An endpoint and credential are necessary to instantiate the client object.

Get the endpoint

You can find the endpoint for your Form Recognizer resource using the Azure Portal or Azure CLI:

# Get the endpoint for the Form Recognizer resource
az cognitiveservices account show --name "resource-name" --resource-group "resource-group-name" --query "properties.endpoint"

Either a regional endpoint or a custom subdomain can be used for authentication. They are formatted as follows:

Regional endpoint: https://<region>.api.cognitive.microsoft.com/
Custom subdomain: https://<resource-name>.cognitiveservices.azure.com/

A regional endpoint is the same for every resource in a region. A complete list of supported regional endpoints can be consulted here. Please note that regional endpoints do not support AAD authentication.

A custom subdomain, on the other hand, is a name that is unique to the Form Recognizer resource. They can only be used by single-service resources.

Get the API key

The API key can be found in the Azure Portal or by running the following Azure CLI command:

az cognitiveservices account keys list --name "<resource-name>" --resource-group "<resource-group-name>"

Create the client with AzureKeyCredential

To use an API key as the credential parameter, pass the key as a string into an instance of AzureKeyCredential.

from azure.core.credentials import AzureKeyCredential
from azure.ai.formrecognizer import DocumentAnalysisClient

endpoint = "https://<my-custom-subdomain>.cognitiveservices.azure.com/"
credential = AzureKeyCredential("<api_key>")
document_analysis_client = DocumentAnalysisClient(endpoint, credential)

Create the client with an Azure Active Directory credential

AzureKeyCredential authentication is used in the examples in this getting started guide, but you can also authenticate with Azure Active Directory using the azure-identity library. Note that regional endpoints do not support AAD authentication. Create a custom subdomain name for your resource in order to use this type of authentication.

To use the DefaultAzureCredential type shown below, or other credential types provided with the Azure SDK, please install the azure-identity package:

pip install azure-identity

You will also need to register a new AAD application and grant access to Document Intelligence by assigning the "Cognitive Services User" role to your service principal.

Once completed, set the values of the client ID, tenant ID, and client secret of the AAD application as environment variables: AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET.

"""DefaultAzureCredential will use the values from these environment
variables: AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET
"""
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.identity import DefaultAzureCredential

endpoint = os.environ["AZURE_FORM_RECOGNIZER_ENDPOINT"]
credential = DefaultAzureCredential()

document_analysis_client = DocumentAnalysisClient(endpoint, credential)

Key concepts

DocumentAnalysisClient

DocumentAnalysisClient provides operations for analyzing input documents using prebuilt and custom models through the begin_analyze_document and begin_analyze_document_from_url APIs. Use the model_id parameter to select the type of model for analysis. See a full list of supported models here. The DocumentAnalysisClient also provides operations for classifying documents through the begin_classify_document and begin_classify_document_from_url APIs. Custom classification models can classify each page in an input file to identify the document(s) within and can also identify multiple documents or multiple instances of a single document within an input file.

Sample code snippets are provided to illustrate using a DocumentAnalysisClient here. More information about analyzing documents, including supported features, locales, and document types can be found in the service documentation.

DocumentModelAdministrationClient

DocumentModelAdministrationClient provides operations for:

  • Building custom models to analyze specific fields you specify by labeling your custom documents. A DocumentModelDetails is returned indicating the document type(s) the model can analyze, as well as the estimated confidence for each field. See the service documentation for a more detailed explanation.
  • Creating a composed model from a collection of existing models.
  • Managing models created in your account.
  • Listing operations or getting a specific model operation created within the last 24 hours.
  • Copying a custom model from one Form Recognizer resource to another.
  • Build and manage a custom classification model to classify the documents you process within your application.

Please note that models can also be built using a graphical user interface such as Document Intelligence Studio.

Sample code snippets are provided to illustrate using a DocumentModelAdministrationClient here.

Long-running operations

Long-running operations are operations which consist of an initial request sent to the service to start an operation, followed by polling the service at intervals to determine whether the operation has completed or failed, and if it has succeeded, to get the result.

Methods that analyze documents, build models, or copy/compose models are modeled as long-running operations. The client exposes a begin_<method-name> method that returns an LROPoller or AsyncLROPoller. Callers should wait for the operation to complete by calling result() on the poller object returned from the begin_<method-name> method. Sample code snippets are provided to illustrate using long-running operations below.

Examples

The following section provides several code snippets covering some of the most common Document Intelligence tasks, including:

Extract Layout

Extract text, selection marks, text styles, and table structures, along with their bounding region coordinates, from documents.

from azure.core.credentials import AzureKeyCredential
from azure.ai.formrecognizer import DocumentAnalysisClient

endpoint = os.environ["AZURE_FORM_RECOGNIZER_ENDPOINT"]
key = os.environ["AZURE_FORM_RECOGNIZER_KEY"]

document_analysis_client = DocumentAnalysisClient(
    endpoint=endpoint, credential=AzureKeyCredential(key)
)
with open(path_to_sample_documents, "rb") as f:
    poller = document_analysis_client.begin_analyze_document(
        "prebuilt-layout", document=f
    )
result = poller.result()

for idx, style in enumerate(result.styles):
    print(
        "Document contains {} content".format(
            "handwritten" if style.is_handwritten else "no handwritten"
        )
    )

for page in result.pages:
    print("----Analyzing layout from page #{}----".format(page.page_number))
    print(
        "Page has width: {} and height: {}, measured with unit: {}".format(
            page.width, page.height, page.unit
        )
    )

    for line_idx, line in enumerate(page.lines):
        words = line.get_words()
        print(
            "...Line # {} has word count {} and text '{}' within bounding polygon '{}'".format(
                line_idx,
                len(words),
                line.content,
                line.polygon,
            )
        )

        for word in words:
            print(
                "......Word '{}' has a confidence of {}".format(
                    word.content, word.confidence
                )
            )

    for selection_mark in page.selection_marks:
        print(
            "...Selection mark is '{}' within bounding polygon '{}' and has a confidence of {}".format(
                selection_mark.state,
                selection_mark.polygon,
                selection_mark.confidence,
            )
        )

for table_idx, table in enumerate(result.tables):
    print(
        "Table # {} has {} rows and {} columns".format(
            table_idx, table.row_count, table.column_count
        )
    )
    for region in table.bounding_regions:
        print(
            "Table # {} location on page: {} is {}".format(
                table_idx,
                region.page_number,
                region.polygon,
            )
        )
    for cell in table.cells:
        print(
            "...Cell[{}][{}] has content '{}'".format(
                cell.row_index,
                cell.column_index,
                cell.content,
            )
        )
        for region in cell.bounding_regions:
            print(
                "...content on page {} is within bounding polygon '{}'".format(
                    region.page_number,
                    region.polygon,
                )
            )

print("----------------------------------------")

Using the General Document Model

Analyze key-value pairs, tables, styles, and selection marks from documents using the general document model provided by the Document Intelligence service. Select the General Document Model by passing model_id="prebuilt-document" into the begin_analyze_document method:

from azure.core.credentials import AzureKeyCredential
from azure.ai.formrecognizer import DocumentAnalysisClient

endpoint = os.environ["AZURE_FORM_RECOGNIZER_ENDPOINT"]
key = os.environ["AZURE_FORM_RECOGNIZER_KEY"]

document_analysis_client = DocumentAnalysisClient(
    endpoint=endpoint, credential=AzureKeyCredential(key)
)
with open(path_to_sample_documents, "rb") as f:
    poller = document_analysis_client.begin_analyze_document(
        "prebuilt-document", document=f
    )
result = poller.result()

for style in result.styles:
    if style.is_handwritten:
        print("Document contains handwritten content: ")
        print(",".join([result.content[span.offset:span.offset + span.length] for span in style.spans]))

print("----Key-value pairs found in document----")
for kv_pair in result.key_value_pairs:
    if kv_pair.key:
        print(
                "Key '{}' found within '{}' bounding regions".format(
                    kv_pair.key.content,
                    kv_pair.key.bounding_regions,
                )
            )
    if kv_pair.value:
        print(
                "Value '{}' found within '{}' bounding regions\n".format(
                    kv_pair.value.content,
                    kv_pair.value.bounding_regions,
                )
            )

for page in result.pages:
    print("----Analyzing document from page #{}----".format(page.page_number))
    print(
        "Page has width: {} and height: {}, measured with unit: {}".format(
            page.width, page.height, page.unit
        )
    )

    for line_idx, line in enumerate(page.lines):
        words = line.get_words()
        print(
            "...Line # {} has {} words and text '{}' within bounding polygon '{}'".format(
                line_idx,
                len(words),
                line.content,
                line.polygon,
            )
        )

        for word in words:
            print(
                "......Word '{}' has a confidence of {}".format(
                    word.content, word.confidence
                )
            )

    for selection_mark in page.selection_marks:
        print(
            "...Selection mark is '{}' within bounding polygon '{}' and has a confidence of {}".format(
                selection_mark.state,
                selection_mark.polygon,
                selection_mark.confidence,
            )
        )

for table_idx, table in enumerate(result.tables):
    print(
        "Table # {} has {} rows and {} columns".format(
            table_idx, table.row_count, table.column_count
        )
    )
    for region in table.bounding_regions:
        print(
            "Table # {} location on page: {} is {}".format(
                table_idx,
                region.page_number,
                region.polygon,
            )
        )
    for cell in table.cells:
        print(
            "...Cell[{}][{}] has content '{}'".format(
                cell.row_index,
                cell.column_index,
                cell.content,
            )
        )
        for region in cell.bounding_regions:
            print(
                "...content on page {} is within bounding polygon '{}'\n".format(
                    region.page_number,
                    region.polygon,
                )
            )
print("----------------------------------------")
  • Read more about the features provided by the prebuilt-document model here.

Using Prebuilt Models

Extract fields from select document types such as receipts, invoices, business cards, identity documents, and U.S. W-2 tax documents using prebuilt models provided by the Document Intelligence service.

For example, to analyze fields from a sales receipt, use the prebuilt receipt model provided by passing model_id="prebuilt-receipt" into the begin_analyze_document method:

from azure.core.credentials import AzureKeyCredential
from azure.ai.formrecognizer import DocumentAnalysisClient

endpoint = os.environ["AZURE_FORM_RECOGNIZER_ENDPOINT"]
key = os.environ["AZURE_FORM_RECOGNIZER_KEY"]

document_analysis_client = DocumentAnalysisClient(
    endpoint=endpoint, credential=AzureKeyCredential(key)
)
with open(path_to_sample_documents, "rb") as f:
    poller = document_analysis_client.begin_analyze_document(
        "prebuilt-receipt", document=f, locale="en-US"
    )
receipts = poller.result()

for idx, receipt in enumerate(receipts.documents):
    print(f"--------Analysis of receipt #{idx + 1}--------")
    print(f"Receipt type: {receipt.doc_type if receipt.doc_type else 'N/A'}")
    merchant_name = receipt.fields.get("MerchantName")
    if merchant_name:
        print(
            f"Merchant Name: {merchant_name.value} has confidence: "
            f"{merchant_name.confidence}"
        )
    transaction_date = receipt.fields.get("TransactionDate")
    if transaction_date:
        print(
            f"Transaction Date: {transaction_date.value} has confidence: "
            f"{transaction_date.confidence}"
        )
    if receipt.fields.get("Items"):
        print("Receipt items:")
        for idx, item in enumerate(receipt.fields.get("Items").value):
            print(f"...Item #{idx + 1}")
            item_description = item.value.get("Description")
            if item_description:
                print(
                    f"......Item Description: {item_description.value} has confidence: "
                    f"{item_description.confidence}"
                )
            item_quantity = item.value.get("Quantity")
            if item_quantity:
                print(
                    f"......Item Quantity: {item_quantity.value} has confidence: "
                    f"{item_quantity.confidence}"
                )
            item_price = item.value.get("Price")
            if item_price:
                print(
                    f"......Individual Item Price: {item_price.value} has confidence: "
                    f"{item_price.confidence}"
                )
            item_total_price = item.value.get("TotalPrice")
            if item_total_price:
                print(
                    f"......Total Item Price: {item_total_price.value} has confidence: "
                    f"{item_total_price.confidence}"
                )
    subtotal = receipt.fields.get("Subtotal")
    if subtotal:
        print(f"Subtotal: {subtotal.value} has confidence: {subtotal.confidence}")
    tax = receipt.fields.get("TotalTax")
    if tax:
        print(f"Total tax: {tax.value} has confidence: {tax.confidence}")
    tip = receipt.fields.get("Tip")
    if tip:
        print(f"Tip: {tip.value} has confidence: {tip.confidence}")
    total = receipt.fields.get("Total")
    if total:
        print(f"Total: {total.value} has confidence: {total.confidence}")
    print("--------------------------------------")

You are not limited to receipts! There are a few prebuilt models to choose from, each of which has its own set of supported fields. See other supported prebuilt models here.

Build a Custom Model

Build a custom model on your own document type. The resulting model can be used to analyze values from the types of documents it was trained on. Provide a container SAS URL to your Azure Storage Blob container where you're storing the training documents.

More details on setting up a container and required file structure can be found in the service documentation.

from azure.ai.formrecognizer import (
    DocumentModelAdministrationClient,
    ModelBuildMode,
)
from azure.core.credentials import AzureKeyCredential

endpoint = os.environ["AZURE_FORM_RECOGNIZER_ENDPOINT"]
key = os.environ["AZURE_FORM_RECOGNIZER_KEY"]
container_sas_url = os.environ["CONTAINER_SAS_URL"]

document_model_admin_client = DocumentModelAdministrationClient(
    endpoint, AzureKeyCredential(key)
)
poller = document_model_admin_client.begin_build_document_model(
    ModelBuildMode.TEMPLATE,
    blob_container_url=container_sas_url,
    description="my model description",
)
model = poller.result()

print(f"Model ID: {model.model_id}")
print(f"Description: {model.description}")
print(f"Model created on: {model.created_on}")
print(f"Model expires on: {model.expires_on}")
print("Doc types the model can recognize:")
for name, doc_type in model.doc_types.items():
    print(
        f"Doc Type: '{name}' built with '{doc_type.build_mode}' mode which has the following fields:"
    )
    for field_name, field in doc_type.field_schema.items():
        print(
            f"Field: '{field_name}' has type '{field['type']}' and confidence score "
            f"{doc_type.field_confidence[field_name]}"
        )

Analyze Documents Using a Custom Model

Analyze document fields, tables, selection marks, and more. These models are trained with your own data, so they're tailored to your documents. For best results, you should only analyze documents of the same document type that the custom model was built with.

from azure.core.credentials import AzureKeyCredential
from azure.ai.formrecognizer import DocumentAnalysisClient

endpoint = os.environ["AZURE_FORM_RECOGNIZER_ENDPOINT"]
key = os.environ["AZURE_FORM_RECOGNIZER_KEY"]
model_id = os.getenv("CUSTOM_BUILT_MODEL_ID", custom_model_id)

document_analysis_client = DocumentAnalysisClient(
    endpoint=endpoint, credential=AzureKeyCredential(key)
)

# Make sure your document's type is included in the list of document types the custom model can analyze
with open(path_to_sample_documents, "rb") as f:
    poller = document_analysis_client.begin_analyze_document(
        model_id=model_id, document=f
    )
result = poller.result()

for idx, document in enumerate(result.documents):
    print(f"--------Analyzing document #{idx + 1}--------")
    print(f"Document has type {document.doc_type}")
    print(f"Document has document type confidence {document.confidence}")
    print(f"Document was analyzed with model with ID {result.model_id}")
    for name, field in document.fields.items():
        field_value = field.value if field.value else field.content
        print(
            f"......found field of type '{field.value_type}' with value '{field_value}' and with confidence {field.confidence}"
        )

# iterate over tables, lines, and selection marks on each page
for page in result.pages:
    print(f"\nLines found on page {page.page_number}")
    for line in page.lines:
        print(f"...Line '{line.content}'")
    for word in page.words:
        print(f"...Word '{word.content}' has a confidence of {word.confidence}")
    if page.selection_marks:
        print(f"\nSelection marks found on page {page.page_number}")
        for selection_mark in page.selection_marks:
            print(
                f"...Selection mark is '{selection_mark.state}' and has a confidence of {selection_mark.confidence}"
            )

for i, table in enumerate(result.tables):
    print(f"\nTable {i + 1} can be found on page:")
    for region in table.bounding_regions:
        print(f"...{region.page_number}")
    for cell in table.cells:
        print(
            f"...Cell[{cell.row_index}][{cell.column_index}] has text '{cell.content}'"
        )
print("-----------------------------------")

Alternatively, a document URL can also be used to analyze documents using the begin_analyze_document_from_url method.

document_url = "<url_of_the_document>"
poller = document_analysis_client.begin_analyze_document_from_url(model_id=model_id, document_url=document_url)
result = poller.result()

Manage Your Models

Manage the custom models attached to your account.

from azure.ai.formrecognizer import DocumentModelAdministrationClient
from azure.core.credentials import AzureKeyCredential
from azure.core.exceptions import ResourceNotFoundError

endpoint = "https://<my-custom-subdomain>.cognitiveservices.azure.com/"
credential = AzureKeyCredential("<api_key>")

document_model_admin_client = DocumentModelAdministrationClient(endpoint, credential)

account_details = document_model_admin_client.get_resource_details()
print("Our account has {} custom models, and we can have at most {} custom models".format(
    account_details.custom_document_models.count, account_details.custom_document_models.limit
))

# Here we get a paged list of all of our models
models = document_model_admin_client.list_document_models()
print("We have models with the following ids: {}".format(
    ", ".join([m.model_id for m in models])
))

# Replace with the custom model ID from the "Build a model" sample
model_id = "<model_id from the Build a Model sample>"

custom_model = document_model_admin_client.get_document_model(model_id=model_id)
print("Model ID: {}".format(custom_model.model_id))
print("Description: {}".format(custom_model.description))
print("Model created on: {}\n".format(custom_model.created_on))

# Finally, we will delete this model by ID
document_model_admin_client.delete_document_model(model_id=custom_model.model_id)

try:
    document_model_admin_client.get_document_model(model_id=custom_model.model_id)
except ResourceNotFoundError:
    print("Successfully deleted model with id {}".format(custom_model.model_id))

Add-on Capabilities

Document Intelligence supports more sophisticated analysis capabilities. These optional features can be enabled and disabled depending on the scenario of the document extraction.

The following add-on capabilities are available for 2023-07-31 (GA) and later releases:

Note that some add-on capabilities will incur additional charges. See pricing: https://azure.microsoft.com/pricing/details/ai-document-intelligence/.

Troubleshooting

General

Form Recognizer client library will raise exceptions defined in Azure Core. Error codes and messages raised by the Document Intelligence service can be found in the service documentation.

Logging

This library uses the standard logging library for logging.

Basic information about HTTP sessions (URLs, headers, etc.) is logged at INFO level.

Detailed DEBUG level logging, including request/response bodies and unredacted headers, can be enabled on the client or per-operation with the logging_enable keyword argument.

See full SDK logging documentation with examples here.

Optional Configuration

Optional keyword arguments can be passed in at the client and per-operation level. The azure-core reference documentation describes available configurations for retries, logging, transport protocols, and more.

Next steps

More sample code

See the Sample README for several code snippets illustrating common patterns used in the Form Recognizer Python API.

Additional documentation

For more extensive documentation on Azure AI Document Intelligence, see the Document Intelligence documentation on docs.microsoft.com.

Contributing

This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit cla.microsoft.com.

When you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA.

This project has adopted the Microsoft Open Source Code of Conduct. For more information see the Code of Conduct FAQ or contact opencode@microsoft.com with any additional questions or comments.

Release History

3.3.2 (2023-11-07)

Bugs Fixed

  • Fixed incorrect data type for returned formula objects.

3.3.1 (2023-10-10)

Features Added

  • Exposed send_request() method in each client to send custom requests using the client's existing pipeline. (#32151)

3.3.0 (2023-08-08)

This version of the client library defaults to the service API version 2023-07-31.

Breaking Changes

Note: The following changes are only breaking from the previous beta. They are not breaking against previous stable versions.

  • Going forward this library will default to service API version 2023-07-31.
  • Removed query_fields keyword argument from begin_analyze_document() and begin_analyze_document_from_url().
  • Removed kind property from DocumentPage.
  • Removed images property from DocumentPage.
  • Removed DocumentImage model.
  • Removed annotations property from DocumentPage.
  • Removed DocumentAnnotation model.
  • Removed common_name property from DocumentKeyValuePair.
  • Changed AnalysisFeature enum member names and values. Supported enum members are: OCR_HIGH_RESOLUTION, LANGUAGES, BARCODES, FORMULAS, KEY_VALUE_PAIRS, STYLE_FONT.
  • Renamed custom_neural_document_model_builds property to neural_document_model_quota on ResourceDetails model.
  • Renamed AzureBlobSource model to BlobSource.
  • Renamed AzureBlobFileListSource model to BlobFileListSource.
  • Marked neural_document_model_quota as optional on ResourceDetails.

Other Changes

  • Corrected typing for the polygon property on DocumentWord, DocumentSelectionMark, DocumentLine.
  • Corrected typing for words, lines, and selection_marks properties on DocumentPage.
  • Renamed the samples directory to v3.2_and_later/ for samples that support 3.2 and later.

3.3.0b1 (2023-04-13)

This version of the client library defaults to the service API version 2023-02-28-preview.

Features Added

  • Added features keyword argument on begin_analyze_document() and begin_analyze_document_from_url().
  • Added query_fields keyword argument on begin_analyze_document() and begin_analyze_document_from_url().
  • Added AnalysisFeature enum with optional document analysis feature to enable.
  • Added file_list keyword argument on begin_build_document_model().
  • Added the following optional properties on DocumentStyle class: similar_font_family, font_style, font_weight, color, background_color.
  • Added support for custom document classification on DocumentModelAdministrationClient: begin_build_document_classifier, list_document_classifiers, get_document_classifier, and delete_document_classifier.
  • Added support for classifying documents on DocumentAnalysisClient: begin_classify_document and begin_classify_document_from_url.
  • Added ClassifierDocumentTypeDetails to use with begin_build_document_classifier().
  • Added model QuotaDetails and property custom_neural_document_model_builds on ResourceDetails.
  • Added kind documentClassifierBuild to OperationSummary and OperationDetails.
  • Added property expires_on to DocumentModelDetails and DocumentModelSummary.
  • Added kind formulaBlock to DocumentParagraph.
  • Added property common_name to DocumentKeyValuePair.
  • Added property code to CurrencyValue.
  • Added properties unit, city_district, state_district, suburb, house, and level to AddressValue.
  • Added "boolean" value_type and bool value to DocumentField.
  • Added properties annotations, images, formulas, and barcodes to DocumentPage.
  • Added models DocumentAnnotation, DocumentImage, DocumentFormula, and DocumentBarcode.

3.2.1 (2023-03-07)

Bugs Fixed

  • Corrected typing for invoice argument in begin_recognize_invoices() on async FormRecognizerClient.
  • Fixed issue when calling to_dict() on DocumentField where value is not returned for address and currency fields.
  • Corrected typing for form_type_confidence property on RecognizedForm.
  • Corrected typing for appearance property on FormLine.

Other Changes

  • Improved static typing.

3.2.0 (2022-09-08)

Features Added

  • Content type image/heif is supported for document analysis and building models.
  • Added custom_document_models property on ResourceDetails.
  • Added new CustomDocumentModelsDetails model to represent the details of the custom document models in a given Form Recognizer resource.

Breaking Changes

  • This library will default to service API version 2022-08-31 going forward.
  • Removed kind property on DocumentPage.
  • Renamed begin_build_model() to begin_build_document_model() on the DocumentModelAdministrationClient.
  • Renamed begin_compose_model() to begin_compose_document_model() on the DocumentModelAdministrationClient.
  • Renamed begin_copy_model_to() to begin_copy_document_model_to() on the DocumentModelAdministrationClient.
  • Renamed list_models() to list_document_models() on the DocumentModelAdministrationClient.
  • Renamed get_model() to get_document_model() on the DocumentModelAdministrationClient.
  • Renamed delete_model() to delete_document_model() on the DocumentModelAdministrationClient.
  • Removed document_model_count and document_model_limit properties on ResourceDetails.
  • Renamed DocumentModelOperationDetails to OperationDetails.
  • Renamed DocumentModelOperationSummary to OperationSummary.
  • Removed DocumentContentElement.
  • Removed kind and content properties from DocumentSelectionMark.
  • Removed kind from DocumentWord.

Bugs Fixed

  • Added DocumentParagraph to __all__.

3.2.0b6 (2022-08-09)

Features Added

  • Added TargetAuthorization of type dict[str, str].

Breaking Changes

  • Renamed source argument to blob_container_url on begin_build_model() and made it a required keyword-only argument.
  • Changed argument order on begin_build_model(). build_mode is the first expected argument, followed by blob_container_url.
  • Renamed begin_create_composed_model() on DocumentModelAdministrationClient to begin_compose_model().
  • Renamed get_account_info() on DocumentModelAdministrationClient to get_resource_details().
  • Renamed DocumentBuildMode to ModelBuildMode.
  • Renamed AccountInfo model to ResourceDetails.
  • Renamed DocTypeInfo model to DocumentTypeDetails.
  • Renamed DocumentModelInfo model to DocumentModelSummary.
  • Renamed DocumentModel to DocumentModelDetails.
  • Renamed ModelOperation to DocumentModelOperationDetails.
  • Renamed ModelOperationInfo to DocumentModelOperationSummary.
  • Renamed model parameter to model_id on begin_analyze_document() and begin_analyze_document_from_url().
  • Removed continuation_token keyword from begin_analyze_document() and begin_analyze_document_from_url() on DocumentAnalysisClient and from begin_build_model(), begin_compose_model() and begin_copy_model_to() on DocumentModelAdministrationClient.
  • Changed return type of get_copy_authorization() from dict[str, str] to TargetAuthorization.
  • Changed expected target parameter in begin_copy_to() from dict[str, str] to TargetAuthorization.
  • Long-running operation metadata is now accessible through the details property on the returned DocumentModelAdministrationLROPoller and AsyncDocumentModelAdministrationLROPoller instances.

Other Changes

  • Python 3.6 is no longer supported in this release. Please use Python 3.7 or later.

3.2.0b5 (2022-06-07)

Features Added

  • Added paragraphs property on AnalyzeResult.
  • Added new DocumentParagraph model to represent document paragraphs.
  • Added new AddressValue model to represent address fields found in documents.
  • Added kind property on DocumentPage.

Breaking Changes

  • Renamed bounding_box to polygon on BoundingRegion, DocumentContentElement, DocumentLine, DocumentSelectionMark, DocumentWord.
  • Renamed language_code to locale on DocumentLanguage.
  • Some models that previously returned string for address related fields may now return AddressValue. TIP: Use get_model() on DocumentModelAdministrationClient to see updated prebuilt model schemas.
  • Removed entities property on AnalyzeResult.
  • Removed DocumentEntity model.

3.2.0b4 (2022-04-05)

Breaking Changes

  • Renamed begin_copy_model() to begin_copy_model_to().
  • In begin_create_composed_model(), renamed required parameter model_ids to component_model_ids.
  • Renamed model_count and model_limit on AccountInfo to document_model_count and document_model_limit.

Bugs Fixed

  • Fixed to_dict() and from_dict() methods on DocumentField to support converting lists, dictionaries, and CurrenyValue field types to and from a dictionary.

Other Changes

  • Renamed sample_copy_model.py and sample_copy_model_async.py to sample_copy_model_to.py and sample_copy_model_to_async.py under the 3.2-beta samples folder. Updated the samples to use renamed copy model method.

3.2.0b3 (2022-02-10)

Features Added

  • Added new CurrencyValue model to represent the amount and currency symbol values found in documents.
  • Added DocumentBuildMode enum with values template and neural. These enum values can be passed in for the build_mode parameter in begin_build_model().
  • Added api_version and tags properties on ModelOperation, ModelOperationInfo, DocumentModel, DocumentModelInfo.
  • Added build_mode property on DocTypeInfo.
  • Added a tags keyword argument to begin_build_model(), begin_create_composed_model(), and get_copy_authorization().
  • Added languages property on AnalyzeResult.
  • Added model DocumentLanguage that includes information about the detected languages found in a document.
  • Added sample_analyze_read.py and sample_analyze_read_async.py under the v3.2-beta samples directory. These samples use the new prebuilt-read model added by the service.
  • Added sample_analyze_tax_us_w2.py and sample_analyze_tax_us_w2_async.py under the v3.2-beta samples directory. These samples use the new prebuilt-tax.us.w2 model added by the service.

Breaking Changes

  • Added new required parameter build_mode to begin_build_model().
  • Some models that previously returned float for currency related fields may now return a CurrencyValue. TIP: Use get_model() on DocumentModelAdministrationClient to see updated prebuilt model schemas.

Bugs Fixed

  • Default the percent_completed property to 0 when not returned with model operation information.

Other Changes

  • Python 2.7 is no longer supported in this release. Please use Python 3.6 or later.
  • Bumped azure-core minimum dependency version from 1.13.0 to 1.20.1.
  • Updated samples that call begin_build_model() to send the build_mode parameter.

3.2.0b2 (2021-11-09)

Features Added

  • Added get_words() on DocumentLine.
  • Added samples showing how to use get_words() on a DocumentLine under /samples/v3.2-beta: sample_get_words_on_document_line.py and sample_get_words_on_document_line_async.py.

Breaking Changes

  • Renamed DocumentElement to DocumentContentElement.

3.2.0b1 (2021-10-07)

This version of the SDK defaults to the latest supported API version, which is currently 2021-09-30-preview.

Note: Starting with version 2021-09-30-preview, a new set of clients were introduced to leverage the newest features of the Form Recognizer service. Please see the Migration Guide for detailed instructions on how to update application code from client library version 3.1.X or lower to the latest version. Also, please refer to the README for more information about the library.

Features Added

  • Added new DocumentAnalysisClient with begin_analyze_document and begin_analyze_document_from_url methods. Use these methods with the latest Form Recognizer API version to analyze documents, with prebuilt and custom models.
  • Added new models to use with the new DocumentAnalysisClient: AnalyzeResult, AnalyzedDocument, BoundingRegion, DocumentElement, DocumentEntity, DocumentField, DocumentKeyValuePair, DocumentKeyValueElement, DocumentLine, DocumentPage, DocumentSelectionMark, DocumentSpan, DocumentStyle, DocumentTable, DocumentTableCell, DocumentWord.
  • Added new DocumentModelAdministrationClient with methods: begin_build_model, begin_create_composed_model, begin_copy_model, get_copy_authorization, get_model, delete_model, list_models, get_operation, list_operations, get_account_info, get_document_analysis_client.
  • Added new models to use with the new DocumentModelAdministrationClient: DocumentModel, DocumentModelInfo, DocTypeInfo, ModelOperation, ModelOperationInfo, AccountInfo, DocumentAnalysisError, DocumentAnalysisInnerError.
  • Added samples using the DocumentAnalysisClient and DocumentModelAdministrationClient under /samples/v3.2-beta.
  • Added DocumentAnalysisApiVersion to be used with DocumentAnalysisClient and DocumentModelAdministrationClient.

Other Changes

  • Python 3.5 is no longer supported in this release.

3.1.2 (2021-08-10)

Bugs Fixed

  • A HttpResponseError will be immediately raised when the call quota volume is exceeded in a F0 tier Form Recognizer resource.

Other Changes

  • Bumped azure-core minimum dependency version from 1.8.2 to 1.13.0

3.1.1 (2021-06-08)

Bug Fixes

  • Handles invoices that do not have sub-line item fields detected.

3.1.0 (2021-05-26)

This version of the SDK defaults to the latest supported API version, which currently is v2.1

Note: this version will be the last to officially support Python 3.5, future versions will require Python 2.7 or Python 3.6+

Breaking Changes

  • begin_recognize_id_documents renamed to begin_recognize_identity_documents.
  • begin_recognize_id_documents_from_url renamed to begin_recognize_identity_documents_from_url.
  • The model TextAppearance now includes the properties style_name and style_confidence that were part of the TextStyle object.
  • Removed the model TextStyle.
  • Removed field value types "gender" and "country" from the FieldValueType enum.
  • Added field value type "countryRegion" to the FieldValueType enum.
  • Renamed field name for identity documents from "Country" to "CountryRegion".

New features

  • Added to_dict and from_dict methods to all of the models

3.1.0b4 (2021-04-06)

New features

  • New methods begin_recognize_id_documents and begin_recognize_id_documents_from_url introduced to the SDK. Use these methods to recognize data from identity documents.
  • New field value types "gender" and "country" described in the FieldValueType enum.
  • Content-type image/bmp now supported by custom forms and training methods.
  • Added keyword argument pages for business cards, receipts, custom forms, and invoices to specify which page to process of the document.
  • Added keyword argument reading_order to begin_recognize_content and begin_recognize_content_from_url.

Dependency Updates

  • Bumped msrest requirement from 0.6.12 to 0.6.21.

3.1.0b3 (2021-02-09)

Breaking Changes

  • Appearance is renamed to TextAppearance
  • Style is renamed to TextStyle
  • Client property api_version is no longer exposed. Pass keyword argument api_version into the client to select the API version

Dependency Updates

  • Bumped six requirement from 1.6 to 1.11.0.

3.1.0b2 (2021-01-12)

Bug Fixes

  • Package requires azure-core version 1.8.2 or greater

3.1.0b1 (2020-11-23)

This version of the SDK defaults to the latest supported API version, which currently is v2.1-preview.

New features

  • New methods begin_recognize_business_cards and begin_recognize_business_cards_from_url introduced to the SDK. Use these methods to recognize data from business cards
  • New methods begin_recognize_invoices and begin_recognize_invoices_from_url introduced to the SDK. Use these methods to recognize data from invoices
  • Recognize receipt methods now take keyword argument locale to optionally indicate the locale of the receipt for improved results
  • Added ability to create a composed model from the FormTrainingClient by calling method begin_create_composed_model()
  • Added support to train and recognize custom forms with selection marks such as check boxes and radio buttons. This functionality is only available for models trained with labels
  • Added property selection_marks to FormPage which contains a list of FormSelectionMark
  • When passing include_field_elements=True, the property field_elements on FieldData and FormTableCell will also be populated with any selection marks found on the page
  • Added the properties model_name and properties to types CustomFormModel and CustomFormModelInfo
  • Added keyword argument model_name to begin_training() and begin_create_composed_model()
  • Added model type CustomFormModelProperties that includes information like if a model is a composed model
  • Added property model_id to CustomFormSubmodel and TrainingDocumentInfo
  • Added properties model_id and form_type_confidence to RecognizedForm
  • appearance property added to FormLine to indicate the style of extracted text - like "handwriting" or "other"
  • Added keyword argument pages to begin_recognize_content and begin_recognize_content_from_url to specify the page numbers to analyze
  • Added property bounding_box to FormTable
  • Content-type image/bmp now supported by recognize content and prebuilt models
  • Added keyword argument language to begin_recognize_content and begin_recognize_content_from_url to specify which language to process document in

Dependency updates

3.0.0 (2020-08-20)

First stable release of the azure-ai-formrecognizer client library.

New features

  • Client-level, keyword argument api_version can be used to specify the service API version to use. Currently only v2.0 is supported. See the enum FormRecognizerApiVersion for supported API versions.
  • FormWord and FormLine now have attribute kind which specifies the kind of element it is, e.g. "word" or "line"

3.0.0b1 (2020-08-11)

The version of this package now targets the service's v2.0 API.

Breaking Changes

  • Client library version bumped to 3.0.0b1
  • Values are now capitalized for enums FormContentType, LengthUnit, TrainingStatus, and CustomFormModelStatus
  • document_name renamed to name on TrainingDocumentInfo
  • Keyword argument include_sub_folders renamed to include_subfolders on begin_training methods

New features

  • FormField now has attribute value_type which contains the semantic data type of the field value. The options for value_type are described in the enum FieldValueType

Fixes and improvements

  • Fixes a bug where error code and message weren't being returned on HttpResponseError if operation failed during polling
  • FormField property value_data is now set to None if no values are returned on its FieldData. Previously value_data returned a FieldData with all its attributes set to None in the above case.

1.0.0b4 (2020-07-07)

Breaking Changes

  • RecognizedReceipts class has been removed.
  • begin_recognize_receipts and begin_recognize_receipts_from_url now return RecognizedForm.
  • requested_on has been renamed to training_started_on and completed_on renamed to training_completed_on on CustomFormModel and CustomFormModelInfo
  • FieldText has been renamed to FieldData
  • FormContent has been renamed to FormElement
  • Parameter include_text_content has been renamed to include_field_elements for begin_recognize_receipts, begin_recognize_receipts_from_url, begin_recognize_custom_forms, and begin_recognize_custom_forms_from_url
  • text_content has been renamed to field_elements on FieldData and FormTableCell

Fixes and improvements

  • Fixes a bug where text_angle was being returned out of the specified interval (-180, 180]

1.0.0b3 (2020-06-10)

Breaking Changes

  • All asynchronous long running operation methods now return an instance of an AsyncLROPoller from azure-core
  • All asynchronous long running operation methods are renamed with the begin_ prefix to indicate that an AsyncLROPoller is returned:
    • train_model is renamed to begin_training
    • recognize_receipts is renamed to begin_recognize_receipts
    • recognize_receipts_from_url is renamed to begin_recognize_receipts_from_url
    • recognize_content is renamed to begin_recognize_content
    • recognize_content_from_url is renamed to begin_recognize_content_from_url
    • recognize_custom_forms is renamed to begin_recognize_custom_forms
    • recognize_custom_forms_from_url is renamed to begin_recognize_custom_forms_from_url
  • Sync method begin_train_model renamed to begin_training
  • training_files parameter of begin_training is renamed to training_files_url
  • use_labels parameter of begin_training is renamed to use_training_labels
  • list_model_infos method has been renamed to list_custom_models
  • Removed get_form_training_client from FormRecognizerClient
  • Added get_form_recognizer_client to FormTrainingClient
  • A HttpResponseError is now raised if a model with status=="invalid" is returned from the begin_training methods
  • PageRange is renamed to FormPageRange
  • first_page and last_page renamed to first_page_number and last_page_number, respectively on FormPageRange
  • FormField does not have a page_number
  • use_training_labels is now a required positional param in the begin_training APIs
  • stream and url parameters found on methods for FormRecognizerClient have been renamed to form and form_url, respectively
  • For begin_recognize_receipt methods, parameters have been renamed to receipt and receipt_url
  • created_on and last_modified are renamed to requested_on and completed_on in the CustomFormModel and CustomFormModelInfo models
  • models property of CustomFormModel is renamed to submodels
  • CustomFormSubModel is renamed to CustomFormSubmodel
  • begin_recognize_receipts APIs now return a list of RecognizedReceipt instead of USReceipt
  • Removed USReceipt. To see how to deal with the return value of begin_recognize_receipts, see the recognize receipt samples in the samples directory for details.
  • Removed USReceiptItem. To see how to access the individual items on a receipt, see the recognize receipt samples in the samples directory for details.
  • Removed USReceiptType and the receipt_type property from RecognizedReceipt. See the recognize receipt samples in the samples directory for details.

New features

  • Support to copy a custom model from one Form Recognizer resource to another
  • Authentication using azure-identity credentials now supported
  • page_number attribute has been added to FormTable
  • All long running operation methods now accept the keyword argument continuation_token to restart the poller from a saved state

Dependency updates

1.0.0b2 (2020-05-06)

Fixes and improvements

  • Bug fixed where confidence == 0.0 was erroneously getting set to 1.0
  • __repr__ has been added to all of the models

1.0.0b1 (2020-04-23)

Version (1.0.0b1) is the first preview of our efforts to create a user-friendly and Pythonic client library for Azure Form Recognizer. This library replaces the package found here: https://pypi.org/project/azure-cognitiveservices-formrecognizer/

For more information about this, and preview releases of other Azure SDK libraries, please visit https://azure.github.io/azure-sdk/releases/latest/python.html.

Breaking changes: New API design

  • New namespace/package name:
    • The namespace/package name for the Form Recognizer client library has changed from azure.cognitiveservices.formrecognizer to azure.ai.formrecognizer
  • Two client design:
    • FormRecognizerClient to analyze fields/values on custom forms, receipts, and form content/layout
    • FormTrainingClient to train custom models (with/without labels), and manage the custom models on your account
  • Different analyze methods based on input type: file stream or URL.
    • URL input should use the method with suffix from_url
    • Stream methods will automatically detect content-type of the input file
  • Asynchronous APIs added under azure.ai.formrecognizer.aio namespace
  • Authentication with API key supported using AzureKeyCredential("<api_key>") from azure.core.credentials
  • New underlying REST pipeline implementation based on the azure-core library
  • Client and pipeline configuration is now available via keyword arguments at both the client level, and per-operation. See README for a link to optional configuration arguments
  • New error hierarchy:
    • All service errors will now use the base type: azure.core.exceptions.HttpResponseError