使用Amazon Textract提取本地多表格PDF导出至CSV/Excel的配置方法
Amazon Textract本地PDF表格提取脚本适配指南
对应问题场景
目标是通过Amazon Textract提取带多表格的PDF内容,导出为CSV/Excel格式用于后续分析,可使用公开的标准测试PDF样本foo.pdf验证脚本运行效果。
现存问题:已拿到AWS官方示例代码,但不清楚如何调整逻辑,让脚本自动读取本地文件夹内的PDF作为输入源。
核心适配逻辑说明
原AWS示例代码本身已经实现了单文件的本地读取能力:脚本通过open(file_name, 'rb')将本地PDF读取为二进制字节流,再传入analyze_document接口完成识别,缺的只是批量遍历本地文件夹、自动匹配PDF文件的逻辑,不需要大改核心识别流程。
关键注意事项
- 接口限制说明:如果直接通过
Document={'Bytes': bytes_test}的方式传参,Textract对单文件的大小限制为5MB,超出大小的PDF需要先上传到AWS S3存储桶,再通过S3对象路径作为输入源调用接口 - 原代码缺陷修正:
- 原生成CSV的逻辑没有对单元格内的逗号做转义,遇到内容本身带逗号的表格会出现列错位,建议使用Python内置的
csv模块替代手动拼接字符串的逻辑 - 原代码固定输出单个
output.csv,批量处理文件夹内多文件时会出现内容覆盖,建议输出文件名和原PDF文件名一一对应 - 原代码没有统一处理编码,Windows环境下打开CSV容易出现中文乱码,写入文件时要指定
encoding="utf-8-sig"
- 原生成CSV的逻辑没有对单元格内的逗号做转义,遇到内容本身带逗号的表格会出现列错位,建议使用Python内置的
可直接复用的改造代码
1. 批量遍历本地PDF文件夹的入口逻辑
替换原脚本末尾单文件读取的部分,新增自动扫描文件夹的逻辑:
import os import glob def batch_process_local_pdf(input_folder): # 扫描目标文件夹下所有后缀为.pdf的文件 pdf_path_list = glob.glob(os.path.join(input_folder, "*.pdf")) if not pdf_path_list: print("目标文件夹下未找到可处理的PDF文件") return for pdf_path in pdf_path_list: print(f"开始处理文件: {pdf_path}") # 调用原有识别函数获取表格内容 extracted_csv = get_table_csv_results(pdf_path) # 按原PDF名生成输出文件,避免覆盖 output_name = f"{os.path.splitext(os.path.basename(pdf_path))[0]}_提取结果.csv" # 带BOM的utf-8编码避免Windows下乱码 with open(output_name, "wt", encoding="utf-8-sig") as fout: fout.write(extracted_csv) print(f"文件处理完成,输出路径: {output_name}") if __name__ == "__main__": # 替换为你本地存放PDF的文件夹绝对路径 target_folder = "./my_local_pdf_folder" batch_process_local_pdf(target_folder)
2. Excel格式导出适配
如果需要输出为Excel格式,不需要改动Textract的核心提取流程,只需要把提取到的表格内容通过pandas转存为xlsx文件即可,示例片段:
import pandas as pd # 识别到所有表格后,将每个表格单独写入一个sheet with pd.ExcelWriter("提取结果.xlsx") as excel_writer: for table_idx, table_row_data in enumerate(all_extracted_tables): df = pd.DataFrame.from_dict(table_row_data, orient="index") df.to_excel(excel_writer, sheet_name=f"表格{table_idx+1}", index=False)
3. 运行前准备
提前通过aws configure完成本地环境的AWS凭证配置,确保所用账号拥有Textract接口的调用权限,否则会触发认证报错。
内容的提问来源于stack exchange,提问作者Manz
相关产品推荐
相关产品推荐

