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
相关产品推荐
相关产品推荐

