アイネクシオ(inexio)

私たちはネットワークから新しいアイデアを創出します

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

2016/03/30 2016/01/19

Category:FuelPHP, PHP Tag:, ,

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

たまたまfuelPHPで基幹システムを作成する機会があったので、fuelPHPを利用してPDFを出力する方法を記録しておきます。
PDF出力は、基本となるテンプレートPDfに情報を書き込んでいくことを想定してます。
TCPDFとFPDIの組み合わせでかなり楽に出力できるのでビックリですな。

条件

  • FuelPHP 1.7
  • FPDI
  • TCPDF
  • PDFを出力できる環境
    テンプレートとなるPDFを作成できる環境(とりあえずOffice2010で出力した)

FuelPHP

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

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

テンプレートPDFは以下に設置することにしておきます。
[php]/public/test.php[/php]

FPDI

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

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

FPDIダウンロードページ

ディレクトリ名を「fpdi」にして設置しましたので、以下の様な構成になります。
[php]/fuel/app/vendor/fpdi/ファイル群[/php]

TCPDF

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

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

TCPDFダウンロードページ

ディレクトリ名を「fpdi」にして設置しましたので、以下の様な構成になります。
[php]/fuel/app/vendor/tcpdf/ファイル群[/php]

テンプレートPDFの用意

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

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の最適化01
PDFの最適化02

PDF出力ソース

fuelPHPで適当なコントローラを作成して、出力ソースを書いてみます。
ここではPDFコントローラを作成しました。
このコントローラにアクセスすることで、PDFがブラウザで表示されることになります。
[php]
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’ );
}

}
[/php]

まとめ

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

Avatar photo
家族と音楽とコーヒーを愛し、プログラマーとして存在しています。

執筆者:Takahiro