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,之后修改这个本地配置文件才是有效的。
接下来注意两个关键细节:
- 配置文件的键名格式:确保是
'default_font' => 'courier'(下划线命名,不是驼峰的defaultFont),dompdf的原生配置用的是下划线格式,用错键名会导致设置不生效。 - 控制器动态设置的写法:如果在代码里动态配置选项,同样要使用下划线的键名,比如:
PDF::setOptions([ 'dpi' => 150, 'default_font' => 'courier' // 这里是下划线,不是defaultFont ]);
最后别忘了清除dompdf的字体缓存——它会缓存已加载的字体,旧缓存可能导致新字体设置不生效。缓存目录一般在storage/app/dompdf/fonts,删掉这个目录下的所有文件,再重新生成PDF试试。
二、解决字符显示为???的问题
字符变成???大概率是因为你用的字体(比如默认的Helvetica、Courier)不支持你要显示的字符(比如中文、特殊符号)。解决方法是引入支持对应字符的字体:
- 把字体文件(比如支持中文的
simhei.ttf、开源的NotoSansCJKsc.ttf)放到项目的public/fonts目录下。 - 在生成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
相关产品推荐
相关产品推荐

