サイトアイコン アイネクシオ(Webサイトドクター)

FuelPHPでテンプレートPDFファイルに動的データ追加

帳票を印刷したり、契約書を印刷したりと、基幹システムにもWebサービスを展開するにも、PDFの利用は比較的多かったりします。
今はとても便利なライブラリなどが揃っていて、簡単にPDFを出力が可能になっていますが、バージョンなどによって調整が必要だったりすることもあります。

たまたまfuelPHPで基幹システムを作成する機会があったので、fuelPHPを利用してPDFを出力する方法を記録しておきます。

PDF出力は、基本となるテンプレートPDfに情報を書き込んでいくことを想定してます。
TCPDFとFPDIの組み合わせでかなり楽に出力できるのでビックリですな。

条件

FuelPHP

利用者も多く、簡単に導入できることからインストールやら初期設定は割愛。
以下URLでわかるとおり、コマンド一、二発で完了できますね。
FuelPHP クイックインストール

これから準備する「fpdi」と「tcpdf」は以下ディレクトリに格納していきます。

/fuel/app/vendor/

テンプレートPDFは以下に設置することにしておきます。

/public/test.php

FPDI

FPDIは、既存のPDFファイルをテンプレートとして利用し、情報を追記することができるものです。
動的に出力される箇所以外は、既存の文書を流用させることが効率的で、ソースをシンプルにできますもんね。

FPDIのサイトからファイルをダウンロード・解凍して、「/fuel/app/vendor/」に設置します。
今回ダウンロードしたのは、Version 1.6.1でした。
FPDI Downloads

ディレクトリ名を「fpdi」にして設置しましたので、以下の様な構成になります。

/fuel/app/vendor/fpdi/ファイル群

TCPDF

TCPDFは、PDFファイルを動的に生成するためのPHPライブラリです。

TCPDFのサイトからファイルをダウンロード・解凍して、「/fuel/app/vendor/」に設置します。
今回ダウンロードしたのは、Version 6.2.12でした。
TCPDF PHP class for PDF

ディレクトリ名を「fpdi」にして設置しましたので、以下の様な構成になります。

/fuel/app/vendor/tcpdf/ファイル群

テンプレートPDFの用意

動的に出力される箇所以外の文書を用意しておきます。
冒頭でも記載したように、テンプレートPDFは以下に設置します。

/public/test.pdf

PDF作成方法はたくさんありますが、とりあえず以下の2種類を記載しておきます。
「Office」は特別問題はなかったけど、「Adobe PDF」で印刷する場合はちょっと問題があったからね。

Office2010以降で保存

WindowsでOffice2010以降であれば、保存形式にPDFを選択できるので何も問題なさそうですね。

Adobe PDFで印刷

Excelなどから「Adobe PDF」で印刷してテンプレートPDFを作成したものをテンプレートとして利用する場合、PHPコードで以下のようなエラーが出力されることがあります。
これは「フリー版のFPDIでは、圧縮PDFは取り扱うことができない」というようなエラーのようです。

This document (PDFファイルの場所) probably uses a compression technique which is not supported by the free parser shipped with FPDI.

Acrobatで以下のような手順で圧縮を解除してあげておくことで、上記のようなエラーは回避できます。

  1. Acrobatで対象のPDFを開きます。
  2. 「アドバンスト」 -> 「PDFの最適化」を開きます。
  3. 左ペインの「最適化」を選択します。
  4. 右ペインの「オブジェクト圧縮オプション」を【圧縮を解除】に設定します。
  5. ファイルを上書き保存します。

PDF出力ソース

fuelPHPで適当なコントローラを作成して、出力ソースを書いてみます。
ここではPDFコントローラを作成しました。
このコントローラにアクセスすることで、PDFがブラウザで表示されることになります。

require_once( APPPATH . 'vendor/tcpdf/config/tcpdf_config.php' );
require_once( APPPATH . 'vendor/tcpdf/tcpdf.php' );
require_once( APPPATH . 'vendor/fpdi/fpdi.php' );

class Controller_Pdf extends Controller {

public function action_index() {
$pdf = new FPDI();
$pdf->setPrintHeader( false );
$pdf->setPrintFooter( false );
$pdf->AddPage();
$pdf->setSourceFile( DOCROOT . 'test.pdf' );
$index = $pdf->importPage( 1 );
$pdf->useTemplate( $index );

// ここのあたりから動的に出力される処理を書きます。
$pdf->Write( 0, 'TEST' );

$pdf->Output( 'pdf.pdf', 'I' );
}

}

まとめ

本当に簡単じゃなかったでしょうか。
PDFの出力がこんなに簡単にできるので、いろいろ出力してみたくなったりしますな。
しかしこういったライブラリを作るのって凄いよな~。

モバイルバージョンを終了