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

