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でアルファベットが続くと改行されずにテーブルはみだしていく現象がそれ)
日本語なら、どこでも改行可能なので、
幅と残りの文字数を計算してスペース部分で改行する必要がない。
逆にそれをされると、文字数が幅より多いと、スペース部分で勝手に改行されてしまう。