CakePHP3.5でPDF出力（TCPDF ＋ FPDI）

CakePHP3.5でPDF出力する方法を調べてみました。
出力する方法は以下のケースになるかと思います。
1. HTMLを作成後、表示内容をPDF出力
2. 事前に用意したPDFファイルを読み込み文章等を追加してPDF出力

後者の方法としては、TCPDF ＋ FPDIを組み合わせた事例が多いようです。
帳票出力したい場合には、事前にExcelやWordからPDF保存したテンプレートファイルを用意すれば、思い通りのデザインで出力しやすいと思います。

## 環境
CakePHP3.5
Vagrant
CentOS
Mac OSX

## 手順
### 1. テンプレート用のPDFを用意
ExcelでもWordでも構いませんので、適当にデザインした帳票をPDF保存します。
無地の状態でも構いません。
とりあえず、`seikyu.pdf`というファイル名で保存しましょう。
### 2. composer
composerを使ってTCPDFとFPDIをインストールします。
まずは、CakePHPのプロジェクトフォルダ直下にある`composer.json`を開き、require内に以下の3点を追加して上書き保存します。

- `"tecnick.com/tcpdf": "*"`
- `"setasign/fpdi": "^2.0"`
- `"setasign/fpdi-tcpdf": "^2.0"`

```myapp¥composer.json
{
    "name": "cakephp/app",
    "description": "CakePHP skeleton app",
    "homepage": "http://cakephp.org",
    "type": "project",
    "license": "MIT",
    "require": {
        "php": ">=5.6",
        "cakephp/cakephp": "3.5.*",
        "mobiledetect/mobiledetectlib": "2.*",
        "cakephp/migrations": "~1.0",
        "cakephp/plugin-installer": "~1.0",
        "tecnick.com/tcpdf": "*",
        "setasign/fpdi": "^2.0",
        "setasign/fpdi-tcpdf": "^2.0"
    },
〜以下割愛〜
```

保存したら、コマンドラインでプロジェクトフォルダに移動してから`composer update` を実行します。
ちなみ私の場合は、ここで苦戦しまして、以下のようにパスを書いたらアップデート出来ました。
例）myapp というプロジェクトの場合

```コマンド.
[vagrant@localhost myapp]$ /home/vagrant/cakephp_lessons/composer.phar update
```

### 3. テンプレートファイルを配置
1.で作成したPDFファイル`seikyu.pdf`をwebrootフォルダにアップします。
今回は、webrootフォルダにpdfフォルダを作成して、その中にPDFを入れます。
¥myapp
　└ ¥webroot
　　　└ ¥pdf
　　　　　└ seikyu.pdf

### 4. Controllerの作成
ControllerのみでPDF作成出来ます。
テンプレートは特に必要ありません。
Controllerを作成後、以下の様なアドレスを開くとPDF出力出来ます。
http://localhost/myapp/tests/pdf

```TestsController.php
<?php
namespace App\Controller;

use App\Controller\AppController;
use setasign\Fpdi;     //追加

class TestsController extends AppController
{
    public function pdf()
    {
        $this->RequestHandler->respondAs('application/pdf');  // 修正※
        $pdf = new Fpdi\TcpdfFpdi();
        mb_internal_encoding('UTF-8');

        // テンプレートファイルを指定
        // WWW_ROOT. で繋げるとwebrootを参照出来ます。
        $pdf->setSourceFile(WWW_ROOT."pdf/seikyu.pdf"); 

       // PDFの余白(上左右)を設定 
        $pdf->SetMargins(0, 0, 0); 

        // ヘッダーの出力を無効化 
        $pdf->setPrintHeader(false); 

        // フッターの出力を無効化 
        $pdf->setPrintFooter(false); 

        // ページを追加 
        $pdf->AddPage(); 
        $index = $pdf->importPage(1); 
        $pdf->useTemplate($index, 0, 0); 

        //日本語フォント 
        $pdf->SetFont('kozminproregular','',9);  

        // X : 42mm / Y : 108mm の位置に 
        $pdf->SetXY(42, 108); 

        //文字列を出力  
        $pdf->Text(75, 36.5, 'てきすと');

        // 改行
        $pdf->Ln();

        // セルで文字出力
        $pdf->Cell(13, 5, "セルてきすと", 1, 0, 'R');

        // セル内に収まるようにフォントサイズを変更
        $pdf->MultiCell(35, 2, 'あいうえおカキクケコさしすせそ',1,'L',0,0, '', '', true, 0, false, true, 8, 0, true);

        // フォントカラー
        $pdf->SetTextColor(0, 191, 255);        
        $pdf->Cell(13, 10, "ニャー", 1, 0, 'L');

        // PDF出力
        $pdf->Output();

        // PDFダウンロードする場合は引数を以下の様にする
        // $pdf->Output('sample.pdf', 'D');
    }    
}

```

## 参考サイト
[Cakephp3 + TCPDF でpdf作成](https://qiita.com/uedatakeshi/items/6f6fd8a612ca5c7a18c3)
[PHPでPDF帳票を出力する方法（TCPDF + FPDI）](https://qiita.com/emegane/items/486975a79ebb267c2b8e)
[FPDFを使ったPDF作成](https://www.phpbook.jp/fpdf/)
[CakePhp 3.x, TCPDF, htmlspecialchars](https://stackoverflow.com/questions/34995422/cakephp-3-x-tcpdf-htmlspecialchars)
[tcpdfでCELL内に収まるようにフォントを可変にしたい](http://shigememo.seesaa.net/article/101456390.html)