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
相关产品推荐
相关产品推荐

