我正在使用 dompdf 来使用 dompdf 转换 html 页面,但它以相反的顺序显示阿拉伯文本
例如,如果文本是
巴恩斯尼亚拉姆斯
然后显示为
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;
嗨先生,我对 dompdf 版本 3.0.0 也有同样的问题 但我找不到这个 dompdf/include/text_renderer.cls.php 文件可以帮助我