帳票を印刷したり、契約書を印刷したりと、基幹システムにもWebサービスを展開するにも、PDFの利用は比較的多かったりします。
今はとても便利なライブラリなどが揃っていて、簡単にPDFを出力が可能になっていますが、バージョンなどによって調整が必要だったりすることもあります。
たまたまfuelPHPで基幹システムを作成する機会があったので、fuelPHPを利用してPDFを出力する方法を記録しておきます。
PDF出力は、基本となるテンプレートPDfに情報を書き込んでいくことを想定してます。
TCPDFとFPDIの組み合わせでかなり楽に出力できるのでビックリですな。
条件
- FuelPHP 1.7
- FPDI
- TCPDF
- PDFを出力できる環境
テンプレートとなるPDFを作成できる環境(とりあえずOffice2010で出力した)
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で以下のような手順で圧縮を解除してあげておくことで、上記のようなエラーは回避できます。
- Acrobatで対象のPDFを開きます。
- 「アドバンスト」 -> 「PDFの最適化」を開きます。
- 左ペインの「最適化」を選択します。
- 右ペインの「オブジェクト圧縮オプション」を【圧縮を解除】に設定します。
- ファイルを上書き保存します。
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の出力がこんなに簡単にできるので、いろいろ出力してみたくなったりしますな。
しかしこういったライブラリを作るのって凄いよな~。