fonts árabes aparecem em ordem inversa em dompdf

Estou usando dompdf para converter uma página html usando dompdf, mas está mostrando texto árabe na ordem inversa

Por exemplo, se o texto for

ايبنسيالرمس

então está sendo exibido como

مرلايسنبيا em PDF

Alguma idéia de por quê?

dompdf atualmente não suporta direcionalidade, então os idiomas RTL não serão exibidos corretamente em relação ao stream de caracteres. Há um hack para exibir caracteres na ordem correta, embora exija a modificação do código dompdf.

Se você quiser experimentar a modificação, é necessário executar duas etapas. Primeiro, edite qualquer texto que deve exibir RTL com direction: rtl; text-align: right; direction: rtl; text-align: right; . Então, no arquivo dompdf / include / text_renderer.cls.php, adicione as seguintes linhas antes de cada instância de $canvas->text() (ou qualquer variante, como $this->_canvas->text() ):

 if (strtolower($style->direction) == 'rtl') { preg_match_all('/./us', $text, $ar); $text = join('',array_reverse($ar[0])); } 

(Você pode ter que mudar o nome da variável de $text para corresponder ao que é usado no código.)

Referências:

Além disso, vimos problemas onde os personagens não se juntam como esperado ao renderizar palavras. Este é um problema que não tivemos a chance de explorar ainda.

Referências:

Sua melhor opção agora para obter suporte total de direcionalidade é usar um navegador sem cabeça, por exemplo, o PhantomJS .

Somente problema com a resposta @BrianS é que os caracteres da esquerda para a direita na linha são exibidos de direita para a esquerda. É assim que resolvi (no meu caso, o cheque é para caracteres hebraicos):

 // 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; 
Intereting Posts