如何使用Python提取PDF文件中的打印缩放因子?
提取PDF打印适配缩放因子的Python方案
问题背景
需要程序化提取PDF打印时「打印尺寸与处理」下「适配」选项显示的缩放比例(例如显示24%则提取0.24)。尝试用PyPDF2通过页面尺寸与A4纸比例计算时结果错误,原因是未正确处理单位转换,且误用面积比而非边长比例。
错误原因解析
PyPDF2中mediabox.width/mediabox.height返回的单位是点(pt),1点=1/72英寸,1英寸≈2.54厘米。之前的代码直接用点的面积除以厘米的面积,单位不统一导致结果完全错误;另外「适配」是等比例缩放,应取宽、高缩放比例的最小值,而非面积比。
解决方案
方案1:通过页面尺寸与A4纸的等比例缩放计算
先将PDF页面的点单位转换为厘米,再分别计算宽、高相对于A4纸的比例,取较小值作为适配缩放因子:
from PyPDF2 import PdfReader A4_WIDTH_CM = 21.59 A4_HEIGHT_CM = 27.94 PT_TO_CM = 2.54 / 72 # 1pt = 1/72英寸,转换为厘米 with open('example.pdf', 'rb') as pdf_file: pdf_reader = PdfReader(pdf_file) page = pdf_reader.pages[0] media_box = page.mediabox # 转换为厘米 page_width_cm = media_box.width * PT_TO_CM page_height_cm = media_box.height * PT_TO_CM # 计算宽、高的缩放比例 scale_width = page_width_cm / A4_WIDTH_CM scale_height = page_height_cm / A4_HEIGHT_CM # 适配取最小比例(保证页面能完整打印在A4上) scale_factor = min(scale_width, scale_height) print(f"适配缩放因子:{scale_factor:.4f}")
方案2:读取PDF内置的打印缩放元数据
部分PDF会在元数据中存储预设的打印缩放参数,可通过PyMuPDF(fitz)直接读取相关字段:
import fitz with fitz.open('example.pdf') as doc: # 获取文档级打印参数 print_params = doc.metadata.get('PrintParams', {}) # 部分PDF会在ViewerPreferences中存储缩放 viewer_prefs = doc.metadata.get('ViewerPreferences', {}) scale_factor = None # 查找PrintParams中的缩放字段 if 'Scaling' in print_params: scale_factor = print_params['Scaling'] # 查找ViewerPreferences中的打印缩放 elif 'PrintScaling' in viewer_prefs: scaling_type = viewer_prefs['PrintScaling'] if isinstance(scaling_type, float): scale_factor = scaling_type if scale_factor: print(f"提取到的缩放因子:{scale_factor:.4f}") else: print("未找到内置缩放参数,将使用尺寸计算法")
注意:并非所有PDF都会存储打印缩放元数据,此时方案1是可靠的通用方法。
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

