如何使用Python批量提取PDF文件中的内嵌附件?
Python批量提取PDF内嵌附件实现方案
以下是两种可直接落地的实现方案,可根据你的PDF文件特性选择:
方案1:PyPDF2 实现(轻量易部署)
适合附件为PDF标准内嵌格式的普通场景,依赖安装命令:pip install PyPDF2
可直接运行的批量处理代码:
import os from PyPDF2 import PdfReader # 配置路径 PDF_FOLDER = "你的PDF文件夹路径" OUTPUT_FOLDER = "提取出的附件保存路径" os.makedirs(OUTPUT_FOLDER, exist_ok=True) for filename in os.listdir(PDF_FOLDER): if not filename.lower().endswith(".pdf"): continue pdf_path = os.path.join(PDF_FOLDER, filename) try: reader = PdfReader(pdf_path) if "/EmbeddedFiles" not in reader.root: print(f"{filename} 无内嵌附件,跳过") continue # 遍历所有内嵌附件 embedded_files = reader.root["/EmbeddedFiles"]["/Names"] for i in range(0, len(embedded_files), 2): attach_name = embedded_files[i].get_object() attach_data = embedded_files[i+1].get_object() file_content = attach_data["/EF"]["/F"].get_data() # 避免重名,给附件名加原PDF前缀 save_name = f"{os.path.splitext(filename)[0]}_{attach_name}" save_path = os.path.join(OUTPUT_FOLDER, save_name) with open(save_path, "wb") as f: f.write(file_content) print(f"{filename} 附件提取完成") except Exception as e: print(f"{filename} 处理失败,错误信息:{str(e)}") continue
方案2:PyMuPDF(fitz)实现(兼容性更强,推荐大批量使用)
对非常规结构的PDF内嵌附件识别率更高,处理速度更快,适合2000份这种批量处理场景,依赖安装命令:pip install pymupdf
可直接运行的批量处理代码:
import os import fitz # 配置路径 PDF_FOLDER = "你的PDF文件夹路径" OUTPUT_FOLDER = "提取出的附件保存路径" os.makedirs(OUTPUT_FOLDER, exist_ok=True) for filename in os.listdir(PDF_FOLDER): if not filename.lower().endswith(".pdf"): continue pdf_path = os.path.join(PDF_FOLDER, filename) try: doc = fitz.open(pdf_path) embedded_files = doc.embfile_count() if embedded_files == 0: print(f"{filename} 无内嵌附件,跳过") doc.close() continue for i in range(embedded_files): attach_info = doc.embfile_info(i) attach_name = attach_info["filename"] file_content = doc.embfile_get(i) # 避免重名,加原PDF前缀 save_name = f"{os.path.splitext(filename)[0]}_{attach_name}" save_path = os.path.join(OUTPUT_FOLDER, save_name) with open(save_path, "wb") as f: f.write(file_content) doc.close() print(f"{filename} 附件提取完成") except Exception as e: print(f"{filename} 处理失败,错误信息:{str(e)}") continue
注意事项
- 上述两种方案仅支持PDF标准规范下的内嵌附件,若你的附件是嵌入在注释、表单域、签名区块等特殊位置的非标准附件,需要额外调整匹配规则
- 批量处理全量文件前,建议先挑选3-5份不同结构的样本文件测试,确认提取的附件完整、命名正确后再运行全量任务
- 代码中已经默认给提取出的附件添加了原PDF的文件名作为前缀,可根据需要自行调整命名规则
内容的提问来源于stack exchange,提问作者Neil Christiane Buenaobra
相关产品推荐
相关产品推荐

