Laravel 4中用barryvdh/laravel-dompdf生成PDF显示梵文Unicode问题
我之前在Laravel 4用barryvdh/laravel-dompdf生成PDF时,也碰到过完全一样的问题——HTML里显示正常的梵文到PDF里就变成方框了。核心原因是dompdf默认使用的Helvetica等字体不支持Devanagari(梵文)字符集,得专门配置支持该字符的字体才行。下面是我亲测有效的解决步骤:
1. 准备支持Devanagari的字体
优先选开源且兼容性好的字体,比如Noto Sans Devanagari(谷歌专门为复杂脚本开发的字体,完全支持尼泊尔语梵文)。你可以直接下载它的TrueType(.ttf)文件,下载后保留常规字重的文件就行(比如NotoSansDevanagari-Regular.ttf)。
2. 把字体放到项目目录
在你的Laravel 4项目里,创建一个public/fonts目录,把下载好的字体文件放进去。这样dompdf可以访问到这个字体文件。
3. 配置dompdf的字体加载
方式一:修改全局配置文件
首先发布dompdf的配置文件到本地:
php artisan config:publish barryvdh/laravel-dompdf
然后打开config/packages/barryvdh/laravel-dompdf/config.php,找到options数组,添加或修改以下配置:
'options' => array( 'fontDir' => public_path('fonts'), // 字体文件所在目录 'fontCache' => storage_path('fonts'), // 字体缓存目录(需要可写) 'defaultFont' => 'Noto Sans Devanagari', // 设置默认字体为我们的梵文字体 'isHtml5ParserEnabled' => true, // 开启HTML5解析,更好支持复杂字符 'isRemoteEnabled' => true, // 如果字体是远程加载的话需要开启,本地的话可选 ),
方式二:生成PDF时动态配置
如果不想修改全局配置,也可以在生成PDF的代码里单独设置:
public function generateNepaliPdf() { $pdf = PDF::loadView('your-pdf-view') ->setOptions([ 'fontDir' => public_path('fonts'), 'fontCache' => storage_path('fonts'), 'defaultFont' => 'Noto Sans Devanagari', 'isHtml5ParserEnabled' => true, ]); return $pdf->download('nepali-document.pdf'); }
4. 在HTML视图中指定字体
即使设置了默认字体,最好还是在PDF对应的HTML视图里明确指定字体,避免样式覆盖:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <!-- 一定要加UTF-8编码 --> <style> /* 全局设置字体 */ body, h1, p, * { font-family: 'Noto Sans Devanagari', sans-serif; } </style> </head> <body> <h1>नमस्ते! यह नेपाली टेक्स्ट है</h1> <p>देवनागरि लिपि में लिखित पाठ अब PDF में सही तरीके से दिखेगा।</p> </body> </html>
5. 检查权限和缓存
第一次生成PDF时,dompdf会生成字体缓存文件,所以要确保storage/fonts目录有可写权限(可以用chmod -R 755 storage命令调整)。如果还是显示方框,可以删除缓存目录里的文件,重新生成PDF试试。
额外提示
如果你想用本地的尼泊尔语字体(比如Preeti),要确保字体是Unicode编码的TrueType文件,否则dompdf无法正确解析。Noto Sans Devanagari是最稳妥的选择,因为它完全遵循Unicode标准,支持所有梵文衍生的语言字符。
内容的提问来源于stack exchange,提问作者Bob.B

