如何用ReportLab仅缩放字体宽度而保持高度不变?
解决方案:仅缩放Courier字体宽度,保持高度不变
你遇到的问题根源是直接修改fontSize会同时缩放字体的宽高,导致行高和边距偏离预期。要实现仅宽度缩放90%、高度不变的效果,有两种可靠的方法:
方法一:绘制时通过Canvas缩放控制(适合单段或少量文本)
保持字体大小和行高不变,在绘制段落前对Canvas进行X轴缩放,绘制后恢复状态,这样仅影响文本宽度,不改变高度和行间距:
from reportlab.platypus import Paragraph from reportlab.lib.styles import ParagraphStyle # 定义样式:使用原生Courier,保持原字体大小和行高 my_style = ParagraphStyle( name="OriginalHeightCourier", parent=my_parent, fontName="Courier", fontSize=font_size, # 不缩放高度,保持原尺寸 leading=font_size # 行高与原字体高度一致 ) # 创建段落对象 text_paragraph = Paragraph("需要显示的文本内容", my_style) # 绘制阶段处理缩放 canvas.saveState() # 保存当前画布状态 canvas.scale(0.9, 1.0) # X轴缩放90%,Y轴保持100% # 注意:wrap和draw的坐标需要反向调整,抵消缩放影响 # 假设原计划的绘制宽度是600,缩放后实际显示宽度为600,所以wrap宽度设为600/0.9 text_paragraph.wrapOn(canvas, 600 / 0.9, 720) # X坐标同样反向调整,确保位置与原位置一致 text_paragraph.drawOn(canvas, 72 / 0.9, 720) canvas.restoreState() # 恢复画布状态,不影响后续内容
方法二:注册自定义宽度的Courier字体(适合全局复用)
如果需要多处使用这种缩放后的字体,更高效的方式是用字体工具修改Courier的宽度,再注册到ReportLab中,直接通过样式调用:
- 用
fonttools修改字体宽度:
from fontTools.ttLib import TTFont # 加载系统中的Courier字体文件(路径根据系统调整,Windows可能是C:\Windows\Fonts\cour.ttf) font = TTFont("/Library/Fonts/Courier New.ttf") # 将所有字符宽度缩放到90% for glyph_name in font["hmtx"].metrics: width, lsb = font["hmtx"].metrics[glyph_name] font["hmtx"].metrics[glyph_name] = (int(width * 0.9), lsb) # 保存修改后的字体 font.save("courier_90width.ttf")
- 注册并使用自定义字体:
from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont from reportlab.lib.styles import ParagraphStyle # 注册修改后的字体 pdfmetrics.registerFont(TTFont("Courier90W", "courier_90width.ttf")) # 定义样式,直接使用自定义字体,保持原尺寸和行高 my_style = ParagraphStyle( name="Courier90Style", parent=my_parent, fontName="Courier90W", fontSize=font_size, leading=font_size )
这样用Courier90W字体生成的文本,宽度是原生Courier的90%,高度完全不变,行高和边距与原CourierCondensed效果一致。
内容的提问来源于stack exchange,提问作者Hagbard
相关产品推荐
相关产品推荐

