You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 12:34:59