【Laravel】HTMLページをPDF化してダウンロード(TCPDF使用)
Laravelを用いてPDF化したかったのですがパッケージがとても優秀だった。
レイアウトが中身により変動するため、HTMLのページを作成しそれをPDF化することとします。
(そのためFPDIは使用していません。)
環境
Laravel5.5
PHP7.2
TCPDFをインストール
※ 参考
公式Github:GitHub - tecnickcom/TCPDF: Official clone of PHP library to generate PDF documents and barcodes
tecnick.com/tcpdf - Packagist
念の為Packagistを確認すると、2018年2月時点で6.2.17が最新だそうです。
なので、composer.jsonのrecuire配下に下記を書き込む
"tecnickcom/tcpdf": "6.2.*"
そのあとインストールする。
composer update
もちろんcomposer require~でも大丈夫です
Package manifest generated successfully.
とででくればインストール完了です!
TCPDFでPDF化
ルーティング
コントローラでこの後実装するメソッドへのルーティングを作成します。
route/web.php
<?php /* PDF TEST */ Route::get('/pdf/test', 'DocumentController@downloadPdf');
PDF化するためのHTMLページ作成
次に、HTMLページで描画したあとPDF化したいので、HTMLページを事前準備します。
結構適当で大丈夫ですが、今回日本語、変数のテストをしたかったので
下記で作成してみました。
/resources/views/document/pdf.blade.php
<!doctype html> <html lang="{{ config('app.locale') }}"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>PDF TEST</title> </head> <body> <p>あいうえお漢字</p><br> <p>Hello, {{ $name }}</p> </body> </html>
PDF化機能の実装
/Controllers/DocumentController.php
<?php namespace App\Http\Controllers; use TCPDF; class DocumentController extends Controller { private $pdf; // インスタンス変数を宣言 public function __construct(TCPDF $pdf) { // コンストラクタインジェクションでTCPDFクラスをインスタンス化 $this->pdf = $pdf; } public function downloadPdf() { // フォント、スタイル、サイズ をセット $this->pdf->setFont('kozminproregular','',10); // ページを追加 $this->pdf->addPage(); // HTMLを描画、viewの指定と変数代入 $this->pdf->writeHTML(view("document.pdf", ['name' => 'PDFさん'])->render()); // 出力の指定です、ファイル名、拡張子、Dはダウンロードを意味します。 $this->pdf->output('test' . '.pdf', 'D'); return; } }
ここまでくれば実装完了です。
使ってみる
php artisan serveでサーバを起動し、ルーティングで指定した
ルートへアクセスしてみます。http://127.0.0.1:8000/pdf/test'
問題なければ、PDF化したシートがダウンロードできるはずです。
できました!
CSSでの装飾は結構制限かかってるそうですが、
それ以外は最高に手軽ですね。。。
ありがとうTCPDF様、感謝しかない。。。
以上