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

PHP中使用mPDF生成PDF时乌尔都语字符'ہ'缺失问题求助

mPDF生成乌尔都语PDF时字符'ہ'(Heh)缺失/渲染异常问题

在PHP中使用mPDF库生成含乌尔都语的PDF时,字符'ہ'(Heh)出现缺失或渲染异常。已选用Jameel Noori Nastaleeq字体(该字体以准确渲染乌尔都语文本著称),HTML内容中包含该字符且其他乌尔都语字符渲染正常,但调整字体和样式后问题仍存在。

相关代码

<?php
require_once 'vendor/autoload.php'; // 按需调整路径

// 使用mPDF生成PDF的函数
function generatePDF($data) {
    $mpdf = new \Mpdf\Mpdf();

    $mpdf->SetFont("Jameel Noori Nastaleeq");

   // 加载HTML内容
   $html = "<html dir='rtl' lang='ur'><head><style>
   body {
    font-family: 'Jameel Noori Nastaleeq', 'Noto Nastaliq Urdu', 'Nafees Nastaleeq', 'Urdu Naskh Asiatype', 'Tahoma', sans-serif;
  }

   /* 添加或修改样式优化布局 */
   .info-container {
       border: 1px solid #ccc;
       padding: 10px;
       margin: 20px auto;
       max-width: 600px; /* 按需调整 */
   }
   
   .info-label {
       font-weight: bold;
       display: inline-block; /* 标签内联显示 */
       width: 150px; /* 按需调整标签宽度 */
       margin: 0;
   }
   
   .info-value {
       display: inline-block; /* 值内联显示 */
       margin: 0;
   }
   
   </style></head><body>";
   


$html .= "<div class='info-container'>";
$html .= "<p class='info-label'>والد کا پیشہ:</p><p class='info-value'>{$data['father_occupation']}</p>";
$html .= "<p class='info-label'>کیا والدین حیات ہیں؟:</p><p class='info-value'>" . ($data['are_parents_alive'] == 1 ? 'ہاں' : 'نہیں') . "</p>";
$html .= "</div>";

$html .= "</body></html>";

$mpdf->mirrorMargins = true;
$mpdf->SetDisplayMode('fullpage');
    // 将HTML加载到mPDF
    $mpdf->WriteHTML($html);

    // 输出PDF到浏览器
    $mpdf->Output($data['name'] . '_' . date('Y-m-d') . '.pdf', 'D');

}

include('db.php');

// 检查URL中是否提供了ID
if (isset($_GET['id'])) {
    $id = $_GET['id'];

    // 根据ID获取数据
    $result = $conn->query("SELECT * FROM users_data WHERE id=$id");

    if ($result->num_rows == 1) {
        // 获取关联数组形式的数据
        $fetched_data_for_id = $result->fetch_assoc();

        // 调用generatePDF函数生成PDF
        generatePDF($fetched_data_for_id);
    } else {
        echo "未找到指定ID的数据。";
    }
} else {
    echo "未指定ID。";
}
?>

问题截图

乌尔都语字符渲染异常截图


潜在原因分析

  • mPDF对乌尔都语连字(ligature)支持不足:乌尔都语是RTL语言,字符'ہ'在不同语境下有不同连字形态,部分字体的字符映射可能未被mPDF正确识别。
  • 字体文件未正确加载:虽然指定了字体,但mPDF可能未找到完整的Jameel Noori Nastaleeq字体文件,或字体本身缺少该字符的特定形态。
  • 字符编码不一致:数据库或HTML内容中的'ہ'字符编码不统一,导致mPDF解析时无法正确映射到字体字形。

解决方案

1. 正确配置字体加载路径

初始化mPDF时明确指定字体目录和字体信息,确保mPDF能读取完整的字体文件:

// 初始化mPDF时配置字体
$mpdf = new \Mpdf\Mpdf([
    'fontDir' => __DIR__ . '/fonts/', // 字体文件存放目录
    'fontdata' => [
        'jameel' => [
            'R' => 'JameelNooriNastaleeq.ttf', // 字体文件名
            'useOTL' => 0xFF,
            'useKashida' => 75
        ]
    ],
    'default_font' => 'jameel'
]);

注意:将JameelNooriNastaleeq.ttf文件放到指定的fonts目录下。

2. 启用乌尔都语特殊渲染支持

开启OTL(Open Type Layout)和Kashida(延长线)支持,适配乌尔都语的连字和排版规则:

$mpdf->useOTL = true;
$mpdf->useKashida = true;

3. 统一字符编码

  • 确保数据库连接使用UTF-8编码,在db.php中添加:$conn->set_charset("utf8mb4");,支持完整Unicode字符。
  • 在HTML头部添加<meta charset="UTF-8">,确保HTML内容编码一致。

4. 更换兼容字体

如果Jameel Noori Nastaleeq仍有问题,尝试使用Google开发的Noto Nastaliq Urdu字体,该字体对Unicode支持更完善:

$mpdf = new \Mpdf\Mpdf([
    'fontDir' => __DIR__ . '/fonts/',
    'fontdata' => [
        'notourdu' => [
            'R' => 'NotoNastaliqUrdu-Regular.ttf',
            'useOTL' => 0xFF,
            'useKashida' => 75
        ]
    ],
    'default_font' => 'notourdu'
]);

5. 使用Unicode实体替代直接字符

若特定字符仍无法渲染,可在HTML中使用'ہ'对应的Unicode实体&#x06BE;:

$html .= "<p class='info-value'>" . ($data['are_parents_alive'] == 1 ? '&#x06BE;اں' : 'نہیں') . "</p>";

替代方法

如果mPDF的乌尔都语渲染问题始终无法解决,可尝试以下替代库:

  • TCPDF:对RTL语言支持较好,可配置乌尔都语字体实现正确渲染。
  • dompdf:基于HTML/CSS渲染PDF,配合RTL字体和direction: rtl等CSS属性,可能解决字符渲染问题。

内容的提问来源于stack exchange,提问作者Muhammad Yahya Imran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 19:24:56