Reputation: 11
The Document Intelligence general document model is now deprecated with the 2023-10-31 preview, and the documentation specifies that I should use the Layout model with the optional query string parameter features=keyValuePairs enabled if I want to extract key-value pairs, selection marks, text, tables, and structure from documents. I am using the document intelligence Java SDK, and I am not sure how to do this.
I tried the following, but I get an error saying the model was not found:
SyncPoller < OperationResult, AnalyzeResult > analyzeDocumentPoller = client.beginAnalyzeDocumentFromUrl("prebuilt-layout?features=keyValuePairs", "insert-document-url-here");
Here's the error code:
Exception in thread "main" com.azure.core.exception.HttpResponseException: Status code 404, "{"error":{"code":"NotFound","message":"Resource not found.","innererror":{"code":"ModelNotFound","message":"The requested model was not found."}}}"
at com.azure.ai.formrecognizer.documentanalysis.implementation.util.Transforms.getHttpResponseException(Transforms.java:351)
at com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient.analyzeDocument(DocumentAnalysisClient.java:612)
at com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient.lambda$analyzeActivationOperation$4(DocumentAnalysisClient.java:555)
at com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient.lambda$beginAnalyzeDocumentFromUrlSync$0(DocumentAnalysisClient.java:247)
at com.azure.core.util.polling.SimpleSyncPoller.<init>(SimpleSyncPoller.java:65)
at com.azure.core.util.polling.SyncPoller.createPoller(SyncPoller.java:127)
at com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient.beginAnalyzeDocumentFromUrlSync(DocumentAnalysisClient.java:239)
at com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient.beginAnalyzeDocumentFromUrl(DocumentAnalysisClient.java:222)
at com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient.beginAnalyzeDocumentFromUrl(DocumentAnalysisClient.java:178)
at FormRecognizer.main(FormRecognizer.java:35)
If I use the regular "prebuilt-layout" model id, the code runs and analyzes the document, but it doesn't return the key-value pairs.
where can I specify features=keyValuePairs so that the model can detect the key value pairs of the document as well?
Upvotes: 1
Views: 738
Reputation: 1327
you need to use the Layout model and set the features parameter correctly. Try this code andnhopefully it works.
import com.azure.ai.formrecognizer.FormRecognizerClientBuilder;
import com.azure.ai.formrecognizer.models.AnalyzeResult;
import com.azure.ai.formrecognizer.models.FormRecognizerOperationResult;
import com.azure.ai.formrecognizer.models.FormRecognizerError;
import com.azure.ai.formrecognizer.models.RecognizedForm;
import com.azure.ai.formrecognizer.models.USReceipt;
import com.azure.ai.formrecognizer.models.OperationResult;
import com.azure.ai.formrecognizer.models.FormContentType;
import com.azure.ai.formrecognizer.models.FormRecognizerLocale;
import com.azure.ai.formrecognizer.models.FormRecognizerOperation;
import com.azure.ai.formrecognizer.models.FormRecognizerErrorInformation;
import com.azure.ai.formrecognizer.implementation.util.ModelHelper;
import com.azure.ai.formrecognizer.implementation.util.OperationHeaders;
import com.azure.ai.formrecognizer.implementation.util.ModelHelper;
import com.azure.ai.formrecognizer.DocumentAnalysisAsyncClient;
import com.azure.ai.formrecognizer.DocumentAnalysisClientBuilder;
import com.azure.ai.formrecognizer.models.ModelOperation;
import com.azure.ai.formrecognizer.models.Model;
import com.azure.ai.formrecognizer.models.OperationStatus;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.credential.AzureKeyCredentialBuilder;
import com.azure.core.http.HttpPipeline;
import com.azure.core.http.HttpPipelineBuilder;
import com.azure.core.http.HttpClient;
import com.azure.core.http.netty.NettyAsyncHttpClientBuilder;
import com.azure.core.http.policy.HttpPipelinePolicy;
import com.azure.core.http.policy.HttpPipelinePolicyChain;
import com.azure.core.http.policy.HttpPipelinePolicyChainBuilder;
import com.azure.core.http.policy.HttpPipelinePolicyProvider;
import com.azure.core.http.policy.RetryPolicy;
import com.azure.core.http.policy.UserAgentPolicy;
import com.azure.core.http.rest.Response;
import com.azure.core.http.rest.PagedIterable;
import com.azure.core.http.rest.SimpleResponse;
import com.azure.core.util.Context;
import com.azure.core.util.polling.PollerFlux;
import com.azure.core.util.polling.SyncPoller;
import com.azure.core.util.polling.PollResponse;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
public class FormRecognizer {
public static void main(String[] args) {
String endpoint = "your-form-recognizer-endpoint";
String apiKey = "your-api-key";
String documentUrl = "insert-document-url-here";
// Set up the Azure Form Recognizer client
AzureKeyCredential credential = new AzureKeyCredential(apiKey);
DocumentAnalysisAsyncClient client = new DocumentAnalysisClientBuilder()
.credential(credential)
.endpoint(endpoint)
.httpClient(new NettyAsyncHttpClientBuilder().build())
.buildAsyncClient();
// Specify features=keyValuePairs for the Layout model
String modelId = "prebuilt-layout";
String modelWithFeatures = modelId + "?features=keyValuePairs";
// Start analyzing the document
SyncPoller<OperationResult, AnalyzeResult> analyzeDocumentPoller =
client.beginAnalyzeDocumentFromUrl(modelWithFeatures, documentUrl);
// Wait for the operation to complete
PollResponse<OperationResult> pollResponse = analyzeDocumentPoller.poll();
OperationResult operationResult = pollResponse.getValue();
// Retrieve the results
AnalyzeResult analyzeResult = analyzeDocumentPoller.getFinalResult();
// Process the analyzeResult to get key-value pairs
// (Note: This part depends on the structure of the AnalyzeResult and the data you want to extract)
List<RecognizedForm> recognizedForms = analyzeResult.getRecognizedForms();
for (RecognizedForm recognizedForm : recognizedForms) {
Map<String, String> keyValuePairMap = recognizedForm.getKeyValuePairs();
// Process the key-value pairs as needed
for (Map.Entry<String, String> entry : keyValuePairMap.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println("Key: " + key + ", Value: " + value);
}
}
// Close the client
client.close();
}
}
Upvotes: 0