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

时间:2014-01-18 07:17:16

标签: php arabic dompdf

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

例如,如果文字是

ايبنسيالرمس

然后显示为

PDF中的

مرلايسنبيا

知道为什么吗?

2 个答案:

答案 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;