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

Laravel + dompdf生成PDF时UTF-8字符显示为问号的问题求助

解决Laravel + dompdf生成PDF时UTF-8字符显示为问号的问题

以下是针对问题的具体排查和修复方案:

1. 确保HTML文档明确声明UTF-8编码

即使浏览器中显示正常,dompdf仍需要明确的编码声明来正确解析字符。在HTML头部添加:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <!-- 其他头部内容 -->
</head>
<body>
    <!-- 包含特殊字符的内容 -->
</body>
</html>

2. 配置支持UTF-8字符的自定义字体(核心解决方法)

dompdf默认的DejaVu字体仅支持有限的UTF-8字符集,对于中文、特殊符号等需要引入对应字体:

  • 将支持目标字符的字体文件(如Noto Sans SC、微软雅黑等TTF文件)上传至storage/fonts目录(无此目录则手动创建)。
  • 发布dompdf配置文件(未发布过的话):
    php artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider"
    
  • 修改config/dompdf.php中的字体配置:
    return [
        'font_dir' => storage_path('fonts/'),
        'font_cache' => storage_path('fonts/'),
        'default_font' => 'notosanssc',
        'font_families' => [
            'notosanssc' => [
                'normal' => 'NotoSansSC-Regular.ttf',
                'bold' => 'NotoSansSC-Bold.ttf',
            ],
        ],
    ];
    
  • 在HTML的CSS中指定使用该字体:
    body {
        font-family: 'notosanssc', sans-serif;
    }
    

3. 优化dompdf生成配置

生成PDF时启用HTML5解析器,并指定默认字体:

use Barryvdh\DomPDF\Facade\PDF;

$pdf = PDF::loadView('pdf.your-view', $data)
    ->setOptions([
        'isHtml5ParserEnabled' => true,
        'isRemoteEnabled' => true,
        'defaultFont' => 'notosanssc',
    ]);

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

4. 验证字体加载状态

检查storage/fonts目录下是否生成了对应的.ufm格式缓存文件,若未生成则说明:

  • 字体文件路径配置错误
  • 字体文件损坏
  • storage目录权限不足(可执行chmod -R 755 storage/修复权限)

5. 避免使用远程或@import加载字体

dompdf对远程字体、CSS @import加载的字体兼容性较差,优先使用本地字体文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:22:47