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

Laravel使用thujohn/pdf-l4生成PDF时阿拉伯文显示为问号求助

解决Laravel中thujohn/pdf-l4生成PDF显示阿拉伯字符的问题

我之前也碰到过类似的阿拉伯语PDF渲染问题,这个库底层依赖TCPDF,而阿拉伯语作为RTL(从右到左)语言,需要针对性处理字体、编码和文档方向,你的问题根源其实出在这几个关键点上:

  • 用utf8_decode会把UTF-8编码的阿拉伯字符转成不支持该语言的ISO-8859-1编码,自然显示成问号
  • 直接去掉编码转换后,因为缺少RTL支持和对应字体,导致内容无法被正确渲染

下面是亲测有效的解决方案:

1. 引入支持阿拉伯语的字体

thujohn/pdf-l4默认字体不包含阿拉伯字符集,你需要添加一个支持阿拉伯语的字体,比如开源的Amiri或者DejaVu Sans:

  • 下载对应字体的.ttf文件
  • 将字体文件放到库的字体目录:vendor/thujohn/pdf-l4/src/Thujohn/Pdf/fonts

2. 修改代码,配置编码、字体和RTL方向

替换你的代码为以下内容,注意关键配置项:

$html = '<html>';
$html .= '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
// 给文本添加RTL样式,保证阿拉伯语排版方向正确
$html .= '<body style="direction: rtl; text-align: right;">مرحبا</body>';
$html .= '</html>';

// 初始化PDF实例
$pdf = PDF::load($html, 'A4', 'portrait');

// 设置支持阿拉伯语的字体(这里的'amiri'是你放入字体目录的字体文件名,不带后缀)
$pdf->setFont('amiri', '', 14);

// 开启RTL文档支持
$pdf->setRTL(true);

// 输出PDF
return $pdf->show();

3. 额外调试技巧

  • 如果用的是DejaVu Sans字体,把setFont里的amiri换成dejavusans即可
  • 确保HTML内容本身是UTF-8编码,绝对不要做任何额外的编码转换(比如去掉utf8_decode)
  • 若仍有问题,可以直接调用TCPDF底层方法来配置:
$pdf->getTCPDF()->SetFont('amiri', '', 14);
$pdf->getTCPDF()->setRTL(true);

按照这个流程调整后,阿拉伯字符应该就能正常显示了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:44:56