如何使用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
相关产品推荐
相关产品推荐

