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

如何使用Python+AWS Textract+Lambda实现多页PDF的OCR?

多页PDF的AWS Textract OCR解决方案

你的代码使用的是同步analyze_document接口,该接口仅支持处理单页文档(单页PDF、图片),多页PDF必须通过异步API流程处理,具体方案如下:

核心逻辑

用start_document_analysis启动异步OCR任务,再通过get_document_analysis轮询任务状态,待任务完成后提取所有页面的查询结果。

完整代码示例

import boto3
import time

def lambda_handler(event, context):
    textract_client = boto3.client("textract")
    
    # 启动异步多页文档分析任务
    start_response = textract_client.start_document_analysis(
        Document={
            "S3Object": {
                "Bucket": 'test-bucket',
                "Name": 'testpdf.pdf',
            }
        },
        FeatureTypes=["QUERIES"],
        QueriesConfig={
            "Queries": [
                {
                    "Text": "What is opening balance?",
                    "Alias": "OPEN"
                },
                {
                    "Text": "What is closing balance?",
                    "Alias": "CLOSE"
                }
            ]
        }
    )
    
    job_id = start_response["JobId"]
    job_status = "IN_PROGRESS"
    
    # 轮询任务状态
    while job_status == "IN_PROGRESS":
        time.sleep(5)  # 每5秒查询一次任务进度
        status_response = textract_client.get_document_analysis(JobId=job_id)
        job_status = status_response["JobStatus"]
        
        if job_status == "FAILED":
            raise Exception(f"Textract任务失败: {status_response.get('StatusMessage')}")
    
    # 收集所有页面的查询结果
    all_results = []
    next_token = None
    while True:
        # 处理结果分页
        if next_token:
            response = textract_client.get_document_analysis(JobId=job_id, NextToken=next_token)
        else:
            response = textract_client.get_document_analysis(JobId=job_id)
        
        # 提取每页的查询结果
        for block in response["Blocks"]:
            if block["BlockType"] == "QUERY_RESULT":
                all_results.append({
                    "页面编号": block["Page"],
                    "查询别名": block["Query"]["Alias"],
                    "查询文本": block["Query"]["Text"],
                    "结果文本": block["Text"]
                })
        
        next_token = response.get("NextToken")
        if not next_token:
            break
    
    return all_results

关键注意事项

  • Lambda超时配置:多页PDF处理耗时较长,需将Lambda函数超时时间调整为5-10分钟(根据PDF页数灵活调整),避免任务未完成就被终止。
  • 权限设置:确保Lambda角色拥有textract:StartDocumentAnalysis、textract:GetDocumentAnalysis权限,以及目标S3桶的访问权限。
  • 容错处理:代码包含基础失败处理,可根据业务需求扩展重试逻辑或告警机制。

内容的提问来源于stack exchange,提问作者Lintang Gilang Pratama

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:30:58