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

5
我正在使用dompdf将一个html页面转换为pdf,但它显示的阿拉伯文本是反向的。
例如,如果文本是
ايبنسيالرمس
那么在PDF中显示为
مرلايسنبيا
有什么想法吗?

你能提供一张截图吗?只是为了确认一个方面。 - user.dz
2个回答

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


谢谢,它可以工作了。但是在添加了一些小修改后,我只是增加了一个检查非ASCII字符的语句:if(!mb_detect_encoding($text, array("ASCII"))) - Manish Goyal
我在从右到左的行中遇到了从左到右的字符问题。请查看我的答案,了解我如何扩展此答案以解决该问题。 - Steven

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接