Laravel中使用mPDF生成PDF时阿拉伯语文本方向与编码问题
解决Laravel中mPDF渲染阿拉伯语与LTR混合文本的方向问题
1. 开启mPDF的RTL支持
创建mPDF实例时,明确指定UTF-8编码并开启RTL方向,确保mPDF识别阿拉伯语的书写规则:
$mpdf = new \Mpdf\Mpdf([ 'mode' => 'utf-8', 'direction' => 'rtl', ]);
同时在视图的根HTML元素上添加dir="rtl"属性,统一页面文本方向:
<html dir="rtl">
2. 用双向控制字符处理混合文本
阿拉伯语是RTL方向,LTR字符(如括号)会被错误反转,需用**左到右标记(LRM,Unicode编码\u200E)**包裹LTR元素,明确其方向边界:
- 字符串处理示例:
$correctText = "الاسم الأول \u200E(عربي)\u200E"; - 视图中直接使用HTML实体:
<div>الاسم الأول ‎(عربي)‎</div>
3. 加载阿拉伯语支持字体
mPDF默认字体可能不兼容阿拉伯语字符,需配置支持阿拉伯语的字体(如Amiri、Noto Naskh Arabic):
- 将字体文件放入mPDF的
fonts目录 - 在mPDF实例中指定默认字体:
$mpdf = new \Mpdf\Mpdf([ 'mode' => 'utf-8', 'direction' => 'rtl', 'default_font' => 'Amiri', ]); - 视图CSS中指定字体:
body { font-family: 'Amiri', serif; }
4. 完整代码示例
控制器代码
use Mpdf\Mpdf; public function generateArabicPdf() { $mpdf = new Mpdf([ 'mode' => 'utf-8', 'direction' => 'rtl', 'default_font' => 'Amiri' ]); $content = "الاسم الأول \u200E(عربي)\u200E"; $html = view('pdf.arabic', compact('content'))->render(); $mpdf->WriteHTML($html); return $mpdf->Output('arabic-document.pdf', 'I'); }
视图文件(resources/views/pdf/arabic.blade.php)
<!DOCTYPE html> <html dir="rtl"> <head> <meta charset="UTF-8"> <style> body { font-family: 'Amiri', serif; font-size: 16px; } </style> </head> <body> <div>{{ $content }}</div> </body> </html>
原理说明
- RTL方向设置让mPDF按照阿拉伯语的从右到左规则渲染文本
- LRM标记强制括号等LTR字符保持原有方向,避免被RTL上下文反转顺序
- 阿拉伯语专用字体确保字符正确显示,不会出现乱码或字形错误
内容的提问来源于stack exchange,提问作者Zain ul Abideen
相关产品推荐
相关产品推荐

