Edited at

FuelPHP の fuel-pdf パッケージを利用し日本語の PDF を生成する

More than 3 years have passed since last update.

まず前回までの環境を利用していますが、こちらはそれほど環境依存は無いと思います。

今回は、fuel-pdf パッケージを利用して日本語の PDF を出力するところまで試してみました。少しでも参考になれば幸いです。

※ vagrant 内でのコマンドは、全て[vagrant]として表現しています。


はじめに


環境


  • OSX 10.9.5

  • Vagrant

  • CentOS 6.5

  • FuelPHP 1.7.2

  • fuel-pdf


github

https://github.com/fuel-packages/fuel-pdf


参考記事

[fuelPHP]TCPDFでPDFを出力する

※ PDF 出力部分はほとんど利用させていただきました。ありがとうございます。


利用フォント置き場

PHP+TCPDFの日本語フリーフォントを一覧比較

※ フリーフォントを利用させていただきました。ありがとうございます。


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 に変更しておきます。


fuelphp/fuel/app/config/pdf.php

return array(

'default_driver' => 'tcpdf',
...
...


config.php の設定

例のごとく、fuelphp/fuel/packages/pdf/config/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




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 の生成が終れば無事、ブラウザに表示されるはずです。

kobito.1417655866.122985.png


まとめ

今回は、コントローラにアクセスし、ブラウザにPDFを表示する形式でした。基本的なことはこちらで十分だと思いますので、サービスの仕様に合わせてPDFを生成し保管したり、メールで送付したりできると思います。

電子署名やデジタル署名についてはまだ調べていませんが、tcpdf や他の pdf ドライバーでそのノウハウがあれば知りたいところですね。