乐于分享
好东西不私藏

用Python批量提取PDF文件中的图片(附源代码)

用Python批量提取PDF文件中的图片(附源代码)

今天分享一个,批量从PDF文件中提取图片的Python脚本及源码解释。几十个PDF跑一遍,PDF中的全部图片自动提取保存。免费、本地运行、不泄露文件、想转多少转多少。回复「Py脚本」获取。

一、先看效果

运行脚本,选文件夹,文件夹内所有PDF文件秒提取图片

只需要:

  1. 将所有要提取图片的PDF放进一个文件夹
  2. 双击运行脚本,输入文件夹路径
  3. 脚本自动处理所有PDF,每个PDF里的图片按顺序保存

运行界面:

=== PDF图片批量提取工具 ===请输入PDF文件夹路径:D:\产品资料✅ 共找到 8 个PDF文件,开始提取图片...正在处理:第1/8个 - 产品手册.pdf  提取到 15 张图片 → 已保存到 D:\产品资料\产品手册_图片正在处理:第2/8个 - 技术文档.pdf  提取到 8 张图片 → 已保存到 D:\产品资料\技术文档_图片...✅ 全部完成!共处理8个PDF,提取图片888张

二、完整代码

import osimport sysimport fitz  # PyMuPDFprint("=== PDF图片批量提取工具 ===")folder = input("请输入PDF文件夹路径:").strip()folder = folder.strip('"').strip("'")if not os.path.isdir(folder):print(f"❌ 文件夹不存在:{folder}")    input("按回车键退出...")    sys.exit()# 获取所有PDF文件pdf_files = [f for f in os.listdir(folder) if f.lower().endswith('.pdf')]if not pdf_files:print("❌ 文件夹中没有PDF文件")    input("按回车键退出...")    sys.exit()pdf_files.sort()print(f"✅ 共找到 {len(pdf_files)} 个PDF文件,开始提取图片...")total_images = 0for pdf_idx, pdf_name in enumerate(pdf_files, 1):    pdf_path = os.path.join(folder, pdf_name)# 创建同名文件夹存放图片    output_folder = os.path.join(folder, os.path.splitext(pdf_name)[0] + "_图片")    os.makedirs(output_folder, exist_ok=True)print(f"正在处理:第{pdf_idx}/{len(pdf_files)}个 - {pdf_name}")    try:        doc = fitz.open(pdf_path)        image_count = 0for page_num in range(len(doc)):            page = doc[page_num]            images = page.get_images(full=True)for img_idx, img in enumerate(images):                xref = img[0]                pix = fitz.Pixmap(doc, xref)# 保存图片if pix.n - pix.alpha < 4:  # 非CMYK图片                    pix.save(os.path.join(output_folder, f"page{page_num+1}_img{img_idx+1}.png"))else:  # CMYK图片转RGB                    pix1 = fitz.Pixmap(fitz.csRGB, pix)                    pix1.save(os.path.join(output_folder, f"page{page_num+1}_img{img_idx+1}.png"))                    pix1 = None                pix = None                image_count += 1        doc.close()print(f"  ✅ 提取到 {image_count} 张图片")        total_images += image_count    except Exception as e:print(f"  ❌ 处理失败:{e}")print(f"\n🎉 全部完成!共处理 {len(pdf_files)} 个PDF,提取图片 {total_images} 张")print(f"图片已保存到各PDF对应的文件夹中")input("按回车键退出...")

三、安装依赖

打开命令行(CMD)运行:

pip install PyMuPDF

这个库就是 fitz,专门处理PDF文件。

四、代码解释

import fitz  # PyMuPDF

导入PDF处理库,名叫 fitz,安装时用 PyMuPDF

doc = fitz.open(pdf_path)

打开PDF文件,返回一个文档对象。

for page_num in range(len(doc)):    page = doc[page_num]

遍历每一页。

images = page.get_images(full=True)

获取当前页里的所有图片信息,返回列表。

xref = img[0]pix = fitz.Pixmap(doc, xref)

xref是图片的引用ID,用它生成图片对象pixmap

if pix.n - pix.alpha < 4:    pix.save(路径)else:    pix1 = fitz.Pixmap(fitz.csRGB, pix)    pix1.save(路径)

判断图片颜色模式,如是CMYK就转成RGB模式再保存,否则直接保存。

pix = None

释放内存,防止同时处理太多图片而占满内存。

五、踩过的坑

坑1:有些图片提取不出来

如果PDF里的图片是用“画图”之类的软件直接贴进去的,能提取;如果是文字或表格转成的图片,也能提取。但如果PDF是扫描件(本身就是一张大图),这种提不出来——因为整页就是一张图。

坑2:提取出来的图片特别小

PDF里有些图是缩略图,提取出来就是那么小。没办法,原图就那样。

坑3:内存飙升

如果PDF很大、图片很多,同时处理所有图片可能会出现内存不足。代码里每处理一张就pix = None释放内存,基本够用。如果还是爆,可以加个import gc gc.collect()

坑4:文件名太长

保存用 page{页码}_img{序号} 命名,PDF页数很多时,避免文件名不会太长。

六、扩展功能:指定需要提取的图片大小

PDF里经常有一些小图标、水印,如不想提取,可以加个大小过滤代码:

# 在保存前加个判断,只保存宽度>100像素的图片if pix.width > 100 and pix.height > 100:    pix.save(...)

七、为什么用Python?

对比项
在线工具
Python脚本
价格
免费限制页数/收费
0元
隐私
要上传PDF
本地处理
批量
一次一个文件
一键批量
质量
可能压缩图片
原图无损

八、今日挑战

找个带图片的PDF(产品手册、电子书都可以)试试,如遇到任何问题,评论区告诉小编。

九、下期写什么?

你想用Python解决什么日常麻烦?比如:

  1. 批量提取PDF里的文字?

  2. 把多个图片合成一个PDF?

  3. 自动给图片加水印?

  4. 按文件名自动分类文件?

    留下需求,点赞最高的需求,下期安排脚本!免费、好用、带详细解释。

    回复「Py脚本」获取PDF版学习资料及各种免费脚本


    往期精选:

    50份Word转PDF,半天的工作Python几秒搞定(附源代码)
    Python一键批量改名几百个文件(附代码)

    图片太大发不了?这个免费Python工具一键批量压缩(附代码)

    图片转PDF还要花钱?这个免费Python工具一键搞定(附代码)

    合并PDF别再傻傻充会员了!这个Python脚本一键搞定(附代码)

    本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » 用Python批量提取PDF文件中的图片(附源代码)

    猜你喜欢

    • 暂无文章