PDFに苦しめられた一週間

PHPからPDFを作る必要があって、TCPDFFPDIというライブラリを利用したのですよ。このTCPDFとFPDIは結構便利な感じで「これならPDF生成も(比較的)楽々だぜ」と思っていたら、思わぬ所でハマりまいました。PHPに詳しい方なら、あんなヘンテコなところでハマることは無いのでしょうけど、こちとらプログラマじゃあ無いんじゃい! という事で、どこかの誰かの役に立てばと思い、顛末を記録しておこうと思います。

TCPDFというのはPHPのライブラリで、PDF生成を行ってくれます。細かい事は『TCPDFに関するリファレンス・ドキュメント』に詳しいので、興味のある方はそちらをご覧ください。
FPDIは、既にあるPDFをTCPDFの雛形としてインポートできるようにしてくれる拡張です。もともとはFPDFというPDF生成のライブラリを拡張するものだったらしいのですが、FPDFからTCPDFへ主流が移り、FPDIもTCPDFから利用できるようになった、らしいです。詳しくは知りません。

で、このTCPDFとFPDIなのですが、『猫ぐらし: PHP + TCPDF + FPDI + FPDI_Template』を参考にしてやってみると、とても簡単にPDFを生成できたのです。

こんな感じ。

<?php
require_once('./tcpdf/tcpdf.php');
require_once('./fpdi.php');

#オブジェクト生成
$pdf =&amp; new FPDI();

#ページを作る
$pdf-&gt;AddPage();

#雛形となるPDFを読み込む
$page_num = $pdf-&gt;setSourceFile('include.pdf');
$tplIdx = $pdf-&gt;importPage($page_num);
$pdf-&gt;useTemplate($tplIdx);

#内容の書き込み
$pdf-&gt;SetFont('dejavusans');
$pdf-&gt;SetTextColor(255, 0, 0);
$pdf-&gt;SetXY(25, 25);
$pdf-&gt;Write(0, "This is just a simple text");

#出力
$pdf-&gt;Output('newpdf.pdf', 'I');
?>


と、まぁ、これならサクサクできるな、と思いましたよ、ええ。

ところが、訳あってPHP 4.3.9とPHP 4.3.1の環境でコイツらを働かせる事になってしまったのです。TCPDFにはPHP 4対応バージョンとかがあったので、モノは試しと『さくらインターネット』のサーバ(PHPバージョンを4.4.9に設定)で動かしてみたら、まぁ、スンナリと動いたのです。

じゃ、大丈夫かな、と4.3.9と4.3.1の環境で動かしてみたら、出力されるPDFが真っ白になってしまうではありませんか。悩みましたねぇ、コレ。エラーは発生しないけど出力されたPDFは真っ白。一体何が原因なんだと悩み、色々と試す事数日。そんなに悩む程の事か、という声も聞こえてきそうですがこちとらプログラマじゃあ無いんじゃい!

勿体ぶらずに結論を言いますと、sprintf関数が原因でした。PHPのsprintf関数の型指定子に“%F”という、float型の浮動小数点として表示させるものがあるのですが、

F – 引数を float として扱い、 浮動小数点数として表現します (ロケールに依存しません)。 PHP 4.3.10 および PHP 5.0.3 以降で使用可能です。

と来たもんだ。これです、これが悪さをしていました。

PDF的に要素(テキストボックスとか画像とか)の配置指定はミリメートルとかを使うのです。で、それには当然「2.3ミリ」とか「5.5ミリ」とか、小数が必要になるのですね。それで、TCPDFとFPDIの内部では%F(float型)で値を扱っていたのですが、4.3.9以下では%Fが効かないもんだから無視されてしまって、要素が配置されていなかったようなのです。そりゃ真っ白なPDFになるわな。

速攻でTCPDFとFPDIのsprintf関数の%Fを%f(double型、こっちは大丈夫)に書き換えて(ライセンス的には大丈夫の筈・・・ちょっと自身無い)、それでまぁ、今の所はフツーに動いております。

ってゆーか、そんなの解らんよ。こちとらプログラマじゃあ無いんじゃい!

「PDFに苦しめられた一週間」への2件のフィードバック

  1. 当方もPDF変換する必要があったので、最初はTCPFDを使用しました。
    タグ内だけを対象にしなければいけないことも途中で気が付いて、やっと使えそうになった段階で次なる問題が発生。
    tableタグやdivタグは「cell」に変換しているようだが、alignが左になってしまう。
    いろいろと試したが、どうもスタイルシートが反映できないようだ。
    そこで試しに「mPDF」という変換ソフトを使ってところ、こちらはスタイルシートがそのまま適応されてPDF出力された。
    ということで、「mPDF」がお薦めです。

  2. > HitArts様

    コメントありがとうございます。
    なるほど、mPDFですね。私は触ったことがありませんが、機会があれば試してみたいと思います。
    現状ではPDFをどうのこうのするということも無くなってきているのですが……(笑)

コメントは停止中です。