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

