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

ReportLab如何实现Paragraph从左上角开始绘制而非默认左下角

ReportLab Paragraph 从指定坐标左上角渲染的调整方法

核心原因

ReportLab canvas 坐标系原点默认位于页面左下角,y 轴数值随位置升高而增大,Paragraph.drawOn() 方法接收的坐标参数默认对应段落渲染区域的左下角点,直接传入目标左上角坐标会出现渲染位置偏移。

调整方案

Paragraph.wrapOn() 方法会返回段落在给定可用宽高下的实际渲染尺寸(宽度、高度),调用 drawOn() 时将 y 坐标减去段落实际高度,即可让传入的坐标点对应段落的左上角位置。

修正后完整代码

import io
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4 
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, PageBreak
from reportlab.lib.enums import TA_JUSTIFY, TA_LEFT, TA_CENTER, TA_RIGHT

# 修复原代码TTFont注册缺失的右括号
pdfmetrics.registerFont(TTFont('Dejavu', 'DejaVuSansCondensed.ttf'))

packet_1 = io.BytesIO()
can = canvas.Canvas(packet_1, pagesize=A4)
styles = getSampleStyleSheet()
styleN = styles["BodyText"]

my_style = ParagraphStyle(
    name='My style',
    fontName='Dejavu',
    fontSize=12,
    alignment=TA_LEFT,
    borderWidth=1,
    borderColor='black'
)

p3 = Paragraph('abdc', my_style)
# 获取段落实际渲染的宽高
p_actual_width, p_actual_height = p3.wrapOn(can, 500, 100)
# 传入的(10, 300)为目标左上角坐标,y值减去段落实际高度实现左上角对齐
p3.drawOn(can, 10, 300 - p_actual_height)

# 后续保存canvas的逻辑按需补充
can.save()

额外说明:如果需要在段落上方预留边距,只需要在计算y坐标时额外减去预留的边距值即可,例如需要3px上边距则写为 300 - p_actual_height - 3。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:24:21