You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PyMuPDF将PDF转为原文档尺寸、300DPI的图像

用PyMuPDF实现300DPI、保留原尺寸的PDF转TIFF方案

完全可以实现你的需求,核心是通过缩放系数匹配DPI要求,同时不修改原始文档的渲染比例即可,具体操作如下:

核心原理

PDF默认的渲染基准DPI为72,要输出300DPI的图像,只需要将渲染缩放系数设为 300/72 ≈ 4.1667 即可,该系数会按比例放大渲染像素数,同时完全保留原PDF页面的长宽比和物理尺寸,不会出现拉伸、变形问题。

完整可运行代码

首先安装依赖:

pip install pymupdf pillow

转换代码示例:

import fitz  # PyMuPDF的导入名
import io
from PIL import Image

# 自定义配置项
INPUT_PDF = "example.pdf"      # 替换为你的输入PDF路径
OUTPUT_TIFF = "output.tiff"    # 替换为你的输出TIFF路径
TARGET_DPI = 300

# 计算渲染缩放矩阵
zoom_factor = TARGET_DPI / 72
render_matrix = fitz.Matrix(zoom_factor, zoom_factor)

pdf_doc = fitz.open(INPUT_PDF)
tiff_pages = []

for page in pdf_doc:
    # 按原始文档参数渲染页面,不做裁剪、比例调整
    pixmap = page.get_pixmap(matrix=render_matrix, alpha=False)
    # 转为PIL图像方便写入DPI元数据
    img = Image.open(io.BytesIO(pixmap.tobytes("png")))
    tiff_pages.append(img)

# 保存为多页TIFF,写入300DPI文件头信息
if tiff_pages:
    tiff_pages[0].save(
        OUTPUT_TIFF,
        save_all=True,
        append_images=tiff_pages[1:],
        dpi=(TARGET_DPI, TARGET_DPI),
        compression="tiff_deflate"  # 无损压缩,可按需调整为其他压缩格式
    )

pdf_doc.close()

关键参数说明

  • fitz.Matrix(zoom_factor, zoom_factor):XY轴使用相同缩放系数,严格保留原PDF页面长宽比例,输出物理尺寸与原文档完全一致
  • page.get_pixmap() 无额外裁剪、拉伸参数,完全按照PDF原始内容渲染,符合你要求的「按文档原参数渲染」规则
  • 保存时显式传入dpi=(300,300),会将DPI信息写入TIFF文件头,其他图像处理工具读取时可识别到300DPI的设置

常见调整项

  • 如果PDF包含透明层,将alpha=False改为alpha=True即可保留透明通道
  • 不需要多页TIFF的话,可在循环内直接单独保存单页图像,无需拼接为列表
  • 不需要压缩的话可删除compression参数,或替换为tiff_lzw等其他压缩格式

内容的提问来源于stack exchange,提问作者adan11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 21:09:03