文本格式分析,Java SDK 1.x
Textract Form Analysis, Java SDK 1.x
我正在寻找利用 textract 提取表单数据的方法。我在演示中使用 PDF 进行了测试,结果非常好。然而,使用 SDK 的结果远非最佳,实际上完全不准确。如果我使用 StartDocumentAnalysisRequest/StartDocumentAnalysisResult
(异步),我只会返回 1 个类型为 PAGE
的块,而不会返回 KEY_VALUE_SET
。如果我将我的 PDF 转换为图像并使用同步方法,我确实得到 KEY_VALUE_SET
但结果完全不准确。
有谁知道如何利用异步分析功能来检索文档中指示的表单值?
下面的示例代码:
StartDocumentAnalysisResult startDocumentAnalysisResult = amazonTextract.startDocumentAnalysis(req);
String startJobId = startDocumentAnalysisResult.getJobId();
GetDocumentAnalysisResult documentAnalysisResult = null;
String jobStatus = "IN_PROGRESS";
while (jobStatus.equals("IN_PROGRESS")) {
try {
TimeUnit.SECONDS.sleep(10);
GetDocumentAnalysisRequest documentAnalysisRequest = new GetDocumentAnalysisRequest()
.withJobId(startJobId)
.withMaxResults(1);
documentAnalysisResult = amazonTextract.getDocumentAnalysis(documentAnalysisRequest);
jobStatus = documentAnalysisResult.getJobStatus();
} catch (Exception e) {
logger.error(e);
}
}
if (!jobStatus.equals("IN_PROGRESS")) {
List<Block> blocks = documentAnalysisResult.getBlocks();
logger.error("block list size " + blocks.size());
Map<String, Map<String, Block>> keyValueBlockMap = new HashMap<>();
Map<String, Block> keyMap = new HashMap<>();
Map<String, Block> valueMap = new HashMap<>();
Map<String, Block> blockMap = new HashMap<>();
for (Block block : blocks) {
logger.error("Block Type:" + block.getBlockType());
String blockId = block.getId();
blockMap.put(blockId, block);
if (block.getBlockType().equals("KEY_VALUE_SET")) {
if (block.getEntityTypes().contains("KEY")) {
keyMap.put(blockId, block);
} else {
valueMap.put(blockId, block);
}
}
}
keyValueBlockMap.put("keyMap", keyMap);
keyValueBlockMap.put("valueMap", valueMap);
keyValueBlockMap.put("blockMap", blockMap);
Map<String, String> keyValueRelationShip = getKeyValueRelationShip(keyValueBlockMap);
for (String key : keyValueRelationShip.keySet()) {
logger.error("Key: " + key);
logger.error("Value: " + keyValueRelationShip.get(key));
}
}
导致完全可怕结果的同步路径:
AnalyzeDocumentRequest request = new AnalyzeDocumentRequest() .withFeatureTypes(FeatureType.FORMS) .withDocument(new Document(). withS3Object(new com.amazonaws.services.textract.model.S3Object() .withName(objectName) .withBucket(awsHelper.getS3BucketName())));
AnalyzeDocumentResult result = amazonTextract.analyzeDocument(request);
您没有使用 Java 的 AWS SDK 的推荐版本。您使用的是旧版本,而非推荐版本。
我已经测试了 AWS SDK for Java V2,我能够获得与 AWS 管理控制台一致的行和文本。
您可以在上面链接的存储库中找到 textTract V2 示例。
我可以使用 software.amazon.awssdk.services.textract.TextractClient.
获取行和相应的文本
例如,当我使用与在控制台中使用的相同的 PNG 通过代码调试时,我得到了正确的结果。
我正在寻找利用 textract 提取表单数据的方法。我在演示中使用 PDF 进行了测试,结果非常好。然而,使用 SDK 的结果远非最佳,实际上完全不准确。如果我使用 StartDocumentAnalysisRequest/StartDocumentAnalysisResult
(异步),我只会返回 1 个类型为 PAGE
的块,而不会返回 KEY_VALUE_SET
。如果我将我的 PDF 转换为图像并使用同步方法,我确实得到 KEY_VALUE_SET
但结果完全不准确。
有谁知道如何利用异步分析功能来检索文档中指示的表单值?
下面的示例代码:
StartDocumentAnalysisResult startDocumentAnalysisResult = amazonTextract.startDocumentAnalysis(req);
String startJobId = startDocumentAnalysisResult.getJobId();
GetDocumentAnalysisResult documentAnalysisResult = null;
String jobStatus = "IN_PROGRESS";
while (jobStatus.equals("IN_PROGRESS")) {
try {
TimeUnit.SECONDS.sleep(10);
GetDocumentAnalysisRequest documentAnalysisRequest = new GetDocumentAnalysisRequest()
.withJobId(startJobId)
.withMaxResults(1);
documentAnalysisResult = amazonTextract.getDocumentAnalysis(documentAnalysisRequest);
jobStatus = documentAnalysisResult.getJobStatus();
} catch (Exception e) {
logger.error(e);
}
}
if (!jobStatus.equals("IN_PROGRESS")) {
List<Block> blocks = documentAnalysisResult.getBlocks();
logger.error("block list size " + blocks.size());
Map<String, Map<String, Block>> keyValueBlockMap = new HashMap<>();
Map<String, Block> keyMap = new HashMap<>();
Map<String, Block> valueMap = new HashMap<>();
Map<String, Block> blockMap = new HashMap<>();
for (Block block : blocks) {
logger.error("Block Type:" + block.getBlockType());
String blockId = block.getId();
blockMap.put(blockId, block);
if (block.getBlockType().equals("KEY_VALUE_SET")) {
if (block.getEntityTypes().contains("KEY")) {
keyMap.put(blockId, block);
} else {
valueMap.put(blockId, block);
}
}
}
keyValueBlockMap.put("keyMap", keyMap);
keyValueBlockMap.put("valueMap", valueMap);
keyValueBlockMap.put("blockMap", blockMap);
Map<String, String> keyValueRelationShip = getKeyValueRelationShip(keyValueBlockMap);
for (String key : keyValueRelationShip.keySet()) {
logger.error("Key: " + key);
logger.error("Value: " + keyValueRelationShip.get(key));
}
}
导致完全可怕结果的同步路径:
AnalyzeDocumentRequest request = new AnalyzeDocumentRequest() .withFeatureTypes(FeatureType.FORMS) .withDocument(new Document(). withS3Object(new com.amazonaws.services.textract.model.S3Object() .withName(objectName) .withBucket(awsHelper.getS3BucketName())));
AnalyzeDocumentResult result = amazonTextract.analyzeDocument(request);
您没有使用 Java 的 AWS SDK 的推荐版本。您使用的是旧版本,而非推荐版本。
我已经测试了 AWS SDK for Java V2,我能够获得与 AWS 管理控制台一致的行和文本。
您可以在上面链接的存储库中找到 textTract V2 示例。
我可以使用 software.amazon.awssdk.services.textract.TextractClient.
获取行和相应的文本例如,当我使用与在控制台中使用的相同的 PNG 通过代码调试时,我得到了正确的结果。