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

如何用PyMuPDF将PDF转图片并保留原文档尺寸?

解决方案

问题出在默认get_pixmap()采用72DPI基础分辨率,导致生成的图片像素数仅对应72DPI下的物理尺寸。要让图片与原PDF物理打印尺寸完全一致,需根据目标分辨率计算正确的缩放矩阵,并确保保存时保留DPI元数据。

修改后的代码如下:

import os
import fitz

def split_pdf_mu(src):
    doc = fitz.open(src)
    file_name = os.path.basename(src)
    dest = os.path.expanduser("~") + '/tmp/splitted/'
    os.makedirs(dest, exist_ok=True)  # 确保输出目录存在
    split_paths = []
    
    # 目标DPI,可按需调整(打印常用300DPI,若匹配原PDF分辨率可自行修改)
    target_dpi = 300
    zoom_factor = target_dpi / 72  # 72是PyMuPDF默认的基础DPI
    
    for page_index, page in enumerate(doc):
        # 创建对应缩放比例的矩阵
        mat = fitz.Matrix(zoom_factor, zoom_factor)
        # 生成图片,关闭透明通道(无透明内容时可减少体积)
        pix = page.get_pixmap(matrix=mat, alpha=False)
        
        dest_path = os.path.join(dest, f'{file_name}_page{page_index}.png')
        # 保存时写入DPI元数据,确保系统识别正确物理尺寸
        pix.pil_save(dest_path, format="PNG", optimize=False, dpi=(target_dpi, target_dpi))
        split_paths.append(dest_path)
    
    doc.close()  # 关闭文档释放资源
    return split_paths

关键说明

  • 缩放逻辑:PDF页面尺寸以「点」为单位(1点=1/72英寸),用目标DPI/72得到每个点对应的像素数,生成的图片打印时物理尺寸与原PDF完全匹配。
  • DPI元数据:通过pil_save的dpi参数写入分辨率信息,避免图片查看或打印时尺寸偏差。
  • 像素尺寸匹配:若要让图片像素数和原PDF的点数量完全一致(即72DPI下的像素数),直接使用fitz.Matrix(1,1)即可,此时A4页面会生成595×842像素的图片,物理尺寸与原PDF一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 00:44:54