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

DOMPDF无法修改生成PDF字体及字符显示为???问题求助

解决laravel-dompdf默认字体不生效及字符显示???的问题

看来你在调整laravel-dompdf的字体时遇到了两个头疼的问题:字体设置始终不生效(一直是Helvetica),还有字符显示成???。我来一步步帮你解决:

一、先搞定字体不生效的核心问题

你直接修改vendor/barryvdh/laravel-dompdf/config/dompdf.php是不推荐的——因为vendor目录的文件在包更新时会被覆盖,你的修改根本留不住。正确的做法是先把配置文件发布到本地项目:

php artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider"

执行完这条命令,你的config目录下会生成dompdf.php,之后修改这个本地配置文件才是有效的。

接下来注意两个关键细节:

  1. 配置文件的键名格式:确保是'default_font' => 'courier'(下划线命名,不是驼峰的defaultFont),dompdf的原生配置用的是下划线格式,用错键名会导致设置不生效。
  2. 控制器动态设置的写法:如果在代码里动态配置选项,同样要使用下划线的键名,比如:
PDF::setOptions([
    'dpi' => 150,
    'default_font' => 'courier' // 这里是下划线,不是defaultFont
]);

最后别忘了清除dompdf的字体缓存——它会缓存已加载的字体,旧缓存可能导致新字体设置不生效。缓存目录一般在storage/app/dompdf/fonts,删掉这个目录下的所有文件,再重新生成PDF试试。

二、解决字符显示为???的问题

字符变成???大概率是因为你用的字体(比如默认的Helvetica、Courier)不支持你要显示的字符(比如中文、特殊符号)。解决方法是引入支持对应字符的字体:

  1. 把字体文件(比如支持中文的simhei.ttf、开源的NotoSansCJKsc.ttf)放到项目的public/fonts目录下。
  2. 在生成PDF时注册字体并设置为默认:
$pdf = PDF::loadView('your-pdf-view');

// 注册自定义字体
$pdf->getDomPDF()->getFontMetrics()->registerFont([
    'family' => 'simhei',
    'style' => 'normal',
    'weight' => 'normal',
    'src' => public_path('fonts/simhei.ttf'),
]);

// 设置为默认字体
$pdf->setOptions(['default_font' => 'simhei']);

return $pdf->download('output.pdf');

另外还要检查你的PDF视图里,有没有CSS强制指定了font-family: Helvetica——如果有,会覆盖默认字体设置,记得删掉或者改成你使用的字体。

内容的提问来源于stack exchange,提问作者Sergio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:38:14