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

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>الاسم الأول &lrm;(عربي)&lrm;</div>
    

3. 加载阿拉伯语支持字体

mPDF默认字体可能不兼容阿拉伯语字符,需配置支持阿拉伯语的字体(如Amiri、Noto Naskh Arabic):

  1. 将字体文件放入mPDF的fonts目录
  2. 在mPDF实例中指定默认字体:
    $mpdf = new \Mpdf\Mpdf([
        'mode' => 'utf-8',
        'direction' => 'rtl',
        'default_font' => 'Amiri',
    ]);
    
  3. 视图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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 23:03:16