前言:在日常办公中,我们经常遇到这样的场景:产品说明书是pdf格式,需要提取里面的图片做成素材库;论文、简历需要转成图片格式以便预览或上传。手动一个个打开pdf、截图、保存?几十个文件下来,手都点麻了
这时候,python办公自动化就能发挥巨大作用。今天我就带大家用 pymupdf(也就是 fitz 库)写一个批量转换脚本,一键将文件夹内所有pdf转为高清png图片。而且,我会把我在实际踩坑中遇到的新旧版本api不兼容问题全部列出来供大家参考
只需要安装一个库——pymupdf(它内部包含 fitz 模块):
pip install pymupdf -i https://pypi.tuna.tsinghua.edu.cn/simple
完整代码和实现原理


创建一个python文件(比如 pdf_to_image.py),将以下代码完整复制进去:
# -*- coding: utf-8 -*-
'''
python批量将pdf转为图片文件
'''
# 安装所需模块(建议安装最新版)
# pip install pymupdf -i https://pypi.tuna.tsinghua.edu.cn/simple
import os
import fitz
def pymupdf_fitz(pdfpath, imagepath):
'''转换主函数'''
pdfdoc = fitz.open(pdfpath)
for pg in range(len(pdfdoc)): # 兼容新旧版
page = pdfdoc[pg]
rotate = int(0)
zoom_x = 1.33333333
zoom_y = 1.33333333
# 新版方法名为 prerotate(小写)
mat = fitz.matrix(zoom_x, zoom_y).prerotate(rotate)
# 新版方法名为 get_pixmap(下划线)
pix = page.get_pixmap(matrix=mat, alpha=false)
if not os.path.exists(imagepath):
os.makedirs(imagepath)
# 生成图片路径
img_path = os.path.join(imagepath, 'images_%s.png' % pg)
# ---------- 兼容 writepng 和 save ----------
if hasattr(pix, 'writepng'): # 旧版
pix.writepng(img_path)
else: # 新版
pix.save(img_path) # save 自动根据扩展名保存为 png
print('转换成功: ' + imagepath)
if __name__ == '__main__':
# 动态获取脚本所在目录
base_dir = os.path.dirname(os.path.abspath(__file__))
pdfpath = base_dir
imgpath = base_dir
files = os.listdir(pdfpath)
pptfiles = [f for f in files if f.lower().endswith(".pdf")]
for pptfile in pptfiles:
pdffilepath = os.path.join(pdfpath, pptfile)
# 为每个 pdf 建立独立子文件夹
minimgpath = os.path.join(imgpath, os.path.splitext(pptfile)[0])
try:
pymupdf_fitz(pdffilepath, minimgpath)
except exception as e:
print(f"处理文件 {pptfile} 时出错:{e}")路径获取
需要注意的是pdf的存放路径必须是在你文件代码的同一路径下。

使用动态路径(推荐)
不必写死绝对路径,让脚本自动定位到当前文件所在目录,然后拼接子目录或直接使用当前目录。
import os import sys # 获取当前脚本所在目录 script_dir = os.path.dirname(os.path.abspath(__file__)) # 如果你把pdf放在脚本所在的同一个文件夹 pdfpath = script_dir imgpath = script_dir # 或新建子目录,如 os.path.join(script_dir, 'output')
代码逐段精讲
动态获取路径,不写死盘符
base_dir = os.path.dirname(os.path.abspath(__file__))
这行代码会自动获取当前脚本所在的文件夹路径。好处是:你把脚本和pdf放在任意目录,它都能自动识别,完全不需要手动修改代码里的路径。
控制图片清晰度(dpi)
zoom_x = 1.33333333 zoom_y = 1.33333333
这个缩放系数决定了输出图片的分辨率。1.333 倍大约相当于 144 dpi(默认是 96 dpi),既清晰又不会文件太大。如果你需要超高清(比如印刷用),可以改成 2 或 3。
自动创建分类文件夹
minimgpath = os.path.join(imgpath, os.path.splitext(pdf_file)[0])
os.path.splitext(pdf_file)[0]去掉.pdf后缀,得到文件名。- 每个pdf的图片会保存在 以pdf文件名命名的子文件夹 里,防止图片混在一起。
重点:避坑指南
我在写这个脚本时,遇到了好几个报错,都是 pymupdf 新旧版本 api 不兼容导致的。下面我把这些坑全部列出来,帮你节省大量时间:
| 报错信息 | 产生原因 | 解决方案 |
|---|---|---|
'matrix' object has no attribute 'prerotate' | 旧版方法名是驼峰 prerotate,新版改为全小写 prerotate | 改为 .prerotate(rotate) |
'page' object has no attribute 'getpixmap' | 旧版方法名 getpixmap,新版改为下划线 get_pixmap | 改为 .get_pixmap() |
'pixmap' object has no attribute 'writepng' | 旧版用 writepng() 保存图片,新版统一为 save() | 用 hasattr 判断,优先用 writepng,否则用 save |
特别是第三个坑,我在代码中做了全版本兼容处理:
if hasattr(pix, 'writepng'):
pix.writepng(img_path)
else:
pix.save(img_path)这样一来,不管读者用的是老项目还是新环境,复制代码就能跑,完全不用担心版本报错!
总结
通过不到50行python代码,我们实现了一个全自动、全版本兼容的pdf批量转图片工具。它:
- 自动识别当前目录所有pdf
- 高清输出(可自定义dpi)
- 按pdf文件名自动分类保存
- 兼容pymupdf所有版本(无需操心报错)
办公自动化的魅力就在于此——把重复、枯燥的工作交给代码,把时间留给更有价值的事情。
以上就是python办公自动化之批量将pdf转换为图片文件的详细内容,更多关于python pdf转图片的资料请关注代码网其它相关文章!
发表评论