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

如何使用PyMuPDF获取PDF文档的页面边距

获取PDF页面边距(PyMuPDF实现)

PyMuPDF没有原生提供获取页面边距的API,但确实可以通过遍历页面所有可见元素、计算坐标极值的方式来实现你需要的边距计算(页面边缘到最近元素的距离)。

核心思路

PyMuPDF的页面坐标原点在左下角,page.rect(或裁剪框page.cropbox)可获取页面的实际边界范围。我们需要收集所有元素的坐标极值,再和页面边界做差值计算:

  • 左边距:所有元素的最小x坐标 - 页面左边界x值
  • 右边距:页面右边界x值 - 所有元素的最大x坐标
  • 下边距:所有元素的最小y坐标 - 页面下边界y值
  • 上边距:页面上边界y值 - 所有元素的最大y坐标

实现代码

import fitz

def calculate_page_margins(page):
    # 获取页面的实际显示边界(优先用裁剪框,无裁剪框则用原始页面边界)
    page_bound = page.cropbox if page.cropbox != page.rect else page.rect
    x_left, y_bottom, x_right, y_top = page_bound

    # 初始化极值:默认设为页面的对边,空页面时会触发后续处理
    min_element_x = x_right
    max_element_x = x_left
    min_element_y = y_top
    max_element_y = y_bottom

    # 遍历文本元素
    for word in page.get_text("words"):
        wx0, wy0, wx1, wy1 = word[:4]
        min_element_x = min(min_element_x, wx0)
        max_element_x = max(max_element_x, wx1)
        min_element_y = min(min_element_y, wy0)
        max_element_y = max(max_element_y, wy1)

    # 遍历图形元素(线条、矩形、图片等)
    for drawing in page.get_drawings():
        dr_x0, dr_y0, dr_x1, dr_y1 = drawing["rect"]
        min_element_x = min(min_element_x, dr_x0)
        max_element_x = max(max_element_x, dr_x1)
        min_element_y = min(min_element_y, dr_y0)
        max_element_y = max(max_element_y, dr_y1)

    # 遍历表单字段(如果存在)
    for widget in page.widgets():
        w_x0, w_y0, w_x1, w_y1 = widget.rect
        min_element_x = min(min_element_x, w_x0)
        max_element_x = max(max_element_x, w_x1)
        min_element_y = min(min_element_y, w_y0)
        max_element_y = max(max_element_y, w_y1)

    # 计算边距
    left_margin = min_element_x - x_left
    right_margin = x_right - max_element_x
    bottom_margin = min_element_y - y_bottom
    top_margin = y_top - max_element_y

    # 处理空页面:均分页面边距
    if min_element_x == x_right and max_element_x == x_left:
        half_width = (x_right - x_left) / 2
        half_height = (y_top - y_bottom) / 2
        left_margin = right_margin = half_width
        bottom_margin = top_margin = half_height

    return {
        "left": round(left_margin, 2),
        "right": round(right_margin, 2),
        "bottom": round(bottom_margin, 2),
        "top": round(top_margin, 2)
    }

# 使用示例
if __name__ == "__main__":
    doc = fitz.open("your_document.pdf")
    for idx in range(len(doc)):
        page = doc[idx]
        margins = calculate_page_margins(page)
        print(f"页面 {idx+1} 边距:")
        print(f"左: {margins['left']}, 右: {margins['right']}")
        print(f"下: {margins['bottom']}, 上: {margins['top']}\n")
    doc.close()

注意事项

  • 裁剪框优先级:如果PDF设置了裁剪框(cropbox),它才是页面的实际显示范围,因此优先用page.cropbox计算边距。
  • 元素覆盖:代码覆盖了文本、图形、表单字段三类常见元素,若需处理注释等其他元素,可通过page.annots()获取并提取坐标。
  • 精度控制:代码用round()保留两位小数,可根据需求调整精度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 20:05:30