用Python批量提取PDF文件中的图片(附源代码)
❝
今天分享一个,批量从PDF文件中提取图片的Python脚本及源码解释。几十个PDF跑一遍,PDF中的全部图片自动提取保存。免费、本地运行、不泄露文件、想转多少转多少。回复「Py脚本」获取。
一、先看效果
运行脚本,选文件夹,文件夹内所有PDF文件秒提取图片
只需要:
-
将所有要提取图片的PDF放进一个文件夹 -
双击运行脚本,输入文件夹路径 -
脚本自动处理所有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?
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
八、今日挑战
找个带图片的PDF(产品手册、电子书都可以)试试,如遇到任何问题,评论区告诉小编。
九、下期写什么?
你想用Python解决什么日常麻烦?比如:
-
批量提取PDF里的文字?
-
把多个图片合成一个PDF?
-
自动给图片加水印?
-
按文件名自动分类文件?
留下需求,点赞最高的需求,下期安排脚本!免费、好用、带详细解释。
回复「Py脚本」获取PDF版学习资料及各种免费脚本
往期精选:
图片太大发不了?这个免费Python工具一键批量压缩(附代码)
夜雨聆风