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

