如何使用Python按边界框正确裁剪PDF?
如何使用Python按边界框正确裁剪PDF?
我之前折腾PDF裁剪的时候也踩过这个坑——只靠提取文本块来确定裁剪范围,很容易漏掉图片、矢量图形这些可见内容,导致裁剪出来的PDF要么没裁到位,要么把重要元素给切没了。
给你完善一下代码,能准确识别页面上所有可见元素的边界,然后精准裁剪:
import fitz # PyMuPDF def crop_pdf_to_visible_content(input_pdf, output_pdf): # 打开输入PDF文档 doc = fitz.open(input_pdf) for page in doc: # 获取页面上所有类型的元素块:文本、图像、图形 all_blocks = page.get_text("dict")["blocks"] if not all_blocks: # 如果页面没有任何可见元素,保留原页面尺寸 continue # 收集所有元素的边界框(bbox格式:(x0, y0, x1, y1),x从左到右,y从下到上) all_bboxes = [] for block in all_blocks: # 不管是文本、图像还是图形块,都包含bbox属性 if "bbox" in block: all_bboxes.append(block["bbox"]) # 计算所有边界框的最小包围盒:找到最左、最下、最右、最上的坐标 x0s = [bbox[0] for bbox in all_bboxes] y0s = [bbox[1] for bbox in all_bboxes] x1s = [bbox[2] for bbox in all_bboxes] y1s = [bbox[3] for bbox in all_bboxes] # 最终的裁剪边界 crop_x0 = min(x0s) crop_y0 = min(y0s) crop_x1 = max(x1s) crop_y1 = max(y1s) # 给裁剪边界留一点余量(可选,避免元素贴边被裁掉,数值可以自己调) margin = 2 # 单位是PDF的点(1点≈0.35mm) crop_x0 = max(crop_x0 - margin, 0) crop_y0 = max(crop_y0 - margin, 0) crop_x1 = min(crop_x1 + margin, page.rect.width) crop_y1 = min(crop_y1 + margin, page.rect.height) # 设置页面的裁剪框 page.set_cropbox(fitz.Rect(crop_x0, crop_y0, crop_x1, crop_y1)) # 保存裁剪后的PDF doc.save(output_pdf) doc.close() # 调用示例 # crop_pdf_to_visible_content("input.pdf", "output_cropped.pdf")
这里还有几个实用的小细节要提醒你:
- 为啥要取所有块?因为
page.get_text("dict")返回的blocks包含了文本(type=0)、图像(type=1)、图形(type=2)三种可见元素,只拿文本的话肯定会漏内容。 - 加余量是个小技巧:很多PDF的元素会紧贴着实际内容边缘,直接裁剪容易把文字的笔画或者图片的边缘切掉,加个2点的余量刚好能避免这个问题,你可以根据自己的需求调整数值。
- 处理空页面:如果某个页面完全没有可见元素,代码会跳过裁剪,保留原页面的大小,避免出现空白的极小页面。
你可以把自己的输入输出路径填进去试试,这个方法比只靠文本块精准多了~
内容来源于stack exchange
相关产品推荐
相关产品推荐

