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.png、xxx_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。

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