Laravel中使用DOMPdf设置字体,解决俄文/希腊文乱码问题
解决Laravel中dompdf生成PDF时希腊文/俄文乱码问题
1. 正确注册字体到dompdf
DejaVuSans支持多语言,但只放TTF文件不够,dompdf需要对应的字体定义文件才能识别:
- 把
DejaVuSans.ttf复制到storage/fonts目录(优先用storage,避免vendor更新丢失文件) - 运行命令生成字体定义:
这个命令会自动生成php artisan dompdf:font DejaVuSans.afm/.ufm格式的字体配置文件,并存入指定目录。
2. 修正CSS字体引用
dompdf对字体名称的大小写、空格敏感,调整样式写法:
* { font-family: DejaVu Sans, DejaVuSans, sans-serif; }
确保这段CSS放在Blade视图的<head>内的<style>标签里,也可以尝试直接内联到需要显示特殊字符的元素上测试。
3. 配置dompdf的字体路径
- 先发布dompdf配置文件(如果还没做):
php artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider" - 打开
config/dompdf.php,修改字体相关配置:'font_dir' => storage_path('fonts'), 'font_cache' => storage_path('fonts'),
4. 强制PDF使用指定字体与UTF-8编码
在生成PDF的代码里明确设置默认字体和编码:
$pdf = Pdf::loadView('myview', ['view1' => $view1, 'view2' => $view2]) ->setOptions([ 'defaultFont' => 'DejaVu Sans', 'isHtml5ParserEnabled' => true, 'isRemoteEnabled' => true ]); return $pdf->stream('myview.pdf');
同时在Blade视图的<head>开头加上编码声明:
<meta charset="UTF-8">
5. 排查小技巧
- 先在浏览器里打开Blade视图对应的HTML页面,确认希腊文/俄文正常显示,排除视图本身的编码问题。
- 如果全局样式不生效,尝试给单个元素加内联样式:
<p style="font-family: DejaVu Sans;">测试希腊文/俄文</p>,验证字体是否能被dompdf识别。
内容的提问来源于stack exchange,提问作者Daniel el khal
相关产品推荐
相关产品推荐

