LoginSignup
16
24

More than 3 years have passed since last update.

CakePHP3.5でPDF出力(TCPDF + FPDI)

Last updated at Posted at 2017-11-18

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作成
PHPでPDF帳票を出力する方法(TCPDF + FPDI)
FPDFを使ったPDF作成
CakePhp 3.x, TCPDF, htmlspecialchars
tcpdfでCELL内に収まるようにフォントを可変にしたい

16
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
24