阿拉伯字体在 dompdf 中以相反顺序显示

问题描述 投票:0回答:3

我正在使用 dompdf 来使用 dompdf 转换 html 页面,但它以相反的顺序显示阿拉伯文本

例如,如果文本是

巴恩斯尼亚拉姆斯

然后显示为

PDF 格式

知道为什么吗?

php arabic dompdf
3个回答
9
投票

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.


2
投票

@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;

0
投票

嗨先生,我对 dompdf 版本 3.0.0 也有同样的问题 但我找不到这个 dompdf/include/text_renderer.cls.php 文件可以帮助我

© www.soinside.com 2019 - 2024. All rights reserved.