如何用pypdf修正扫描PDF方向以准确定位下拉批注?
解决扫描PDF方向修正与坐标匹配问题
核心问题分析
你的扫描PDF通过/Rotate属性(270度)实现纵向显示,但MediaBox仍保留横向尺寸(792×612),直接修改Rotate或手动调整MediaBox会导致内容与页面容器不匹配,引发打印异常。正确做法是将页面内容实际旋转,同步调整页面尺寸,并重置视图旋转属性,让页面完全符合标准PDF的纵向坐标系统(左下角为(0,0),x轴向右,y轴向上)。
正确的pypdf处理代码
from pypdf import PdfReader, PdfWriter # 读取源PDF reader = PdfReader("你的扫描文档.pdf") writer = PdfWriter() # 获取目标页面(这里取第一页,按需修改索引) page = reader.pages[0] # 1. 实际旋转页面内容,抵消原270度视图旋转 # pypdf的rotate()方法为顺时针旋转,270度逆时针等效于90度顺时针 page.rotate(90) # 2. 交换MediaBox和CropBox的宽高,转为标准纵向尺寸(612×792) original_width, original_height = page.mediabox.width, page.mediabox.height page.mediabox = [0.0, 0.0, original_height, original_width] page.cropbox = page.mediabox # 3. 重置页面旋转属性为0,消除视图层面的旋转 page.Rotate = 0 # 添加处理后的页面到输出PDF writer.add_page(page) # 保存修正后的PDF with open("修正后的文档.pdf", "wb") as output_file: writer.write(output_file)
关键说明
- 仅修改
Rotate属性只会改变视图显示方向,不会调整内容的实际位置和页面尺寸,这是之前打印异常的核心原因。 - 实际旋转页面内容后,必须同步调整
MediaBox和CropBox的宽高,确保内容与页面容器完全适配。 - 处理完成后,页面坐标系统与标准PDF完全一致,你可以直接使用原始(x,y)坐标添加批注,无需额外转换。
内容的提问来源于stack exchange,提问作者Curtis Pro
相关产品推荐
相关产品推荐

