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

まず[前回](http://qiita.com/hmukaida/items/4020a30f9ee651e688b8)までの環境を利用していますが、こちらはそれほど環境依存は無いと思います。
今回は、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を出力する](http://gerolian.xyz/2014/08/05/1343/)

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

### 利用フォント置き場

[PHP+TCPDFの日本語フリーフォントを一覧比較](http://www.monzen.org/Refdoc/tcpdf_freefontj/)

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

## 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',
),
```

## 日本語フォントを準備
### フォントのダウンロードと解凍
[コチラ](http://www.monzen.org/Refdoc/tcpdf_freefontj/) から利用したいフォントをダウンロードしてください。
自分は 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](https://qiita-image-store.s3.amazonaws.com/0/39380/bd26bbb5-9414-05a5-4785-01e03fa0e14e.png "kobito.1417655866.122985.png")

## まとめ

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

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