在日常办公或数据处理中,批量将 PDF 页面转为图片是高频需求。本文将介绍基于 PyMuPDF(fitz) 的开源实现方案,它轻量、转换效率高且支持自定义保存路径,核心代码仅需 30 行左右即可完成。
一、核心工具选型:为什么选 PyMuPDF?
PyMuPDF 是一个基于 MuPDF 引擎的 Python 库,相比其他 PDF 处理工具(如 pdf2image),它有三大优势:
- 无需额外依赖:无需安装 Poppler 等第三方底层工具,pip 一键安装即可使用;
- 转换质量高:支持无损提取 PDF 页面,可自定义图片分辨率(dpi);
- 速度快:批量处理 100 页 PDF 仅需数秒,远超同类库。
其核心功能是通过 fitz.open()
读取 PDF,再通过页面对象的 get_pixmap()
生成图片,最后保存到指定路径。
二、完整工具源码实现
1. 环境准备:安装依赖
首先通过 pip 安装 PyMuPDF,命令如下:
# 注意库名是 pymupdf,代码中导入时用 fitz
pip install pymupdf
2. 完整工具代码
以下代码支持 批量处理多份 PDF、自定义图片格式(PNG/JPG)、指定保存路径,且会自动为每个 PDF 创建独立文件夹避免文件混乱:
import fitz # PyMuPDF 的核心模块
import os
from pathlib import Path # 用于路径处理,更简洁
def batch_pdf_to_images(
pdf_folder: str, # 存放待转换 PDF 的文件夹路径
save_root: str, # 图片保存的根路径
image_format: str = "png", # 图片格式,支持 png/jpg
dpi: int = 300 # 图片分辨率,300 dpi 适合大多数场景
) -> None:
"""
批量将文件夹中的所有 PDF 转换为图片,并保存到指定路径
"""
# 1. 校验输入参数:确保 PDF 文件夹存在,创建保存根路径
pdf_folder = Path(pdf_folder).absolute() # 转为绝对路径,避免歧义
save_root = Path(save_root).absolute()
if not pdf_folder.exists():
raise FileNotFoundError(f"PDF 文件夹不存在:{pdf_folder}")
save_root.mkdir(parents=True, exist_ok=True) # 不存在则创建,parents=True 支持多级路径
# 2. 遍历 PDF 文件夹中的所有 .pdf 文件
pdf_files = list(pdf_folder.glob("*.pdf")) # 仅筛选 .pdf 后缀的文件
if not pdf_files:
print("未在文件夹中找到 PDF 文件")
return
# 3. 逐个 PDF 转换为图片
for pdf_path in pdf_files:
pdf_name = pdf_path.stem # 获取 PDF 文件名(不含后缀)
# 为当前 PDF 创建独立的保存文件夹(避免不同 PDF 的图片混在一起)
pdf_save_dir = save_root / pdf_name
pdf_save_dir.mkdir(exist_ok=True)
try:
# 打开 PDF 文件
with fitz.open(pdf_path) as pdf_doc:
total_pages = len(pdf_doc) # 获取 PDF 总页数
print(f"开始处理:{pdf_name}.pdf(共 {total_pages} 页)")
# 遍历每一页,转换为图片
for page_num in range(total_pages):
page = pdf_doc[page_num] # 获取第 page_num 页(从 0 开始)
# 设置图片分辨率:matrix 是缩放因子,dpi/72 是行业通用换算(72 是 PDF 默认 dpi)
matrix = fitz.Matrix(dpi / 72, dpi / 72)
# 生成图片对象(pixmap)
pix = page.get_pixmap(matrix=matrix)
# 定义图片保存路径:例如 "save_root/PDF名称/第1页.png"
image_save_path = pdf_save_dir / f"第{page_num + 1}页.{image_format.lower()}"
# 保存图片
pix.save(image_save_path)
print(f"处理完成:{pdf_name}.pdf → 图片已保存至 {pdf_save_dir}\n")
except Exception as e:
print(f"处理 {pdf_name}.pdf 时出错:{str(e)}\n")
# ------------------- 工具调用示例 -------------------
if __name__ == "__main__":
# 请根据你的实际路径修改以下参数
INPUT_PDF_FOLDER = r"C:\Users\XXX\Desktop\待转换PDF" # 待处理 PDF 所在文件夹
OUTPUT_IMAGE_ROOT = r"C:\Users\XXX\Desktop\PDF转图片结果" # 图片保存根路径
IMAGE_FORMAT = "png" # 可选 "png" 或 "jpg"
IMAGE_DPI = 300 # 分辨率,如需更高质量可设为 600
# 调用批量转换函数
batch_pdf_to_images(
pdf_folder=INPUT_PDF_FOLDER,
save_root=OUTPUT_IMAGE_ROOT,
image_format=IMAGE_FORMAT,
dpi=IMAGE_DPI
)
三、工具使用说明
1. 参数修改
使用前只需修改 if __name__ == "__main__":
下的 4 个参数:
INPUT_PDF_FOLDER
:存放所有待转换 PDF 的文件夹路径(例如r"C:\PDFs"
);OUTPUT_IMAGE_ROOT
:图片保存的根路径(例如r"C:\PDF_Images"
);IMAGE_FORMAT
:选择图片格式,png
支持透明背景,jpg
体积更小;IMAGE_DPI
:分辨率,300 dpi 适合打印,150 dpi 适合屏幕浏览。
2. 运行效果
假设 INPUT_PDF_FOLDER
中有 报告1.pdf
(3 页)和 数据2.pdf
(5 页),运行后:
- 会在
OUTPUT_IMAGE_ROOT
下生成两个文件夹:报告1
和数据2
; 报告1
文件夹中会有第1页.png
、第2页.png
、第3页.png
;- 控制台会输出每一步的处理进度,出错时会提示具体错误信息。
四、功能扩展建议(可选)
如果需要更灵活的功能,可以基于上述代码扩展:
- 添加图片压缩:使用
PIL
库对生成的图片进行压缩,减少体积; - 指定页面范围:增加
start_page
和end_page
参数,支持转换 PDF 的部分页面; - 批量重命名:按自定义规则命名图片(如“报告1_202405_page1.png”)。
该工具完全开源,核心依赖 PyMuPDF 也是 MIT 协议(可商用),适合个人或企业场景下的批量 PDF 转图片需求。