FPDF+MBFPDFでPDFを作成していたところ
MultiCell()で複数行セルを出力したら変なインデントのようなものができた。
しかし、調べてみるとインデントが入っているというより
文字の幅が正しく取得できていないようで、同じくMultiCell()で別の文字列を出力したところ
特に問題なく表示できていた。
文字列の幅を取得する際、通常はFPDFのGetStringWidth()メソッドを使用しているが
MBFPDFではGetStringWidth()メソッドにて、現在のフォントのタイプがType0である場合
GetMBStringWidth()メソッドを使用するようオーバーライドしている。
しかし、残念なことに今回の不具合はこのGetMBStringWidth()メソッドで起きていた。
この修正に関しては、以下のブログが参考となった。
めも – PHPでPDF
http://d.hatena.ne.jp/noricyan/20101021/1287628551
この情報を参考に、GetMBStringWidthを下記のように修正する。
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
function GetMBStringWidth($s) { //Multi-byte version of GetStringWidth() $l=0; $cw=&$this->CurrentFont['cw']; $japanese = ($this->CurrentFont['registry']['ordering'] == 'Japan1'); $nb=strlen($s); $i=0; while($i<$nb) { $c=$s[$i]; if(ord($c)<128) { $l+=$cw[$c]; $i++; } else { $hwkana = ($japanese && ord($c)==142); $l+=$hwkana ? 500 : 1000; $i+=2; } } // 元のソースコード // return $l*$this->FontSize/1000; // 修正後 return mb_strwidth ( $s ) * 500 * $this->FontSize / 1000; } |
これできちんと表示することが出来た。