我正在使用dompdf将一个html页面转换为pdf,但它显示的阿拉伯文本是反向的。
例如,如果文本是
ايبنسيالرمس
那么在PDF中显示为
مرلايسنبيا
有什么想法吗?
例如,如果文本是
ايبنسيالرمس
那么在PDF中显示为
مرلايسنبيا
有什么想法吗?
dompdf目前不支持文字方向,因此从字符流的角度来看,RTL语言将无法正确显示。虽然有一种方法可以显示正确顺序的字符,但这需要修改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。
@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;