我使用dompdf来转换使用dompdf的html页面,但它以相反的顺序显示阿拉伯语文本
例如,如果文字是
ايبنسيالرمس
然后显示为
PDF中的مرلايسنبيا
知道为什么吗?
答案 0 :(得分:5)
dompdf目前不支持方向性,因此RTL语言在字符流方面无法正确显示。有一个hack用于以正确的顺序显示字符,但它确实需要修改dompdf代码。
如果您想尝试修改,则需要执行两个步骤。首先,设置应使用direction: rtl; text-align: right;
显示RTL的任何文本。然后,在文件dompdf / include / text_renderer.cls.php中,在每个$canvas->text()
实例(或任何变体,例如$this->_canvas->text()
)之前添加以下行:
if (strtolower($style->direction) == 'rtl') {
preg_match_all('/./us', $text, $ar);
$text = join('',array_reverse($ar[0]));
}
(您可能需要更改$text
变量的名称以匹配代码中使用的名称。)
参考文献:
此外,我们已经看到了在渲染单词时字符未按预期连接在一起的问题。这是我们尚未有机会探索的问题。
参考文献:
现在,为了完全支持方向性,您最好的选择是使用无头浏览器,例如: PhantomJS
答案 1 :(得分:1)
只有@BrianS回答的问题是该行中从左到右的字符从右到左显示。这就是我解决它的方式(在我的例子中,检查是希伯来字符):
// check if the line contains Hebrew characters from the start too
// to avoid flipping dates etc.
if( strtolower( $style -> direction ) == 'rtl' && preg_match( "/\p{Hebrew}/u", $text ) ):
preg_match_all('/./us', $text, $ar);
// reverse the whole line
$text = join('',array_reverse($ar[0]));
// flip english back to ltr
$words = explode( ' ', $text );
foreach( $words as $i => $word ):
if( !preg_match( "/\p{Hebrew}/u", $word ) ):
$words[$i] = implode( '', array_reverse( str_split( $word ) ) );
endif;
endforeach;
$text = implode( ' ', $words );
endif;