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

