求助:mPDF无法正确加载BMitra、IRANSans等自定义波斯字体渲染波斯文本
解决mPDF渲染波斯语(Farsi)自定义字体异常问题
针对你遇到的mPDF加载波斯语自定义字体失败、OTL报错、排版异常的问题,可按以下步骤排查修复:
1. 字体文件与路径优化
- 确保使用完整支持OTL特性的字体版本:部分精简版字体(如压缩后的TTF)会移除GSUB/GPOS等OTL核心表,导致启用
useOTL时报错。建议从官方渠道下载完整版字体(比如Vazir、IRANSans的官方仓库)。 - 用绝对路径替代相对路径:mPDF对相对路径的解析容易出错,直接通过
realpath()生成绝对路径,避免路径找不到的问题:'R' => realpath(__DIR__ . '/assets/fonts/pdf/iransans.ttf'),
2. 调整mPDF核心配置
- 关闭
autoLangToFont:该参数会自动根据语言替换字体,可能覆盖你指定的自定义字体,设置为false。 - 显式启用OTL并绑定波斯语:初始化时指定
useOTL、useKashida和default_lang,确保mPDF正确识别波斯语并应用排版规则:$mpdf = new \Mpdf\Mpdf([ 'fontDir' => [realpath(__DIR__ . '/assets/fonts/pdf')], 'format' => $PAGE_FORMAT, 'autoLangToFont' => false, 'mode' => 'utf-8', 'useSubstitutions' => false, // 关闭自动字体替换,强制使用指定字体 'fontdata' => [ 'bmitra' => [ 'R' => realpath(__DIR__ . '/assets/fonts/pdf/bmitra.ttf'), 'B' => realpath(__DIR__ . '/assets/fonts/pdf/bmitrabd.ttf'), ], 'iransans' => [ 'R' => realpath(__DIR__ . '/assets/fonts/pdf/iransans.ttf'), 'B' => realpath(__DIR__ . '/assets/fonts/pdf/iransans.ttf'), ], 'vazir' => [ 'R' => realpath(__DIR__ . '/assets/fonts/pdf/vazir.ttf'), ], ], 'default_font' => 'iransans', 'useOTL' => 1, // 启用全部OTL特性 'useKashida' => 75, // 波斯语字符拉伸比例(0-100) 'default_lang' => 'fa', // 默认语言设为波斯语 ]); $mpdf->SetDirectionality('rtl');
3. HTML渲染规则优化
- 统一设置字体样式:在父容器统一指定
font-family,避免局部元素重复设置导致的冲突,同时确保dir="rtl"正确生效:$headerNumber = '<div dir="rtl" style="font-family: iransans; text-align: left;">'; $headerNumber .= 'شماره: 123456<br>'; $headerNumber .= 'تاریخ: 123456<br>'; $headerNumber .= 'پیوست: دارد'; $headerNumber .= '</div>'; - 清理mPDF缓存:修改字体配置后,删除mPDF的临时缓存目录(默认路径为
vendor/mpdf/mpdf/tmp),避免旧缓存影响新字体加载。
4. 字体兼容性验证
- 检查字体OTL支持:用FontForge打开字体文件,查看是否存在
GSUB和GPOS表,若不存在则说明该字体不支持OTL,需更换版本。 - 优先使用OTF格式:部分TTF字体的OTL支持不如OTF完善,尝试替换为对应字体的OTF版本测试。
内容的提问来源于stack exchange,提问作者ite 1878
相关产品推荐
相关产品推荐

