まず前回までの環境を利用していますが、こちらはそれほど環境依存は無いと思います。
今回は、fuel-pdf パッケージを利用して日本語の PDF を出力するところまで試してみました。少しでも参考になれば幸いです。
※ vagrant 内でのコマンドは、全て[vagrant]として表現しています。
はじめに
環境
- OSX 10.9.5
- Vagrant
- CentOS 6.5
- FuelPHP 1.7.2
- fuel-pdf
github
参考記事
※ PDF 出力部分はほとんど利用させていただきました。ありがとうございます。
利用フォント置き場
※ フリーフォントを利用させていただきました。ありがとうございます。
fuel-pdf パッケージの追加と設定
fuel-pdf パッケージ追加
ご自身のプロジェクト配下にある package ディレクトリへ移動し、github よりパッケージを追加します。
[vagrant]cd fuelphp/fuel/packages
[vagrant]git clone git://github.com/TJS-Technology/fuel-pdf.git pdf
pdf config ファイルの設置と設定
追加された fuelphp/fuel/packages/pdf/config/pdf.php を fuelphp/fuel/app/config 配下にコピーしてください。そしてコピーした config 内の driver を tcpdf に変更しておきます。
return array(
'default_driver' => 'tcpdf',
...
...
config.php の設定
例のごとく、fuelphp/fuel/packages/pdf/config/config.php ファイルの設定を追加します。
'packages' => array(
'orm',
'auth',
'opauth',
'pdf',
),
日本語フォントを準備
フォントのダウンロードと解凍
コチラ から利用したいフォントをダウンロードしてください。
自分は ystegakib というフォントで試してみました。
フォントファイルの設置
ダウンロードし解凍したフォントファイルを、fuelphp/fuel/packages/pdf/lib/tcpdf/fonts/ 配下にコピーしておいてください。
FuelPHP でコントローラ準備
下記ファイルを準備していきます。
- Controller
- app/classes/controller/pdf.php
<?php
class Controller_Pdf extends \Fuel\Core\Controller
{
public function action_index()
{
// テストデータ
$data = array(
array(
'hoge' => 'fugafuga - 1',
),
array(
'hoge' => 'fugafuga - 2',
),
array(
'hoge' => 'fugafuga - 3',
),
array(
'hoge' => 'fugafuga - 4',
),
array(
'hoge' => 'fugafuga - 5',
),
);
// PDF オブジェクト準備
$pdf = \Pdf\Pdf::forge('tcpdf')->init('P', 'mm', 'A4', true, 'UTF-8', false);
//PDF付加情報
$pdf->SetCreator('制作');
$pdf->SetAuthor('作者');
$pdf->SetTitle('タイトル');
$pdf->SetSubject('タイトル2');
//ヘッダーフッター情報
$pdf->setHeaderFont(Array('ystegakib', '', 14));
$pdf->setFooterFont(Array('ystegakib', '', 9));
$pdf->SetHeaderData('', '','大見出し', 'サブ見出し');
// マージンを設定する
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
// 自動ページ切り替えを設定する
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
// カラム幅 180
$w = array(50, 80, 50);
// 塗りつぶし色
$pdf->SetFillColor(224, 235, 255);
$pdf->SetTextColor(0, 0, 0);
// フォントセット
$pdf->SetFont('ystegakib', '', '12');
// 固定長フォント設定
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
// 1ページ目を準備
$pdf->AddPage();
$pdf->Cell($w[0], 7, '項目1', 'LRTB', 0, 'L', 1);
$pdf->Cell($w[1], 7, '項目2', 'LRTB', 0, 'L', 1);
$pdf->Cell($w[2], 7, '項目3', 'LRTB', 0, 'L', 1);
$pdf->Ln();
// テーブルコンテンツ部分
$fill = 0;
foreach($data as $row) {
$pdf->Cell($w[0], 6, $row['hoge'], 'LR', 0, 'L', $fill);
$pdf->Cell($w[1], 6, $row['hoge'], 'LR', 0, 'L', $fill);
$pdf->Cell($w[2], 6, $row['hoge'], 'LR', 0, 'L', $fill);
$pdf->Ln();
$fill=!$fill;
}
// 区切り
$pdf->Cell($w[0], 6, '', 'LRB', 0, 'L', $fill);
$pdf->Cell($w[1], 6, '', 'LRB', 0, 'L', $fill);
$pdf->Cell($w[2], 6, '', 'LRB', 0, 'L', $fill);
$pdf->Ln();
// トータル
$pdf->Cell($w[0], 6, '', 'LRT', 0, 'L', 1);
$pdf->Cell($w[1], 6, '単価', 'LRT', 0, 'R', 1);
$pdf->Cell($w[2], 6, '***円', 'LRT', 0, 'C', 1);
$pdf->Ln();
// 数
$pdf->Cell($w[0], 6, '', 'LR', 0, 'L', 1);
$pdf->Cell($w[1], 6, '件数', 'LR', 0, 'R', 1);
$pdf->Cell($w[2], 6, '***件', 'LR', 0, 'C', 1);
$pdf->Ln();//改行
// 合計
$pdf->Cell($w[0], 6, '', 'LR', 0, 'L', 1);
$pdf->Cell($w[1], 6, '合計', 'LR', 0, 'R', 1);
$pdf->Cell($w[2], 6, '***円 (税抜)', 'LR', 0, 'C', 1);
$pdf->Ln();//改行
// 合計
$pdf->Cell($w[0], 6, '', 'LRB', 0, 'L', 1);
$pdf->Cell($w[1], 6, '合計', 'LRB', 0, 'R', 1);
$pdf->Cell($w[2], 6, '***円 (税込)', 'LRB', 0, 'C', 1);
// 出力
$pdf->Output("output.pdf", "I");
return ;
}
}
以上で準備は完了です。
PDF出力
それでは、アクセスしてみましょう。
http://192.168.33.01/pdf (IPはvagrantの各自設定に従ってください。)
まとめ
今回は、コントローラにアクセスし、ブラウザにPDFを表示する形式でした。基本的なことはこちらで十分だと思いますので、サービスの仕様に合わせてPDFを生成し保管したり、メールで送付したりできると思います。
電子署名やデジタル署名についてはまだ調べていませんが、tcpdf や他の pdf ドライバーでそのノウハウがあれば知りたいところですね。