All skills
microsoft avatar

/azure-ai-formrecognizer-java

@e7ee58f
by microsoftmicrosoft/skills3.1k stars
351

Azure AI Document Intelligence SDK for Java (com.azure:azure-ai-documentintelligence). Use for extracting text, tables, key-value pairs from documents, receipts, invoices, IDs, or building custom document models. Triggers: "document intelligence java", "form recognizer java", "extract text from PDF java", "OCR document java", "analyze invoice receipt java", "custom document model java", "document classification java".

Use this Skill: https://skilld.dev/gh/microsoft/skills/azure-ai-formrecognizer-java

This session only. Nothing lands on disk.

referencesexamples.md

≈5.2k tokens on demand. Your agent reads this file only when SKILL.md points to it.

Azure AI Document Intelligence - Java Code Examples

1. Client Setup

Sync Client with DefaultAzureCredential

import com.azure.ai.documentintelligence.DocumentIntelligenceClient;
import com.azure.ai.documentintelligence.DocumentIntelligenceClientBuilder;
import com.azure.identity.DefaultAzureCredentialBuilder;

DocumentIntelligenceClient client = new DocumentIntelligenceClientBuilder()
    .endpoint(System.getenv("DOCUMENT_INTELLIGENCE_ENDPOINT"))
    .credential(new DefaultAzureCredentialBuilder().build())
    .buildClient();

Async Client

import com.azure.ai.documentintelligence.DocumentIntelligenceAsyncClient;

DocumentIntelligenceAsyncClient asyncClient = new DocumentIntelligenceClientBuilder()
    .endpoint(System.getenv("DOCUMENT_INTELLIGENCE_ENDPOINT"))
    .credential(new DefaultAzureCredentialBuilder().build())
    .buildAsyncClient();

Administration Client

import com.azure.ai.documentintelligence.DocumentIntelligenceAdministrationClient;
import com.azure.ai.documentintelligence.DocumentIntelligenceAdministrationClientBuilder;

DocumentIntelligenceAdministrationClient adminClient = new DocumentIntelligenceAdministrationClientBuilder()
    .endpoint(System.getenv("DOCUMENT_INTELLIGENCE_ENDPOINT"))
    .credential(new DefaultAzureCredentialBuilder().build())
    .buildClient();

2. Analyze Layout

From Local File

import com.azure.ai.documentintelligence.models.*;
import com.azure.core.util.BinaryData;
import com.azure.core.util.polling.SyncPoller;
import java.io.File;

File layoutDocument = new File("document.pdf");
BinaryData documentData = BinaryData.fromFile(
    layoutDocument.toPath(), (int) layoutDocument.length());

SyncPoller<AnalyzeOperationDetails, AnalyzeResult> poller =
    client.beginAnalyzeDocument("prebuilt-layout",
        new AnalyzeDocumentOptions(documentData));

AnalyzeResult result = poller.getFinalResult();

// Pages
for (DocumentPage page : result.getPages()) {
    System.out.printf("Page %d: %.2f x %.2f %s%n",
        page.getPageNumber(), page.getWidth(), page.getHeight(), page.getUnit());

    // Lines
    for (DocumentLine line : page.getLines()) {
        System.out.printf("  Line: '%s' [%s]%n",
            line.getContent(), line.getPolygon());
    }

    // Words
    for (DocumentWord word : page.getWords()) {
        System.out.printf("  Word: '%s' (confidence: %.2f)%n",
            word.getContent(), word.getConfidence());
    }

    // Selection marks
    for (DocumentSelectionMark mark : page.getSelectionMarks()) {
        System.out.printf("  Selection mark: %s (confidence: %.2f)%n",
            mark.getState(), mark.getConfidence());
    }
}

// Tables
for (int i = 0; i < result.getTables().size(); i++) {
    DocumentTable table = result.getTables().get(i);
    System.out.printf("Table %d: %d rows x %d columns%n",
        i, table.getRowCount(), table.getColumnCount());
    for (DocumentTableCell cell : table.getCells()) {
        System.out.printf("  Cell[%d,%d]: '%s'%n",
            cell.getRowIndex(), cell.getColumnIndex(), cell.getContent());
    }
}

From URL

String documentUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-java/main/"
    + "sdk/documentintelligence/azure-ai-documentintelligence/"
    + "src/samples/resources/sample-forms/forms/Form_1.jpg";

SyncPoller<AnalyzeOperationDetails, AnalyzeResult> poller =
    client.beginAnalyzeDocument("prebuilt-layout",
        new AnalyzeDocumentOptions(documentUrl));

AnalyzeResult result = poller.getFinalResult();
System.out.printf("Content: %s%n", result.getContent());

3. Analyze Receipts

import com.azure.ai.documentintelligence.models.*;
import java.util.Map;

String receiptUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-java/main/"
    + "sdk/documentintelligence/azure-ai-documentintelligence/"
    + "src/samples/resources/sample-forms/receipts/contoso-allinone.jpg";

SyncPoller<AnalyzeOperationDetails, AnalyzeResult> poller =
    client.beginAnalyzeDocument("prebuilt-receipt",
        new AnalyzeDocumentOptions(receiptUrl));

AnalyzeResult result = poller.getFinalResult();

for (AnalyzedDocument receipt : result.getDocuments()) {
    Map<String, DocumentField> fields = receipt.getFields();

    // Merchant name
    DocumentField merchantName = fields.get("MerchantName");
    if (merchantName != null && merchantName.getType() == DocumentFieldType.STRING) {
        System.out.printf("Merchant: %s (confidence: %.2f)%n",
            merchantName.getValueString(), merchantName.getConfidence());
    }

    // Merchant phone
    DocumentField phone = fields.get("MerchantPhoneNumber");
    if (phone != null && phone.getType() == DocumentFieldType.PHONE_NUMBER) {
        System.out.printf("Phone: %s%n", phone.getValuePhoneNumber());
    }

    // Merchant address
    DocumentField address = fields.get("MerchantAddress");
    if (address != null && address.getType() == DocumentFieldType.STRING) {
        System.out.printf("Address: %s%n", address.getValueString());
    }

    // Transaction date
    DocumentField date = fields.get("TransactionDate");
    if (date != null && date.getType() == DocumentFieldType.DATE) {
        System.out.printf("Date: %s%n", date.getValueDate());
    }

    // Total
    DocumentField total = fields.get("Total");
    if (total != null && total.getType() == DocumentFieldType.NUMBER) {
        System.out.printf("Total: %.2f%n", total.getValueNumber());
    }

    // Items (array field)
    DocumentField items = fields.get("Items");
    if (items != null && items.getType() == DocumentFieldType.LIST) {
        for (DocumentField item : items.getValueList()) {
            Map<String, DocumentField> itemFields = item.getValueObject();
            DocumentField description = itemFields.get("Description");
            DocumentField totalPrice = itemFields.get("TotalPrice");
            if (description != null) {
                System.out.printf("  Item: %s", description.getValueString());
            }
            if (totalPrice != null) {
                System.out.printf(" - $%.2f", totalPrice.getValueNumber());
            }
            System.out.println();
        }
    }
}

4. Analyze Invoices

String invoiceUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-java/main/"
    + "sdk/documentintelligence/azure-ai-documentintelligence/"
    + "src/samples/resources/sample-forms/invoices/sample_invoice.jpg";

SyncPoller<AnalyzeOperationDetails, AnalyzeResult> poller =
    client.beginAnalyzeDocument("prebuilt-invoice",
        new AnalyzeDocumentOptions(invoiceUrl));

AnalyzeResult result = poller.getFinalResult();

for (AnalyzedDocument invoice : result.getDocuments()) {
    Map<String, DocumentField> fields = invoice.getFields();

    DocumentField vendorName = fields.get("VendorName");
    if (vendorName != null) {
        System.out.printf("Vendor: %s%n", vendorName.getValueString());
    }

    DocumentField customerName = fields.get("CustomerName");
    if (customerName != null) {
        System.out.printf("Customer: %s%n", customerName.getValueString());
    }

    DocumentField invoiceTotal = fields.get("InvoiceTotal");
    if (invoiceTotal != null && invoiceTotal.getType() == DocumentFieldType.NUMBER) {
        System.out.printf("Total: %.2f (Currency: %s)%n",
            invoiceTotal.getValueNumber(),
            fields.containsKey("CurrencyCode")
                ? fields.get("CurrencyCode").getValueString() : "N/A");
    }

    DocumentField invoiceDate = fields.get("InvoiceDate");
    if (invoiceDate != null && invoiceDate.getType() == DocumentFieldType.DATE) {
        System.out.printf("Date: %s%n", invoiceDate.getValueDate());
    }

    // Line items
    DocumentField lineItems = fields.get("Items");
    if (lineItems != null && lineItems.getType() == DocumentFieldType.LIST) {
        for (DocumentField lineItem : lineItems.getValueList()) {
            Map<String, DocumentField> itemFields = lineItem.getValueObject();
            System.out.printf("  Item: %s, Qty: %s, Amount: %s%n",
                getFieldString(itemFields, "Description"),
                getFieldString(itemFields, "Quantity"),
                getFieldString(itemFields, "Amount"));
        }
    }
}

// Helper
static String getFieldString(Map<String, DocumentField> fields, String key) {
    DocumentField field = fields.get(key);
    return (field != null) ? field.getContent() : "N/A";
}

5. Analyze ID Documents

String idDocUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-java/main/"
    + "sdk/documentintelligence/azure-ai-documentintelligence/"
    + "src/samples/resources/sample-forms/identityDocuments/license.jpg";

SyncPoller<AnalyzeOperationDetails, AnalyzeResult> poller =
    client.beginAnalyzeDocument("prebuilt-idDocument",
        new AnalyzeDocumentOptions(idDocUrl));

AnalyzeResult result = poller.getFinalResult();

for (AnalyzedDocument idDoc : result.getDocuments()) {
    Map<String, DocumentField> fields = idDoc.getFields();

    DocumentField firstName = fields.get("FirstName");
    DocumentField lastName = fields.get("LastName");
    DocumentField docNumber = fields.get("DocumentNumber");
    DocumentField dob = fields.get("DateOfBirth");

    if (firstName != null) System.out.printf("First Name: %s%n", firstName.getValueString());
    if (lastName != null) System.out.printf("Last Name: %s%n", lastName.getValueString());
    if (docNumber != null) System.out.printf("Document Number: %s%n", docNumber.getValueString());
    if (dob != null && dob.getType() == DocumentFieldType.DATE) {
        System.out.printf("Date of Birth: %s%n", dob.getValueDate());
    }
}

6. Build Custom Model

import com.azure.ai.documentintelligence.models.*;
import com.azure.core.util.polling.SyncPoller;

String blobContainerUrl = "{SAS_URL_of_your_container_in_blob_storage}";

SyncPoller<DocumentModelBuildOperationDetails, DocumentModelDetails> poller =
    adminClient.beginBuildDocumentModel(
        new BuildDocumentModelOptions("my-custom-model", DocumentBuildMode.TEMPLATE)
            .setAzureBlobSource(new AzureBlobContentSource(blobContainerUrl)));

DocumentModelDetails model = poller.getFinalResult();

System.out.printf("Model ID: %s%n", model.getModelId());
System.out.printf("Description: %s%n", model.getDescription());
System.out.printf("Created: %s%n", model.getCreatedOn());

if (model.getDocumentTypes() != null) {
    model.getDocumentTypes().forEach((docType, details) -> {
        System.out.printf("Document type: %s%n", docType);
        details.getFieldSchema().forEach((field, schema) -> {
            System.out.printf("  Field: %s (%s)%n", field, schema.getType());
            if (details.getFieldConfidence() != null) {
                System.out.printf("  Confidence: %.2f%n",
                    details.getFieldConfidence().get(field));
            }
        });
    });
}

7. Analyze with Custom Model

import java.util.Arrays;
import java.util.Collections;

String documentUrl = "{document-url}";
String modelId = "my-custom-model";

SyncPoller<AnalyzeOperationDetails, AnalyzeResult> poller =
    client.beginAnalyzeDocument(modelId,
        new AnalyzeDocumentOptions(documentUrl)
            .setPages(Collections.singletonList("1"))
            .setLocale("en-US")
            .setStringIndexType(StringIndexType.TEXT_ELEMENTS)
            .setDocumentAnalysisFeatures(
                Arrays.asList(DocumentAnalysisFeature.LANGUAGES))
            .setOutputContentFormat(DocumentContentFormat.TEXT));

AnalyzeResult result = poller.getFinalResult();

for (AnalyzedDocument doc : result.getDocuments()) {
    System.out.printf("Doc type: %s (confidence: %.2f)%n",
        doc.getDocumentType(), doc.getConfidence());
    doc.getFields().forEach((name, field) -> {
        System.out.printf("  %s: %s (confidence: %.2f)%n",
            name, field.getContent(), field.getConfidence());
    });
}

// Pages, lines, words
for (DocumentPage page : result.getPages()) {
    System.out.printf("Page %d: %.2f x %.2f %s%n",
        page.getPageNumber(), page.getWidth(), page.getHeight(), page.getUnit());
    for (DocumentLine line : page.getLines()) {
        System.out.printf("  Line: '%s'%n", line.getContent());
    }
    for (DocumentWord word : page.getWords()) {
        System.out.printf("  Word: '%s' (%.2f)%n",
            word.getContent(), word.getConfidence());
    }
}

// Tables
for (DocumentTable table : result.getTables()) {
    System.out.printf("Table: %d rows x %d columns%n",
        table.getRowCount(), table.getColumnCount());
    for (DocumentTableCell cell : table.getCells()) {
        System.out.printf("  Cell[%d,%d]: '%s'%n",
            cell.getRowIndex(), cell.getColumnIndex(), cell.getContent());
    }
}

8. Document Classification

Build Classifier

import java.util.HashMap;
import java.util.Map;

Map<String, ClassifierDocumentTypeDetails> docTypes = new HashMap<>();

docTypes.put("invoice", new ClassifierDocumentTypeDetails()
    .setAzureBlobSource(new AzureBlobContentSource(containerSasUrl)
        .setPrefix("invoices/")));

docTypes.put("receipt", new ClassifierDocumentTypeDetails()
    .setAzureBlobSource(new AzureBlobContentSource(containerSasUrl)
        .setPrefix("receipts/")));

SyncPoller<DocumentClassifierBuildOperationDetails, DocumentClassifierDetails> poller =
    adminClient.beginBuildClassifier(
        new BuildDocumentClassifierOptions("my-classifier", docTypes));

DocumentClassifierDetails classifier = poller.getFinalResult();
System.out.printf("Classifier ID: %s%n", classifier.getClassifierId());
System.out.printf("Created: %s%n", classifier.getCreatedOn());

classifier.getDocumentTypes().forEach((type, details) ->
    System.out.printf("  Type: %s%n", type));

Classify a Document

String documentUrl = "https://example.com/document.pdf";

SyncPoller<AnalyzeOperationDetails, AnalyzeResult> poller =
    client.beginClassifyDocument("my-classifier",
        new ClassifyDocumentOptions(documentUrl));

AnalyzeResult result = poller.getFinalResult();

for (AnalyzedDocument doc : result.getDocuments()) {
    System.out.printf("Type: %s (confidence: %.2f), pages: %d-%d%n",
        doc.getDocumentType(),
        doc.getConfidence(),
        doc.getBoundingRegions().get(0).getPageNumber(),
        doc.getBoundingRegions().get(doc.getBoundingRegions().size() - 1).getPageNumber());
}

9. Manage Models

// Resource limits
DocumentIntelligenceResourceDetails resourceDetails = adminClient.getResourceDetails();
System.out.printf("Models: %d / %d%n",
    resourceDetails.getCustomDocumentModels().getCount(),
    resourceDetails.getCustomDocumentModels().getLimit());

// List all models
PagedIterable<DocumentModelDetails> models = adminClient.listModels();
for (DocumentModelDetails model : models) {
    System.out.printf("Model: %s (created: %s)%n",
        model.getModelId(), model.getCreatedOn());
}

// Get specific model
DocumentModelDetails model = adminClient.getModel("model-id");
System.out.printf("Model ID: %s%n", model.getModelId());
System.out.printf("Description: %s%n", model.getDescription());
System.out.printf("Created: %s%n", model.getCreatedOn());

if (model.getDocumentTypes() != null) {
    model.getDocumentTypes().forEach((docType, details) -> {
        details.getFieldSchema().forEach((field, schema) -> {
            System.out.printf("  Field: %s (%s)%n", field, schema.getType());
        });
    });
}

// Delete model
adminClient.deleteModel("model-id");

10. Async Pattern

import com.azure.ai.documentintelligence.DocumentIntelligenceAsyncClient;
import reactor.core.publisher.Mono;

DocumentIntelligenceAsyncClient asyncClient = new DocumentIntelligenceClientBuilder()
    .endpoint(System.getenv("DOCUMENT_INTELLIGENCE_ENDPOINT"))
    .credential(new DefaultAzureCredentialBuilder().build())
    .buildAsyncClient();

// Async analyze from URL
asyncClient.beginAnalyzeDocument("prebuilt-layout",
        new AnalyzeDocumentOptions(documentUrl))
    .flatMap(poller -> poller.getFinalResult())
    .subscribe(result -> {
        System.out.printf("Content: %s%n", result.getContent());
        result.getPages().forEach(page ->
            System.out.printf("Page %d: %d lines%n",
                page.getPageNumber(), page.getLines().size()));
    }, error -> System.err.printf("Error: %s%n", error.getMessage()));

11. Error Handling

import com.azure.core.exception.HttpResponseException;

try {
    SyncPoller<AnalyzeOperationDetails, AnalyzeResult> poller =
        client.beginAnalyzeDocument("prebuilt-receipt",
            new AnalyzeDocumentOptions("not-a-valid-url"));

    AnalyzeResult result = poller.getFinalResult();
} catch (HttpResponseException e) {
    System.err.printf("HTTP Error %d: %s%n",
        e.getResponse().getStatusCode(), e.getMessage());
} catch (Exception e) {
    System.err.printf("Error: %s%n", e.getMessage());
}

12. Complete Application Example

import com.azure.ai.documentintelligence.DocumentIntelligenceClient;
import com.azure.ai.documentintelligence.DocumentIntelligenceClientBuilder;
import com.azure.ai.documentintelligence.models.*;
import com.azure.core.exception.HttpResponseException;
import com.azure.core.util.polling.SyncPoller;
import com.azure.identity.DefaultAzureCredentialBuilder;

import java.util.Map;

public class DocumentIntelligenceExample {

    public static void main(String[] args) {
        // Initialize client
        DocumentIntelligenceClient client = new DocumentIntelligenceClientBuilder()
            .endpoint(System.getenv("DOCUMENT_INTELLIGENCE_ENDPOINT"))
            .credential(new DefaultAzureCredentialBuilder().build())
            .buildClient();

        String receiptUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-java/main/"
            + "sdk/documentintelligence/azure-ai-documentintelligence/"
            + "src/samples/resources/sample-forms/receipts/contoso-allinone.jpg";

        try {
            // Analyze receipt
            SyncPoller<AnalyzeOperationDetails, AnalyzeResult> poller =
                client.beginAnalyzeDocument("prebuilt-receipt",
                    new AnalyzeDocumentOptions(receiptUrl));

            AnalyzeResult result = poller.getFinalResult();

            System.out.printf("Analyzed %d document(s):%n", result.getDocuments().size());

            for (AnalyzedDocument doc : result.getDocuments()) {
                Map<String, DocumentField> fields = doc.getFields();

                printField("Merchant", fields.get("MerchantName"));
                printField("Date", fields.get("TransactionDate"));
                printField("Total", fields.get("Total"));

                DocumentField items = fields.get("Items");
                if (items != null && items.getType() == DocumentFieldType.LIST) {
                    System.out.println("Items:");
                    for (DocumentField item : items.getValueList()) {
                        Map<String, DocumentField> itemFields = item.getValueObject();
                        DocumentField desc = itemFields.get("Description");
                        DocumentField price = itemFields.get("TotalPrice");
                        System.out.printf("  - %s: %s%n",
                            desc != null ? desc.getContent() : "?",
                            price != null ? price.getContent() : "?");
                    }
                }
            }
        } catch (HttpResponseException e) {
            System.err.printf("Service error %d: %s%n",
                e.getResponse().getStatusCode(), e.getMessage());
        }
    }

    static void printField(String label, DocumentField field) {
        if (field != null) {
            System.out.printf("%s: %s (confidence: %.2f)%n",
                label, field.getContent(), field.getConfidence());
        }
    }
}

Field Type Accessors Reference

DocumentFieldType Accessor Method
STRING getValueString()
DATE getValueDate()
TIME getValueTime()
PHONE_NUMBER getValuePhoneNumber()
NUMBER getValueNumber()
INTEGER getValueInteger()
BOOLEAN getValueBoolean()
LIST getValueList() → List<DocumentField>
OBJECT getValueObject() → Map<String, DocumentField>
CURRENCY getValueCurrency() → CurrencyValue
ADDRESS getValueAddress() → AddressValue
COUNTRY_REGION getValueCountryRegion()
SELECTION_MARK getValueSelectionMark()
SIGNATURE getValueSignature()
(any) getContent() → raw string content

Source: SKILL.md on GitHub

2 warnings15d4 checks · Risk SAFE
  • Gen Agent Trust Hub15d

    This skill provides implementation patterns for Azure AI Document Intelligence using official Java SDKs. It includes standard security considerations for document processing tools, such as the ingestion of external content. The skill follows recommended practices by using environment variables for sensitive configuration and official libraries from a trusted vendor.

  • Socket15d

    No alerts

  • Snyk15d

    Risk: MEDIUM · 1 issue

  • Runlayer7mo

    3/3 files flagged

Signed by skilld at e7ee58f. This ties the file your Agent reads to that commit on GitHub. It does not review the instructions.

Last checked against GitHub 20 hours ago.

Activeupdated 5 months ago

README badge

README badge for microsoft/skills/azure-ai-formrecognizer-java