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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 22:26:12