Я использую dompdf для преобразования html-страницы с помощью dompdf, но он показывает арабский текст в обратном порядке
Например, если текст
ايبنسيالرمس
то он отображается как
مرلايسنبيا в PDF
Любая идея почему?
dompdf в настоящее время не поддерживает направленность, поэтому языки RTL не будут отображаться правильно в отношении потока символов. Существует хак для отображения символов в правильном порядке, хотя для этого требуется модификация кода dompdf.
Если вы хотите попробовать модификацию, необходимы два шага. Во-первых, создайте любой текст, который должен отображать RTL с direction: rtl; text-align: right;
direction: rtl; text-align: right;
, Затем в файле 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
переменной $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;