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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:15:02