You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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页面的标准媒体框与实际内容的布局逻辑不匹配,具体细节如下:

  1. page.rect的定义
    page.rect 返回的是PDF页面的MediaBox(媒体框),这是PDF标准中定义的页面基础尺寸,默认对应A4纸的点单位尺寸(595.276×841.89pt,等同于210×297mm),这就是你看到默认返回值的来源。

  2. Windows打印PDF的特殊结构
    Windows默认图片查看器生成的PDF,会将图片内容以偏移+缩放的方式放置在MediaBox内:

  • 当图片宽高比例与MediaBox(A4)不一致时,为了完整显示图片,PDF会通过内容流的平移、缩放操作,将图片绘制到超出MediaBox的区域,这就导致实际内容的范围和MediaBox不重合。
  1. 正确获取实际内容范围的方法
    要得到页面实际内容的边界,需要计算内容的包围盒(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()
  1. 补充:单位说明
    PDF中的尺寸单位是点(pt),1pt=1/72英寸,若需转换为毫米可使用公式:毫米 = 点 × 25.4 / 72。但本次问题的核心并非单位转换,而是内容偏移导致的范围差异。

内容的提问来源于stack exchange,提问作者Leto Atreides

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 17:02:51