在 tcpdf 中混合 rtl 和 ltr

mixing rtl with ltr in tcpdf

我正在使用 tcpdf 在我的网络应用程序中创建 pdf 文件。

我正在使用 tcpdf 的 writeHtml() 函数并尝试将一些希伯来语与英语混合,

当试图在同一行中组合两种语言时,输出方向错误。

例如 - 这是我的一段代码:

    $pdf = new TCPDF ( PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false );
    $pdf->SetDisplayMode ( "default", "OneColumn" );
    $pdf->setRTL ( false );
    $pdf->SetFont ( 'freeserif', '', 10, '' );


    $html = '<body  style="text-align: center">';
    $html .= "<p> some words in english ואחכ כמה מילים בעברית </p>";
    $html .= "<p> כמה מילים כתובות בעברית and then some words in english</p>";
    $html .= '</body>';
    $pdf->AddPage ();

    $pdf->writeHTML ( $comments_table, true, false, true, false, 'R' );
    $pdf->Output ( $path, 'F' );

预期输出将是:

英语中的一些单词 ואחכ כמה מילים בעברית

כמה מילים כתובות בעבית 然后是一些英文单词。

但是每种语言中第二种语言的单词顺序相反 我的输出是:

英语中的一些单词 בעבוית מילים כמה ואחכ

כמה מילים כתובות בעבית 英文单词 some then and

如您所见 - 第一行英语可以 - 而希伯来语不行,第二行希伯来语可以,英语不行

尝试用 dir="rtl"span 标签中包装希伯来语块。我知道这可以在浏览器中使用,只是不确定 TCPDF。您还可以在这些 span 标签中包含混合了英语和希伯来语的整个句子。

根据this tutorial from w3.org about bidirectional text

For inline text, tightly wrap all opposite-direction phrases in markup that sets their base direction.

所以你的代码应该是这样的:

$html = '<body style="text-align: center">
            <span> some words in english<span>
            <span>ואחכ כמה מילים בעברית <br> כמה מילים כתובות בעברית<span>
            <span>and then some words in english</span>
        </body>';

$pdf->AddPage();

$pdf->writeHTML( $html, true, false, true, false, '' );

我从 tcpdf 切换到内置支持双向语言的 mpdf

使用 setRTL():

...
$pdf->setRTL(true);
$pdf->writeHTML($html, true, false, true, false, '');

要使输出正确显示 RTL 或 LTR 写入方向,只需从解决方案中检查当前方向并将其存储在 $direction 变量中,然后检查它是否为 RTL。 将此添加到您的代码中:

$direction = $user->get_config("direction");
$style = "";

if ($direction == "rtl"){
        $style = "
                 <style> h1,h2,h3,h4,h5,div,p,table,thead,tr,td {
                         direction:rtl !important; text-align: right !important;}
                 </style>";
    }

然后在将任何内容放入 $html 变量之前添加此内容

$html = $style . "<HTML CODE>";

最后打印输出:

$pdf->writeHTML($html, true, false, false, false, '');