5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

FPDFの日本語化パッチ使用時のエラー

Last updated at Posted at 2015-03-10

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を使うことはないんじゃないかと思います。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?