如何使用pypdf将PDF页面调整为Letter尺寸?
用pypdf将PDF页面标准化缩放至Letter尺寸
完全可以实现,虽然pypdf的PaperSize枚举里没有Letter选项,但我们可以直接定义Letter尺寸的数值(8.5×11英寸,对应PDF用户单位612×792,1英寸=72用户单位),再通过页面变换完成缩放和标准化。
核心思路:
- 遍历PDF的每个页面,获取原始尺寸
- 根据Letter尺寸计算缩放比例,确保页面完整适配且居中
- 应用缩放和平移变换,将页面调整到Letter画布上
- 重置页面的mediabox为Letter尺寸
以下是完整实现代码:
from pypdf import PdfReader, PdfWriter from pypdf.generic import RectangleObject # 定义Letter尺寸的PDF用户单位值 LETTER_WIDTH = 612 LETTER_HEIGHT = 792 # 读取输入PDF reader = PdfReader("input.pdf") writer = PdfWriter() for page in reader.pages: # 获取页面原始宽高,处理旋转页面的宽高互换 page_width = page.mediabox.width page_height = page.mediabox.height if page.get('/Rotate') in [90, 270]: page_width, page_height = page_height, page_width # 计算缩放因子:取宽高缩放比例的最小值,避免内容超出Letter边界 scale_x = LETTER_WIDTH / page_width scale_y = LETTER_HEIGHT / page_height scale_factor = min(scale_x, scale_y) # 计算缩放后的尺寸和居中偏移量 new_width = page_width * scale_factor new_height = page_height * scale_factor offset_x = (LETTER_WIDTH - new_width) / 2 offset_y = (LETTER_HEIGHT - new_height) / 2 # 应用缩放+平移变换 page.add_transformation([scale_factor, 0, 0, scale_factor, offset_x, offset_y]) # 将页面的媒体框设置为Letter尺寸 page.mediabox = RectangleObject([0, 0, LETTER_WIDTH, LETTER_HEIGHT]) # 可选:重置页面旋转角度,统一为竖向 if page.get('/Rotate') is not None: page.Rotate = 0 writer.add_page(page) # 保存处理后的PDF with open("output_letter.pdf", "wb") as output_file: writer.write(output_file)
代码说明:
- 处理旋转页面:如果页面是90/270度旋转,先互换宽高再计算缩放比例,避免方向错误
- 居中适配:通过偏移量让缩放后的页面在Letter画布中居中显示
- 重置媒体框:确保输出页面的尺寸严格为Letter标准
内容的提问来源于stack exchange,提问作者ericOnline
相关产品推荐
相关产品推荐

