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

如何将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}")
修改说明
  1. 新增文本存储逻辑:初始化空列表存储所有识别到的LINE类型文本,遍历结束后转换为Pandas DataFrame,确保写入Excel的数据源有效。
  2. 修正Excel写入参数:将错误的参数名sheetName改为Pandas标准参数sheet_name,新增index=False避免写入多余的行号列。
  3. 新增S3上传逻辑:调用boto3的S3客户端upload_file方法,将生成的本地Excel文件上传到原S3桶,你可以根据需要调整上传后的文件路径和名称。
  4. 移除了原代码中残留的无效占位符enter code here。
注意事项
  • 运行代码前请确保你的AWS凭证已正确配置(凭证文件、环境变量或IAM角色),且具备Textract作业调用权限、S3桶的读写权限。
  • 你可以根据业务需要调整DataFrame的结构,比如增加页码、行号等字段后再写入Excel。

内容的提问来源于stack exchange,提问作者Desert Eagle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:48:02