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

PHP使用imagettftext生成海报时阿拉伯语从右向左显示异常

阿拉伯语GD图片渲染RTL错乱修复方案

问题根源

PHP GD库的imagettftext函数本身不支持双向文本排版、阿拉伯语连字变形和RTL(从右到左)方向自动渲染。仅调用utf8Glyphs只能处理字符字形映射,没有完成Unicode双向算法重排、字符视觉顺序调整,因此会出现文字顺序颠倒、显示错乱的问题。
原代码还存在一处语法错误:字体路径定义行末尾缺失分号,会直接触发运行报错。

修复步骤

  • 调整阿拉伯语文本预处理顺序:先执行双向排版重排指定RTL方向,再做字形转换,适配GD的无布局渲染特性
  • 补全代码语法错误
  • 根据文本宽度计算正确的渲染起始X坐标,避免对齐偏移

预处理逻辑说明

你当前使用的Ar-PHP库(即代码中的Arabic类)提供了完整的阿拉伯语处理能力,正确的预处理顺序为:

  1. 调用utf8Bidi方法对输入文本做Unicode双向算法重排,显式指定方向为RTL,自动处理阿拉伯语、数字、英文混合内容的视觉顺序
  2. 调用utf8Glyphs方法转换阿拉伯语字符的独立/词首/词中/词尾字形,关闭手动反转参数,避免重复反转打乱顺序

注意:不要对预处理后的文本手动调用字符串反转函数,会直接破坏已经排好的视觉顺序。

完整可运行代码

public function generatePoster(Request $request,Arabic $obj) {
    $title = $request->get('title');
    // 阿拉伯语文本正确预处理
    $title = $obj->utf8Bidi($title, 'RTL');
    $title = $obj->utf8Glyphs($title, 20, false, false);

    $imgPath = public_path('storage/ichecktemplate.jpg');
    $image = imagecreatefromjpeg($imgPath);
    $color = imagecolorallocate($image, 255, 255, 255);
    $fontSize = 30 ;
    // 补全缺失的分号
    $font = public_path('Almarai-Bold.ttf');

    // 计算文本宽度,适配右对齐需求,可根据你的排版要求调整基准X坐标
    $rightEdgeX = 900; // 文本右边缘要对齐的X轴坐标
    $bbox = imagettfbbox($fontSize, 0, $font, $title);
    $textWidth = abs($bbox[2] - $bbox[0]);
    $x = $rightEdgeX - $textWidth;
    $y = 364;

    imagettftext($image, $fontSize, 0, $x, $y, $color, $font, $title);

    imagejpeg($image, 'save.jpg', 100);
    // 释放图像资源
    imagedestroy($image);
}

排坑检查项

  • 确认Almarai-Bold.ttf字体文件路径正确、文件无损坏,该字体本身支持阿拉伯语所有字形
  • 所有PHP文件、接口传入的文本参数均使用UTF-8 无BOM编码,避免编码导致的乱码
  • 如果不需要右对齐,可直接注释掉宽度计算部分,将$x设置为你需要的文本最右侧坐标即可
  • 若文本中包含数字、英文混排,utf8Bidi方法会自动处理排版逻辑,无需额外手动调整

内容的提问来源于stack exchange,提问作者Mouadh Laabidi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 01:06:26