如何在ReportLab中获取段落及绘制文本的边界框
用ReportLab获取段落文本的边界框
我正在用ReportLab生成带布局标注的文档,格式示例如下:
文档1:(x1,y1,x2,y2) 标题、(x1,y1,x2,y2) 图表、(x1,y1,x2,y2) 文本、(x1,y1,x2,y2) 表格等。
要实现这个需求,我需要获取绘制文本的屏幕边界框,但目前卡在获取段落整体宽高的步骤上——已知内容起始位置,只需要算出宽高就能得到完整的(x1,y1,x2,y2)边界框。
我的示例代码如下:
styleSheet = getSampleStyleSheet() style = styleSheet['BodyText'] text = 'text example' P=Paragraph(text, style) P.drawOn(canv,0,aH) w, h = #the width and height of the whole paragraph (0, aH, 0+w, aH-h)
解决方法
ReportLab的Paragraph对象自带wrap()方法,专门用来计算段落在指定空间内的实际宽高。你只需要在调用drawOn()之前先调用wrap(),传入可用的宽度(比如画布的宽度)和一个足够大的高度值,就能得到需要的w和h。
修改后的代码:
styleSheet = getSampleStyleSheet() style = styleSheet['BodyText'] text = 'text example' P = Paragraph(text, style) # 调用wrap计算宽高,第一个参数是可用宽度,第二个参数设足够大的数值确保容纳段落 w, h = P.wrap(canv._pagesize[0], 10000) P.drawOn(canv, 0, aH) # 此时段落的边界框就是(0, aH, w, aH - h)
补充说明:wrap()方法会根据段落内容和样式自动计算尺寸。如果传入的可用宽度足够容纳整段文本,返回的w就是文本的实际宽度;如果宽度不够,段落会自动换行,返回的w就是你传入的可用宽度,h则是换行后的总高度。
内容的提问来源于stack exchange,提问作者Mohamed Nabil
相关产品推荐
相关产品推荐

