AWS Textract API多页文档仅返回首页表格数据问题求助
问题排查:AWS Textract仅返回第一页表格数据
问题现象
使用Node.js调用AWS Textract异步接口(StartDocumentAnalysis+GetDocumentAnalysis)从S3存储的PDF提取表格和表单时,仅能获取第一页的表格数据,文本内容和表单键值对均正常,但第一页之后的表格未出现在API响应的Blocks中。而AWS控制台的Textract BulkUploader能正常识别所有页面的表格并导出完整CSV结果。
核心原因
GetDocumentAnalysis API的响应是分页返回的,默认单次返回的Blocks数量有限。你的代码仅调用了一次GetDocumentAnalysis,只拿到了第一页的结果,没有处理响应中的NextToken来获取剩余结果,导致后续页面的表格Blocks被遗漏。AWS控制台会自动处理分页逻辑,因此能获取完整数据。
解决方案
修改waitForJobCompletion函数,在Job成功后通过NextToken循环调用GetDocumentAnalysis,直到获取所有结果并合并Blocks:
const { TextractClient, StartDocumentAnalysisCommand, GetDocumentAnalysisCommand, } = require("@aws-sdk/client-textract"); const fs = require('fs'); // 初始化TextractClient(补充你的region等配置) const textractClient = new TextractClient({ region: 'your-region' }); const startJob = async (file, bucket) => { try { const params = { DocumentLocation: { S3Object: { Bucket: bucket, Name: file, }, }, FeatureTypes: ["FORMS", "TABLES"], }; const command = new StartDocumentAnalysisCommand(params); const response = await textractClient.send(command); const jobId = response.JobId; console.log("Textract job started with ID:", jobId); await waitForJobCompletion(jobId, file); } catch (err) { console.log("Error starting Textract job:", err); } }; const waitForJobCompletion = async (jobId, file) => { try { let jobParams = { JobId: jobId, }; let allBlocks = []; let response; let jobStatus; do { const command = new GetDocumentAnalysisCommand(jobParams); response = await textractClient.send(command); jobStatus = response.JobStatus; console.log("Job status:", jobStatus); if (jobStatus === "SUCCEEDED") { // 合并当前页Blocks到总结果 if (response.Blocks) { allBlocks = [...allBlocks, ...response.Blocks]; } // 检查是否有下一页数据 if (response.NextToken) { jobParams.NextToken = response.NextToken; } else { // 所有数据获取完成,写入文件 fs.writeFile(`./s3-textract-results/tabledata.json`, JSON.stringify({...response, Blocks: allBlocks}), 'utf8', (err) => { if (err) { console.error('Error writing to file:', err); } else { console.log('完整数据已写入文件.'); } }); console.log('所有Blocks已获取:', allBlocks.length); break; } } else if (jobStatus === "FAILED" || jobStatus === "PARTIAL_SUCCESS") { console.log("Job failed or partially succeeded:", response); break; } else { await new Promise((resolve) => setTimeout(resolve, 10000)); } } while (jobStatus === "IN_PROGRESS" || jobStatus === "PARTIAL_SUCCESS" || response.NextToken); } catch (err) { console.log("Error retrieving Textract job results:", err); } };
关键修改点
- 新增
allBlocks数组存储所有分页返回的Blocks - 在Job成功后,检查
response.NextToken,存在则携带该Token继续调用接口 - 所有数据获取完成后,合并Blocks再写入文件
内容的提问来源于stack exchange,提问作者Maharshi
相关产品推荐
相关产品推荐

