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

Laravel 4中用barryvdh/laravel-dompdf生成PDF显示梵文Unicode问题

解决Laravel 4中dompdf无法渲染尼泊尔语梵文(देवनागरि)字符的问题

我之前在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:12:16