如何使用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
相关产品推荐
相关产品推荐

