使用mPDF库导出阿拉伯文PDF时文本显示乱码的问题
解决mPDF导出阿拉伯文PDF显示异常的方案
针对你的问题,核心原因是mPDF默认配置未适配阿拉伯文的RTL(从右到左)排版需求,且缺少支持阿拉伯文的字体配置,以下是具体修复步骤:
1. 修正mPDF初始化配置
阿拉伯文属于RTL语言,需要在初始化时指定对应模式、开启自动语言字体映射,并设置文本方向:
function generateAndOutputPDF($studentDetails) { // 初始化mPDF,适配阿拉伯文 $mpdf = new Mpdf([ 'mode' => 'utf-8', // 或直接用'ar'指定阿拉伯文模式 'format' => 'A2', 'autoScriptToLang' => true, 'autoLangToFont' => true, 'default_font' => 'Amiri' // 指定支持阿拉伯文的字体 ]); // 设置全局文本方向为RTL $mpdf->SetDirectionality('rtl'); // 构造包含阿拉伯文的HTML内容(根据你的实际字段调整) $html = ' <!DOCTYPE html> <html lang="ar"> <body dir="rtl"> <h1>شهادة التسجيل</h1> <p>اسم الطالب: ' . $studentDetails['NomArabe'] . '</p> <p>رقم التسجيل: ' . $studentDetails['NumInscription'] . '</p> </body> </html> '; // 写入HTML内容到PDF $mpdf->WriteHTML($html); // 输出PDF作为下载 $mpdf->Output('certificate_' . $studentDetails['NumInscription'] . '.pdf', 'D'); }
2. 确保字体支持阿拉伯文
- 如果使用系统已安装的阿拉伯字体(如Arial Unicode MS、Times New Roman),直接修改
default_font为对应字体名称即可。 - 如果需要引入自定义字体(如Amiri),需将字体文件(.ttf/.otf)放入项目字体目录,然后在mPDF初始化时配置:
$mpdf = new Mpdf([ // 其他配置... 'fontDir' => __DIR__ . '/fonts/', 'fontdata' => [ 'amiri' => [ 'R' => 'Amiri-Regular.ttf', 'B' => 'Amiri-Bold.ttf' ] ], 'default_font' => 'amiri' ]);
3. 数据库字符编码校验
确保数据库连接和表字段字符编码为utf8mb4,避免从数据库读取阿拉伯文时出现乱码:
// 在conn.php中添加字符编码设置 $conn->exec("SET NAMES 'utf8mb4'"); $conn->exec("SET CHARACTER SET utf8mb4");
关键注意事项
- HTML内容必须设置
lang="ar"和dir="rtl",确保mPDF识别文本方向。 - 所有包含阿拉伯文的变量输出时,不要转义字符(确保数据库读取的是原始UTF-8字符串)。
内容的提问来源于stack exchange,提问作者Mohamed Zouine
相关产品推荐
相关产品推荐

