AWS text - GetDocumentAnalysisRequest只返回文档第一页的正确结果



我已经编写了使用Amazon text从pdf中提取表和名称值对的代码。我遵循了这个例子:https://docs.aws.amazon.com/textract/latest/dg/async-analyzing-with-sqs.html它在Java 1.1版的SDK中。我已经为版本2重构了它。

这是一个异步进程,只适用于多页文档。当我得到结果时,第一页是相当准确的。但连续的页面大多是空行。我解析的文件是扫描的,所以质量不是很好。但是,如果我取单个页面的jpg并使用一页操作,即AnalyzeDocumentRequest,则每个页面都很好。Amazon text tryit服务也可以正确地呈现页面。

所以错误一定是在我的代码,但不能看到在哪里。如你所见,这一切都发生在这里:

GetDocumentAnalysisRequest documentAnalysisRequest = GetDocumentAnalysisRequest.builder().jobId(jobId)
.maxResults(maxResults).nextToken(paginationToken).build();
response = textractClient.getDocumentAnalysis(documentAnalysisRequest);

我真的不能做任何干预。

最有可能出错的地方是在收集页和表块的util文件中,即在这里:

PageModel pageModel = tableUtil.getTableResults(blocks);

但是这对于第一页来说工作得很好,并且我也可以在上面的响应对象中看到,返回的块数量要少得多。

下面是完整的代码:


private DocumentModel getDocumentAnalysisResults(String jobId) throws Exception {
int maxResults = 1000;
String paginationToken = null;
GetDocumentAnalysisResponse response = null;
Boolean finished = false;
int pageCount = 0;
DocumentModel documentModel = new DocumentModel();
// loops until pagination token is null
while (finished == false) {
GetDocumentAnalysisRequest documentAnalysisRequest = GetDocumentAnalysisRequest.builder().jobId(jobId)
.maxResults(maxResults).nextToken(paginationToken).build();
response = textractClient.getDocumentAnalysis(documentAnalysisRequest);
// Show blocks, confidence and detection times
List<Block> blocks = response.blocks();
PageModel pageModel = tableUtil.getTableResults(blocks);
pageModel.setPageNumber(pageCount++);
Map<String,String> keyValues = formUtil.getFormResults(blocks);
pageModel.setKeyValues(keyValues);
documentModel.getPages().add(pageModel);
paginationToken = response.nextToken();
if (paginationToken == null)
finished = true;
}
return documentModel;
}

还有其他人遇到这个问题吗?

多谢

如果响应有NextToken,那么您需要召回文本并传入NextToken以获得下一批块。我不确定如何在Java中做到这一点,但这里是来自AWS repo的python示例https://github.com/aws-samples/amazon-textract-serverless-large-scale-document-processing/blob/master/src/jobresultsproc.py

对于我的解决方案,我做了一个简单的if响应['NextToken'],然后召回方法并将响应['Blocks']连接到我的当前列表。

你必须检查你是否有NextToken并从该页面获得结果如果你需要,你可以合并结果

var results = textractAnalysisService.GetJobResults(jobId);
if (results.NextToken != null)
{
var secondResult = textractAnalysisService.GetJobResults(jobId, results.NextToken);
}
public GetDocumentAnalysisResponse GetJobResults(string jobId, string nextToken = null)
{
var response = this.textract.GetDocumentAnalysisAsync(new GetDocumentAnalysisRequest
{
JobId = jobId,
NextToken = nextToken
});
response.Wait();
return response.Result;
}

最新更新