PR

TCPDFで半角カタカナの文字幅計算がおかしいのを修正する

こんにちは。もとやんです。今回は久しぶりに技術tipsです。

「TCPDFで半角カタカナを含む文字列をWrite(CellやMultiCell含む)した時に、折り返し幅がおかしい」という問題について対策をお話します。

PHPでPDFを作る際によく使われるであろうライブラリである「TCPDF」ですが、半角カタカナの処理に色々と問題が有ります。
この辺りは「TCPDF 半角カタカナ」あたりでググってもらうといろいろ出てくるのですが、今回の問題は調べても出てこなかったのでTCPDF自体に無理やり対応コードを埋め込みました。

結論としては、tcpdf.phpのGetCharWidthメソッドを改造します。最後に「return $chw;」しているところを、以下のように書き換えます。


if (in_array($char, array(65377, 65378, 65379, 65380, 65381, 65382, 65383, 65384, 65385, 65386, 65387, 65388, 65389, 65390, 65391, 65392, 65393, 65394, 65395, 65396, 65397, 65398, 65399, 65400,65401, 65402, 65403, 65404, 65405, 65406, 65407, 65408, 65409, 65410, 65411, 65412, 65413, 65414, 65415, 65416, 65417, 65418, 65419, 65420, 65421, 65422, 65423, 65424, 65425, 65426, 65427, 65428, 65429, 65430, 65431, 65432, 65433, 65434, 65435, 65436, 65437, 65438))) {
$chw /= 2.0; //半角カタカナの幅を半分に
}
return $chw;

問題の内容としては、折り返し判定をするために出力する文字列の横幅が、書き出し対象の横幅を超えないかをチェックする箇所がTCPDFにあるのですが、半角かな文字の横幅が全角文字と同様の数値として計算されているので、半角カタカナの場合は単純に2で割った数字に横幅をオーバーライドしています。これで出力的には問題ありません。
数字の配列は、UTF16でエンコードした場合の半角文字の集合です。

TCPDFで帳票を出すコードを書いている人は場合によってはハマるところではないでしょうか。参考になれば幸いです。
でわでわ。

コメント

タイトルとURLをコピーしました