如何将boto3提取的S3内PDF内容存为xlsx并回传至同AWS S3桶
问题原因
- 未存储识别到的文本内容:原代码仅在终端打印Textract返回的LINE类型文本,没有将内容存入结构化容器,最终调用
to_excel的item是遍历结束后残留的单个Block对象,不是可写入Excel的表格数据,因此生成空文件。 - 缺少S3上传逻辑:原代码仅生成本地Excel文件,没有调用S3 SDK的上传接口将文件同步回目标桶。
- Excel写入参数错误:原代码中
sheetName是错误的参数名,Pandas标准参数为sheet_name。
修改后的完整代码
import boto3 import time import pandas as pd # Textract APIs used - "start_document_text_detection", "get_document_text_detection" def InvokeTextDetectJob(s3BucketName, objectName): response = None client = boto3.client('textract') response = client.start_document_text_detection( DocumentLocation={ 'S3Object': { 'Bucket': s3BucketName, 'Name': objectName } }) return response["JobId"] def CheckJobComplete(jobId): time.sleep(5) client = boto3.client('textract') response = client.get_document_text_detection(JobId=jobId) status = response["JobStatus"] print("Job status: {}".format(status)) while(status == "IN_PROGRESS"): time.sleep(5) response = client.get_document_text_detection(JobId=jobId) status = response["JobStatus"] print("Job status: {}".format(status)) return status def JobResults(jobId): pages = [] client = boto3.client('textract') response = client.get_document_text_detection(JobId=jobId) pages.append(response) print("Resultset page recieved: {}".format(len(pages))) nextToken = None if('NextToken' in response): nextToken = response['NextToken'] while(nextToken): response = client.get_document_text_detection(JobId=jobId, NextToken=nextToken) pages.append(response) print("Resultset page recieved: {}".format(len(pages))) nextToken = None if('NextToken' in response): nextToken = response['NextToken'] return pages # S3 Document Data s3BucketName = "pdfbucket" documentName = "pdf" output_excel_name = "output_cp.xlsx" # 上传到S3后的文件名,可自定义 s3_output_key = f"converted/{documentName.split('.')[0]}.xlsx" # 存储识别到的所有文本 text_list = [] # Function invokes jobId = InvokeTextDetectJob(s3BucketName, documentName) print("Started job with id: {}".format(jobId)) if(CheckJobComplete(jobId)): response = JobResults(jobId) for resultPage in response: for item in resultPage["Blocks"]: if item["BlockType"] == "LINE": print (item["Text"]) text_list.append(item["Text"]) # 转换为DataFrame写入Excel df = pd.DataFrame(text_list, columns=["PDF识别内容"]) with pd.ExcelWriter(output_excel_name) as writer: df.to_excel(writer, sheet_name='Sheet1', index=False) # 上传Excel到S3桶 s3 = boto3.client('s3') s3.upload_file(output_excel_name, s3BucketName, s3_output_key) print(f"文件已成功上传到S3:s3://{s3BucketName}/{s3_output_key}")
修改说明
- 新增文本存储逻辑:初始化空列表存储所有识别到的LINE类型文本,遍历结束后转换为Pandas DataFrame,确保写入Excel的数据源有效。
- 修正Excel写入参数:将错误的参数名
sheetName改为Pandas标准参数sheet_name,新增index=False避免写入多余的行号列。 - 新增S3上传逻辑:调用boto3的S3客户端
upload_file方法,将生成的本地Excel文件上传到原S3桶,你可以根据需要调整上传后的文件路径和名称。 - 移除了原代码中残留的无效占位符
enter code here。
注意事项
- 运行代码前请确保你的AWS凭证已正确配置(凭证文件、环境变量或IAM角色),且具备Textract作业调用权限、S3桶的读写权限。
- 你可以根据业务需要调整DataFrame的结构,比如增加页码、行号等字段后再写入Excel。
内容的提问来源于stack exchange,提问作者Desert Eagle
相关产品推荐
相关产品推荐

