如何使用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
相关产品推荐
相关产品推荐

