PHPでPDFを生成するとき、FPDFというライブラリを使用するのがわりとメジャー(?)らしいです。
しかしこれ、日本語に対応していません。
そこで以下に従って日本語対応をしてみました。
http://www.phpbook.jp/fpdf/japan/index1.html
これでOKかと思いきや、日本語対応といってもShift JISにしか対応していないので、そのままだとUTF-8は使えないんですね……。
しかたがないので
function sjis($str) {
mb_convert_encoding($str, 'SJIS', 'UTF-8');
}
といった関数を定義して、渡す文字列をShift_JISに変換して使ってあげています。手間だなあ。
今度こそ問題ないかと思いきや、あるPDFに Cell メソッドで文字を出力しようとしたところ japanese.php:76 で Undefined index エラーが……。
原因調べたところ、この日本語化パッチ、GetSJISStringWidth($s) という関数が、引数として受け取った値を配列として処理しているんですね。
PHPに限らず多くの言語でそうですが、文字列は「文字の配列」なので配列として操作できます。たとえば以下のようなことが可能なわけです。
$str = 'hoge';
echo $str[0]; // h と出力される
しかしこれは $str が文字列であるから可能なわけで、PHPの場合、引数で受け取る値の型は保証されていないので、数字とか渡されると Undefined index になっちゃうわけですね。配列じゃないから。
ということで、japanese.php の GetSJISStringWidth($s) の頭に $s = (string) $s; を書き加えると直りました。
今回はFPDFで既に実装されているものの改修だったのでFPDFを使いましたが、きっともっと新しくてまともなライブラリがあるはずなので、あえてFPDFを使うことはないんじゃないかと思います。