用 dompdf 导出的报价单,数字和英文正常,中文整段变成方框,服务器日志没有报错,文件大小也正常。日志里能对上时间点,这种反而好排。
dompdf 默认只带 DejaVu 这类拉丁字体,中文字形不在里面,找不到就画成方框。字体文件没有通过 Font::register 注册,CSS 里的 font-family 写得再对也匹配不上。这一点先确认清楚,后面就不用反复试。
$font = $dompdf->getFontMetrics()->registerFont(
['family' => 'notosans', 'style' => 'normal'],
'/path/NotoSansSC-Regular.ttf'
);
$dompdf->getOptions()->setDefaultFont('notosans');
「PDF 中文缺字」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
别只看报错的最后一行,往上看几行,真正的起因通常在上面。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
处理上按这个顺序:把支持中文的 ttf 放进 dompdf 的字体目录;用 registerFont 注册并生成对应的字体度量文件;CSS 里 font-family 写注册时的名字 重新导出后抽查中文段落。
结果对不对很好判断,重新导出的 PDF 里中文完整显示,标点不再变方框。
