CakePHP3.5でPDF出力する方法を調べてみました。
出力する方法は以下のケースになるかと思います。
- HTMLを作成後、表示内容をPDF出力
- 事前に用意した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"
{
"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
<?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内に収まるようにフォントを可変にしたい