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

Yii2中使用mPDF生成PDF无法显示₹符号的问题求助

解决Yii2中旧版mPDF生成PDF时₹符号无法显示的问题

核心问题分析

旧版mPDF对Unicode特殊字符(如印度卢比符号₹)的支持依赖正确的字体配置与编码设置,仅添加字体数据但未在实例化或HTML中指定使用,会导致符号无法渲染。

具体解决方案

1. 确认字体文件路径与配置匹配

  • 确保DejaVu系列字体文件(DejaVuSans.ttf等)已放置在旧版mPDF的ttfonts目录下(通常路径为vendor/MPDF/ttfonts/)
  • 检查fontdata配置中的文件名与实际文件完全一致(Linux环境需注意大小写)

2. 实例化mPDF时指定编码与默认字体

修改mPDF初始化代码,明确设置UTF-8编码和默认使用支持₹的字体:

$path = \Yii::getAlias("@vendor/MPDF/mpdf.php");
require_once($path);
// 实例化时指定编码为utf-8,默认字体为dejavusans
$mpdf = new \mPDF('utf-8', 'A4', '', 'dejavusans', 15, 15, 16, 16, 9, 9);

$mpdf->packTableData = true;
$mpdf->SetDisplayMode('fullpage');
$mpdf->list_indent_first_level = 0;
$mpdf->showWatermarkText = true;
$mpdf->watermarkTextAlpha = 0.2;
$mpdf->simpleTables = true;
$mpdf->WriteHTML($table);

$mpdf->Output('payslip.pdf', 'D');

3. 在HTML内容中强制指定字体

在生成的$table HTML代码中,给包含₹符号的元素或整个文档设置字体:

<style>
    body, table {
        font-family: dejavusans, sans-serif;
    }
</style>
<!-- 或针对单个符号单独设置 -->
<span style="font-family: dejavusans;">₹1000</span>

4. 清理mPDF字体缓存

旧版mPDF会在vendor/MPDF/tmp/目录生成字体缓存文件,删除该目录下所有缓存文件后重新生成PDF,避免旧缓存数据干扰。

5. 替换为更适配的字体(可选)

如果DejaVu字体仍无法渲染₹,可尝试使用专门支持印度语系的字体(如Noto Sans Devanagari):

  • 将字体文件放入ttfonts目录
  • 在fontdata中添加配置:
"notosansdevanagari" => array(
    'R' => "NotoSansDevanagari-Regular.ttf",
    'B' => "NotoSansDevanagari-Bold.ttf",
),
  • 随后在mPDF实例化或HTML中指定使用该字体。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:57:30