在日常办公或数据处理中,批量将 PDF 页面转为图片是高频需求。本文将介绍基于 PyMuPDF(fitz) 的开源实现方案,它轻量、转换效率高且支持自定义保存路径,核心代码仅需 30 行左右即可完成。


一、核心工具选型:为什么选 PyMuPDF?

PyMuPDF 是一个基于 MuPDF 引擎的 Python 库,相比其他 PDF 处理工具(如 pdf2image),它有三大优势:

  1. 无需额外依赖:无需安装 Poppler 等第三方底层工具,pip 一键安装即可使用;
  2. 转换质量高:支持无损提取 PDF 页面,可自定义图片分辨率(dpi);
  3. 速度快:批量处理 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_pageend_page 参数,支持转换 PDF 的部分页面;
  • 批量重命名:按自定义规则命名图片(如“报告1_202405_page1.png”)。


该工具完全开源,核心依赖 PyMuPDF 也是 MIT 协议(可商用),适合个人或企业场景下的批量 PDF 转图片需求。

PS 地址

https://github.com/pymupdf/PyMuPDF