我的知识记录

Python PDF转图片每页高清:PyMuPDF导出PNG教程

用Python把PDF每一页导出为高清PNG图片,通过调整DPI控制清晰度,支持批量导出整个文件夹,适合做预览图、缩略图、OCR预处理。

场景痛点

有时候需要把PDF每页转成图片:做网页预览、发给微信不方便打开PDF、给OCR做预处理、或者截取某一页当插图。手动用Acrobat另存为图片,一次只能导一个文件,几十页还要选格式。用Python的PyMuPDF直接把每页渲染成pixmap,按页码命名存成PNG,DPI拉到200就是高清效果。

用到的库

pip install pymupdf

完整代码

# -*- coding: utf-8 -*-
"""
用 PyMuPDF 把 PDF 每一页导出为高清 PNG 图片。
"""
import fitz  # PyMuPDF
from pathlib import Path


def pdf_to_images(pdf_path: str,
output_dir: str,
dpi: int = 200,
prefix: str = "page"):
"""
pdf_path: 输入 PDF 文件
output_dir: 图片输出目录
dpi: 分辨率,屏幕预览 96 够,打印/高清用 200~300
prefix: 输出文件名前缀,最终形如 page_001.png
"""
out = Path(output_dir)
out.mkdir(parents=True, exist_ok=True)

doc = fitz.open(pdf_path)
# 缩放矩阵:默认 72 DPI,目标 DPI / 72 就是缩放倍数
zoom = dpi / 72
mat = fitz.Matrix(zoom, zoom)

for index, page in enumerate(doc, start=1):
# get_pixmap 把页面渲染成像素图
pix = page.get_pixmap(matrix=mat, alpha=False)
out_file = out / f"{prefix}_{index:03d}.png"
pix.save(str(out_file))
print(f"已导出:{out_file}")

doc.close()


def batch_pdf_to_images(input_dir: str, output_root: str, dpi: int = 200):
"""批量处理文件夹下所有 PDF,每个 PDF 建一个子目录放图片。"""
src = Path(input_dir)
root = Path(output_root)
root.mkdir(parents=True, exist_ok=True)

for pdf_file in src.glob("*.pdf"):
sub_dir = root / pdf_file.stem
pdf_to_images(str(pdf_file), str(sub_dir), dpi=dpi, prefix=pdf_file.stem)


if __name__ == "__main__":
batch_pdf_to_images(
input_dir="pdfs",
output_root="images",
dpi=200,
)

代码讲解

  • page.get_pixmap(matrix=mat) 是PyMuPDF把页面渲染成位图的核心方法,返回一个Pixmap对象,直接save()就是PNG。
  • fitz.Matrix(zoom, zoom) 做缩放,PDF默认是72 DPI,想输出200 DPI就把zoom设成200/72≈2.78。DPI越高越清晰,但文件越大。
  • alpha=False 表示不保留透明通道,PDF转图片一般不需要透明,关掉能省体积。
  • 文件名用{prefix}_{index:03d}.png,三位数字补零,方便后续按顺序排序和合成PDF。
  • 批量模式下每个PDF建一个同名子目录,避免不同PDF的page_001.png互相覆盖。

运行结果

把PDF放进pdfs/目录,跑完后images/下会按每个PDF的文件名建子目录,里面是xxx_001.pngxxx_002.png……每页一张。用图片查看器打开,200 DPI下文字边缘锐利,放大不糊。

注意事项

  • 另一个常用库是pdf2image,底层依赖poppler(要单独装poppler-utils),PyMuPDF是纯Python wheel,开箱即用,优先选它。
  • DPI别盲目拉到600,一页A4在300 DPI下就是2480×3508像素,PNG能到几MB,批量导出会占满磁盘。屏幕看用150~200,打印才用300。
  • 扫描件PDF本身就是图片,导出后清晰度不会超过原扫描件的分辨率,别指望转图片能"变清晰"。
  • 想要JPG格式省体积,把保存后缀改成.jpg,并在get_pixmap里加colorspace=fitz.csRGB

Python PDF转图片每页高清:PyMuPDF导出PNG教程

标签:

更新时间:2026-09-14 21:35:21

上一篇:Python读取PDF指定页文字 单页提取方法

下一篇:Python PDF添加链接注释:点击文字跳转网页