TCPDFでスペースがたまに改行になるバグ

※tcpdf ver4.8
TCPDFでPDFを表示する時、
たまにスペースが改行になったり、スペースの後のテキストが全て表示されなくなるケースがあった。

条件が定かでなく、環境によって改行されたりされなかったり・・・
どこにも解決策が見当たらなかったんで、自力で調査。


多分これでOK


これを

tcpdf.phpの4419行目
if (($l > $wmax) OR ($shy AND (($l + $tmp_shy_replacement_width) > $wmax)) ) {
}


こうする。

if (($l > $wmax) OR ($shy AND (($l + $tmp_shy_replacement_width) > $wmax)) ) {
}else{
	$sep = -1;
}

色々調べてみると、他のテキストではループが終わるころには
全部「$sep = -1」となっているのに、
スペースの時はそうなっていなかった。

上記if文で弾かれて、そのまま
「$sep = -1」が設定されないのが原因。

それで、次の文字がこの条件に当てはまらないとき、

行4394
if (($c != 160) AND (($c == 173) OR preg_match($this->re_spaces, $this->unichr($c)))) {
行4421
if ($sep == -1) {
}else{
...
}

上記のelseの中に入り込んで、表示がおかしくなる、
という現象のよう。
つまり正確には改行ではなく、
「次の文字が先頭から始まる」
ってことみたい


※副作用がないかどうかは、現在検証中です。




【追記】
[else]を使うのではなく、

行4395
// update last blank space position
//$sep = $i;
//日本語の場合以降の自動改行処理をする必要がないため、[-1]固定。
//(英語はスペース部分でないと改行が出来ないため、pdfの幅を超えないよう、スペースで改行処理を行う必要がある。)
$sep = -1;

こうすることで、自動改行を無効にするほうが良さそう。

この部分でスペースの場所を記憶して、
以降の部分で、
スペースだったら残りの文字数数えて、
幅よりも長かったら自動的に改行するという計算をしていた。

「-1」ならスペースじゃないから自動改行しなくていいよ、
と認識してくれる。

英語だとスペースのところでないと改行できない(?)ためこの処理を行っているが、
(htmlでアルファベットが続くと改行されずにテーブルはみだしていく現象がそれ)
日本語なら、どこでも改行可能なので、
幅と残りの文字数を計算してスペース部分で改行する必要がない。
逆にそれをされると、文字数が幅より多いと、スペース部分で勝手に改行されてしまう。