PyMuPDF 1.24中page.rect与实际页面尺寸不符问题咨询
问题:PyMuPDF中page.rect与实际页面尺寸不匹配
我有一份由Windows默认图片查看器打印图片生成的PDF文档,尝试用以下代码沿页面边框绘制矩形:
from fitz import Document doc = fitz.Document('pixelated-image.pdf', filetype="pdf") page.draw_rect(page.rect, color=(0, 0, 1), width=2) doc.save('pixelated-image-with-bounded-page.pdf') doc.close()
但生成的文件里,绘制的矩形和实际页面边框不匹配。测试发现:
- 实际页面内容的尺寸范围约为
Rect(0, -279.95, 793.2, 841.4) page.rect返回的尺寸是Rect(0.0, 0.0, 595.2757568359375, 841.8900146484375)
请问为何会出现这种不匹配?是否需要进行尺寸转换?
解答
这种差异的核心原因是PDF页面的标准媒体框与实际内容的布局逻辑不匹配,具体细节如下:
page.rect的定义
page.rect返回的是PDF页面的MediaBox(媒体框),这是PDF标准中定义的页面基础尺寸,默认对应A4纸的点单位尺寸(595.276×841.89pt,等同于210×297mm),这就是你看到默认返回值的来源。Windows打印PDF的特殊结构
Windows默认图片查看器生成的PDF,会将图片内容以偏移+缩放的方式放置在MediaBox内:
- 当图片宽高比例与MediaBox(A4)不一致时,为了完整显示图片,PDF会通过内容流的平移、缩放操作,将图片绘制到超出MediaBox的区域,这就导致实际内容的范围和MediaBox不重合。
- 正确获取实际内容范围的方法
要得到页面实际内容的边界,需要计算内容的包围盒(Bounding Box),而非直接使用MediaBox。可以用以下代码实现:
from fitz import Document doc = fitz.Document('pixelated-image.pdf') page = doc[0] # 获取页面所有内容的真实包围盒 content_rect = page.get_bbox() # 绘制实际内容的边框 page.draw_rect(content_rect, color=(0, 0, 1), width=2) doc.save('pixelated-image-with-correct-bounds.pdf') doc.close()
- 补充:单位说明
PDF中的尺寸单位是点(pt),1pt=1/72英寸,若需转换为毫米可使用公式:毫米 = 点 × 25.4 / 72。但本次问题的核心并非单位转换,而是内容偏移导致的范围差异。
内容的提问来源于stack exchange,提问作者Leto Atreides
相关产品推荐
相关产品推荐

