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

Python实现从预设线条向下裁剪PDF(仅保留线条下方区域)

解决PDF从指定线条向下裁剪仅保留下方内容的问题

问题描述

我尝试从一条预设线条处裁剪PDF的特定区域,希望从该线条开始向下裁剪整个PDF,仅保留线条下方的内容。但当前代码虽能裁剪目标区域,却会包含指定线条上方的区域,需要修正为只保留线条下方区域。

原代码

# Open PDF file
with open('file.pdf', 'rb') as pdf_file:
    # Create object
    pdf_reader = PyPDF2.PdfReader(pdf_file)

    # Create object
    pdf_writer = PyPDF2.PdfWriter()

    # Line
    x1, y1 = (int(66 * 2.83465), int(204 * 2.83465))  # ponto esquerdo da linha
    x2, y2 = (int(143.7 * 2.83465), int(204 * 2.83465))  # ponto direito da linha
    y3 = int(y1 -  100 * 2.83465)  # altura do corte

    # All pages
    for page_num in range(len(pdf_reader.pages)):
        # Obtenha a página atual
        page = pdf_reader.pages[page_num]

        # Create a new page
        new_page = PyPDF2.PageObject.create_blank_page(
            None, page.mediabox.width, y3 - y1)

        # Define area
        new_page.mediabox.upper_left = (x1, y1 + y3)
        new_page.mediabox.upper_right = (x2, y1)

        # Add new page
        transformation = PyPDF2.Transformation().translate(0, -y1)
        new_page.add_transformation(transformation)
        new_page.merge_page(page)
        pdf_writer.add_page(new_page)

    # Save
    with open('cropped_file.pdf', 'wb') as new_pdf_file:
        pdf_writer.write(new_pdf_file)

问题分析

原代码的核心问题在于:

  • 空白页高度计算错误,y3 - y1得到负数,不符合页面高度的定义逻辑
  • Mediabox范围限定错误,仅截取了线条附近的窄区域,且误包含了线条上方内容
  • 平移变换的方向和数值偏差,导致原页面内容未正确对齐到目标裁剪区域

修正后的代码

# 打开PDF文件
with open('file.pdf', 'rb') as pdf_file:
    # 创建PDF读取对象
    pdf_reader = PyPDF2.PdfReader(pdf_file)
    # 创建PDF写入对象
    pdf_writer = PyPDF2.PdfWriter()

    # 预设线条的y坐标(PDF坐标系:左上角为原点,y值越大越靠上)
    line_y = int(204 * 2.83465)  # 线条位置即为裁剪的上边界

    # 遍历所有页面
    for page in pdf_reader.pages:
        page_width = page.mediabox.width
        # 裁剪区域高度:从线条位置到页面底部的距离
        crop_height = line_y

        # 创建匹配裁剪尺寸的空白页
        new_page = PyPDF2.PageObject.create_blank_page(None, page_width, crop_height)
        
        # 限定新页面的显示区域为线条下方的整个范围
        new_page.mediabox.upper_left = (0, line_y)
        new_page.mediabox.lower_right = (page_width, 0)

        # 平移原页面,让线条位置对齐到新页面顶部,仅保留下方内容
        transform = PyPDF2.Transformation().translate(0, - (page.mediabox.height - line_y))
        new_page.add_transformation(transform)
        new_page.merge_page(page)

        # 添加处理后的页面到写入队列
        pdf_writer.add_page(new_page)

    # 保存裁剪后的PDF
    with open('cropped_file.pdf', 'wb') as new_pdf_file:
        pdf_writer.write(new_pdf_file)

关键修改说明

  • 明确裁剪上边界为线条的line_y值,直接以该值作为裁剪区域的高度,确保容纳线条下方所有内容
  • 调整Mediabox范围,覆盖从页面左边缘到右边缘、从线条位置到页面底部的完整区域
  • 修正平移变换逻辑:通过计算原页面顶部到线条的距离,将原页面向下平移对应数值,让线条位置对齐新页面顶部,精准保留下方内容
  • 若需要限定横向裁剪范围,可修改Mediabox的左右边界参数

内容的提问来源于stack exchange,提问作者Rafael Nakamura

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:38:30