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

如何用Python图像处理技术测量PDF文档的边距?

测量PDF页面四边边距的Python实现方法

要获取PDF页面的四边边距尺寸,核心思路是对比页面的媒体框(MediaBox,即整个页面的物理尺寸)和内容边界框(所有可见内容的最小包围框),两者的差值就是边距。以下是基于PyMuPDF(fitz)库的具体实现方案:

步骤1:安装依赖库

PyMuPDF是处理PDF的高效Python库,支持提取页面元素坐标,执行以下命令安装:

pip install pymupdf

步骤2:核心代码实现

仅提取文字内容的边距计算

如果PDF内容以文字为主,可使用以下代码:

import fitz  # PyMuPDF

def calculate_pdf_margins(pdf_path):
    doc = fitz.open(pdf_path)
    page_margins_list = []
    
    for page_idx in range(len(doc)):
        page = doc[page_idx]
        # 获取页面媒体框(整个页面的尺寸,单位:pt,1pt=1/72英寸)
        media_rect = page.rect
        # 提取所有文字元素的坐标
        text_items = page.get_text("words")
        
        if not text_items:
            # 页面无内容,边距为媒体框到边缘的距离(通常x0、y0为0)
            margins = {
                "left": media_rect.x0,
                "top": media_rect.y0,
                "right": media_rect.width - media_rect.x1,
                "bottom": media_rect.height - media_rect.y1
            }
            page_margins_list.append((page_idx + 1, margins))
            continue
        
        # 计算所有文字的最小/最大坐标,得到内容边界框
        min_x = min(item[0] for item in text_items)
        min_y = min(item[1] for item in text_items)
        max_x = max(item[2] for item in text_items)
        max_y = max(item[3] for item in text_items)
        
        # 计算四边边距
        margins = {
            "left": round(min_x - media_rect.x0, 2),
            "top": round(min_y - media_rect.y0, 2),
            "right": round(media_rect.x1 - max_x, 2),
            "bottom": round(media_rect.y1 - max_y, 2)
        }
        page_margins_list.append((page_idx + 1, margins))
    
    doc.close()
    return page_margins_list

# 使用示例
if __name__ == "__main__":
    margins_result = calculate_pdf_margins("your_document.pdf")
    for page_num, margins in margins_result:
        print(f"第{page_num}页边距:")
        print(f"左: {margins['left']}pt | 上: {margins['top']}pt | 右: {margins['right']}pt | 下: {margins['bottom']}pt")

包含图片/图形内容的边距计算

如果PDF包含图片、矢量图形等非文字元素,需要结合图形坐标计算内容边界框,修改后的代码如下:

import fitz  # PyMuPDF

def calculate_pdf_margins_with_graphics(pdf_path):
    doc = fitz.open(pdf_path)
    page_margins_list = []
    
    for page_idx in range(len(doc)):
        page = doc[page_idx]
        media_rect = page.rect
        text_items = page.get_text("words")
        drawings = page.get_drawings()
        
        # 初始化内容边界坐标为媒体框极值
        min_x, min_y = media_rect.x1, media_rect.y1
        max_x, max_y = media_rect.x0, media_rect.y0
        
        # 更新文字元素的边界坐标
        if text_items:
            min_x = min(min_x, min(item[0] for item in text_items))
            min_y = min(min_y, min(item[1] for item in text_items))
            max_x = max(max_x, max(item[2] for item in text_items))
            max_y = max(max_y, max(item[3] for item in text_items))
        
        # 更新图形元素的边界坐标
        if drawings:
            for draw in drawings:
                for item in draw["items"]:
                    if item[0] == "rect":
                        rect = item[1]
                        min_x = min(min_x, rect.x0)
                        min_y = min(min_y, rect.y0)
                        max_x = max(max_x, rect.x1)
                        max_y = max(max_y, rect.y1)
                    elif item[0] == "path":
                        # 遍历路径所有坐标点
                        for (x, y) in item[1]:
                            min_x = min(min_x, x)
                            min_y = min(min_y, y)
                            max_x = max(max_x, x)
                            max_y = max(max_y, y)
        
        # 计算边距
        margins = {
            "left": round(min_x - media_rect.x0, 2),
            "top": round(min_y - media_rect.y0, 2),
            "right": round(media_rect.x1 - max_x, 2),
            "bottom": round(media_rect.y1 - max_y, 2)
        }
        page_margins_list.append((page_idx + 1, margins))
    
    doc.close()
    return page_margins_list

补充说明

  • 单位说明:PDF中的坐标单位为点(pt),1pt等于1/72英寸,如需转换为厘米可乘以0.035278。
  • pdfcrop的局限性:pdfcrop仅能自动裁剪空白区域,但不会输出原始边距的具体数值,上述方法可直接计算原始页面的四边边距,无需修改原PDF文件。

内容的提问来源于stack exchange,提问作者Naveen Hedalla Arachchi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 01:03:23