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

如何用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中,直接通过样式调用:

  1. 用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")
  1. 注册并使用自定义字体:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 18:35:04