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

使用Python指定坐标在PDF文件中绘制线条的实现方法咨询

实现方案汇总

方案1:直接使用PyFPDF内置API实现(你正在使用的库本身就支持该功能)

PyFPDF自带line()方法可直接通过坐标参数绘制直线,四个入参依次为起点x坐标、起点y坐标、终点x坐标、终点y坐标,坐标原点默认在页面左上角,单位可在初始化PDF实例时指定(默认单位为毫米)。
示例代码如下:

from fpdf import FPDF

# 初始化PDF,指定单位为毫米,页面尺寸为A4
pdf = FPDF(unit="mm", format="A4")
pdf.add_page()

# 绘制基础黑色细线条:起点(10, 10),终点(100, 10)
pdf.line(10, 10, 100, 10)

# 自定义线条样式后绘制红色粗线条
pdf.set_line_width(1) # 线条宽度设为1mm
pdf.set_draw_color(255, 0, 0) # 线条颜色设为RGB红色
pdf.line(10, 20, 100, 20)

pdf.output("line_test.pdf")

如果你的需求是在已有的PDF文件上叠加线条而非新建PDF,PyFPDF对现有文件的编辑支持较弱,可以用第二种方案实现。

方案2:编辑已有PDF文件绘制线条(基于PyPDF2 + ReportLab组合)

该方案可以直接读取现有PDF,在指定页面的对应坐标位置叠加线条后导出,示例代码如下:

from PyPDF2 import PdfReader, PdfWriter
from reportlab.pdfgen import canvas
from io import BytesIO

# 读取需要编辑的原有PDF
reader = PdfReader("original.pdf")
writer = PdfWriter()

# 以编辑第一页为例,可根据需求遍历所有页面
target_page = reader.pages[0]
# 获取原页面尺寸
page_width = float(target_page.mediabox[2])
page_height = float(target_page.mediabox[3])

# 创建临时画布绘制线条
packet = BytesIO()
can = canvas.Canvas(packet, pagesize=(page_width, page_height))
# 绘制蓝色粗线条:起点(50, 50),终点(300, 50),单位为点(1点≈0.3527mm)
can.setLineWidth(2)
can.setStrokeColorRGB(0, 0, 1)
can.line(50, 50, 300, 50)
can.save()

# 把绘制好的线条合并到原PDF页面
packet.seek(0)
draw_layer = PdfReader(packet)
target_page.merge_page(draw_layer.pages[0])
writer.add_page(target_page)

# 导出修改后的PDF文件
with open("edited_output.pdf", "wb") as f:
    writer.write(f)

注意:ReportLab的坐标原点默认在页面左下角,如果需要和常用的左上角坐标逻辑对齐,计算y坐标时用页面总高度 - 目标y坐标做转换即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:27:05