文本格式分析,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 通过代码调试时,我得到了正确的结果。