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

如何用脚本彻底删除PDF指定区域外内容?PyMuPDF转SVG残留问题

彻底删除PDF指定区域外内容的PyMuPDF解决方案

用PyMuPDF设置裁剪框只是视觉隐藏内容,PDF底层的图形元素并未被删除,转SVG时会被完整导出。要彻底清除区域外内容,需要遍历页面的所有可编辑元素,判断并移除目标区域外的部分。

以下是可直接运行的脚本方案:

import fitz  # PyMuPDF

def crop_pdf_permanently(input_path, output_path, crop_rect):
    # 打开原PDF
    doc = fitz.open(input_path)
    # 遍历每一页
    for page in doc:
        # --------------------------
        # 处理路径类图形(线条、形状等)
        # --------------------------
        paths = page.get_drawings()
        page.clean_contents()  # 清空原有内容,后续重新添加保留的元素
        for path in paths:
            # 检查路径的包围盒是否与裁剪区域有交集
            path_rect = fitz.Rect(path["rect"])
            if crop_rect.intersects(path_rect):
                # 裁剪路径到目标区域
                clipped_path = fitz.Path(path["items"]).clip(crop_rect)
                if not clipped_path.is_empty:
                    page.draw_path(clipped_path, color=path["color"], fill=path["fill"], width=path["width"])
        
        # --------------------------
        # 处理文本块
        # --------------------------
        text_blocks = page.get_text("blocks")
        for block in text_blocks:
            block_rect = fitz.Rect(block[:4])
            # 仅保留完全在裁剪区域内的文本块(若需要部分保留可调整判断逻辑)
            if crop_rect.contains(block_rect):
                page.insert_text(block_rect.tl, block[4], fontsize=block[5], color=block[6])
        
        # --------------------------
        # 处理图像
        # --------------------------
        images = page.get_images(full=True)
        for img in images:
            xref = img[0]
            img_rect = page.get_image_rects(xref)[0]
            if crop_rect.intersects(img_rect):
                # 裁剪图像到目标区域
                pix = fitz.Pixmap(doc, xref)
                clipped_pix = pix.crop(crop_rect & img_rect)
                # 替换原有图像
                page.insert_image(crop_rect & img_rect, pixmap=clipped_pix)
            else:
                # 删除区域外的图像
                page.delete_image(xref)
        
        # 最后设置裁剪框(可选,确保视觉上的一致性)
        page.set_cropbox(crop_rect)
    
    # 保存处理后的PDF
    doc.save(output_path)
    doc.close()

# 示例用法
if __name__ == "__main__":
    # 定义裁剪区域:x0, y0, x1, y1(根据实际需求调整)
    target_crop = fitz.Rect(50, 50, 550, 750)
    crop_pdf_permanently("input.pdf", "output_cropped.pdf", target_crop)

关键说明:

  • page.clean_contents() 清空页面原有内容,避免保留未处理的元素
  • 路径元素通过Path.clip()裁剪到目标区域,仅保留重叠部分
  • 文本块默认保留完全在区域内的内容,若需要保留部分可见的文本,可调整判断逻辑为crop_rect.intersects(block_rect)后提取可见文本片段
  • 图像通过Pixmap.crop()裁剪后重新插入,完全在区域外的直接删除

处理后的PDF转SVG时,区域外的元素会被彻底移除,导入Blender等软件后不会出现多余的边角线条。

内容的提问来源于stack exchange,提问作者Xora-dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 04:48:13