对账单导出 PDF,中文标题和地址全变成空心方框,数字和英文正常。服务器是干净的 Debian,/usr/share/fonts 下只有 DejaVu,日志里没有任何报错。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
pdfmetrics.registerFont(TTFont("CN", "fonts/SourceHanSansCN-Regular.ttf"))
style = getSampleStyleSheet()["Normal"].clone("cn", fontName="CN")

ReportLab 内置的 Helvetica 只覆盖拉丁字符,遇到中文直接画成 notdef 方框。没有注册 TTF 时,样式里写的字体名会静默回退,不会抛异常。开发机装了中文字体,所以本地看不出问题。这一点先确认清楚,后面就不用反复试。

「ReportLab 中文字体」这类改动最怕改一半,回滚脚本先准备好,再动生产。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

具体做法是,把中文字体文件随应用一起打包 不要依赖系统字体;用 pdfmetrics 注册 TTFont 并在样式中引用注册名;表格和段落两处样式都要改 漏一处还是方框;部署到干净容器里导出一次 确认没有回退。

改完照着核一遍,容器里导出的 PDF 中文标题和地址都正常显示,用 pdffonts 查看嵌入字体列表里有 CN。

作者 9823189