如何使用TCPDF阻止日语标点符号前的自动换行?

时间:2015-05-07 21:10:47

标签: php regex unicode tcpdf

我使用PHP使用TCPDF生成日语PDF文档,因为它对Unicode有很好的支持。

但是,正则表达式用于将长文本块包装在" words"没有空格分隔在不适当的位置插入换行符,最明显的是在punctuation characters之前。例如,中断应该发生在(表意文字完整停止,Unicode 3002)或(逗号,Unicode 3001)之后,而不是之前。

我尝试使用/(?!\xa0)[\s\p{Z}](?!\p{P})/u限制正则表达式匹配任何分隔符但是标点符号但它不起作用(我不知道为什么)。

这是我的测试用例代码(您需要下载TCPDF并将其解压缩到同一个文件夹中)。

<?php
require_once(dirname(__FILE__).'/tcpdf/tcpdf.php');
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
$pdf->SetPrintHeader(false);
$pdf->SetPrintFooter(false);
$pdf->setFontSubsetting(true);
$pdf->setFont('cid0jp', '', 12);
$pdf->setSpacesRE('/(?!\xa0)[\s\p{Z}]/u'); // This is what TCPDF suggests: any space or separator, unless preceded by a non-breaking space
$pdf->SetMargins(50, 20);
$pdf->AddPage();
$html = '<style>.wrap {width: 20mm;}</style><div class="wrap">一一般には、疑問文の最後に、終止符に換えて置かれる。このため、疑問符は文の終わりをも示す。ただし、しばしば文の途中の疑問を表したい単語(不明確なことなど)の直後に置かれる。この場合、括弧で囲むことが多い。</div>';
$pdf->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, true, '', true);
$pdf->EndPage();
$pdf->Output('test.pdf', 'I');

我非常感谢能够改善表达方式的任何人,以便在新行的开头不会显示

编辑: 我花了一些时间微调正则表达式,这是一个更新版本:

// Select spaces or word boundaries, unless at the very start of the string, immediately preceded by opening parenthesis or braces, or immediately followed by an ideographic full stop, comma or any kind of parenthesis.
$pdf->setSpacesRE('/(?<!^|\x{a0}|\x{ff08}|\x{ff5b}|\x{ff3b}|\x{3010})(\s|\b|\p{Z})(?!\x{3001}|\x{3002}|\x{ff09}|\x{ff5d}|\x{ff3d}|\x{3011})/u');

当文字中插入非日语单词时,这并不好用,虽然它现在更合适地分割文本(据我所知,因为我不会说日语)当图书馆不合适时,图书馆仍会在错误的地方打破这些文字。我会继续调整,但我开始相信文本分割算法本身在处理亚洲语言时需要表现得不同。

0 个答案:

没有答案