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

