はじめに
LaravelでPDFを出力するには様々な方法があります.
一番メジャーなのはTCPDFとFPDIを組み合わせた形式ではあると思います(参考).
他にもBladeを利用したPDF出力もあり,自分の環境に適した形で実装するのが一番でしょう(参考).
本題
そんな中でも今回は Thinreports を利用したPDF出力を紹介します.
Thinreportsについてはこちら
ざっくり言えば,自分でPDF出力のための雛形を作って,そこに値をはめ込んでいくライブラリです.PDFテンプレートを用意する必要もなく,自分で雛形を作れるので私は愛用しています.
ただ,Thinreports は Ruby on Railsの gem として開発されたもので,PHPに対応したのは最近になります.
なのでまだまだ発展途上です.
しかし,それでも十分に使えるので紹介していきます.
導入
Thinreports はChromeの拡張機能を利用したEditorで雛形を作成します.
Editorは以下でダウンロードして解凍してください.
本家ではバージョンが0.91まで出ていますが,0.90以降は,現時点では仕様上まだ対応していません.
PHPの場合は0.82以下をダウンロードしましょう.
次にcomposerで thinreports-php をインストール
$ composer require thinreports-php/thinreports-php
使い方
PDFを出力する際にはデータを利用することになるので,Laravelを利用する際にはController, Model, または独自で作成したクラスで行うことになるでしょう.
今回は利用方法を示すだけなので全てControllerに書くこととします.書き方を理解すればいくらでも応用が効くでしょう.
- ファイル作成
まず,適当なディレクトリ(ここでは app/)に雛形ファイルを入れるディレクトリ(ここでは Reports/)を作成しましょう.
次にThinreports Editorを起動し,雛形ファイルを作ります.
※過去のバージョンのEditor起動方法はここに記載されています.
雛形ファイルの作り方はここに書いてあります.
- 保存
作成が終了したら, app/Reports/ にファイルを保存します.
- 表示
次にControllerで雛形ファイルを読み込み,ブラウザに表示します.
<?php
namespace App\Http\Controllers\PDFController;
use Thinreports;
public function show($id){
// data取得
$data = Test::find($id);
// パス
$path = app_path('Reports/ledger_individual.tlf');
// 雛形ファイル読み込み
$report = new Thinreports\Report($path);
// ページ作成
$page = $report->addPage();
// ブラウザへ表示
return \Response::make($this->report->generate(), 200, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => "inline; filename=test.pdf"
]);
}
ページ読み込み時に変数に対して操作する際には, addPage()を呼んで返されたオブジェクトに対して各種メソッドを呼びます.
/* 基本操作 */
# 1st page
$page = $report->addPage(); // 1ページ目
$page->item('hello_world')->setValue('Hello World'); // 1ページ目のhello_world変数に対する操作
# 2nd page
$page = $report->addPage(); // 2ページ目
$page('hello_world')->setValue('Hello Thinreports')
->setStyle('color', '#ff0000'); // 2ページ目のhello_world変数に対する操作
# 生成
$page->generate('test.pdf');
/* オブジェクト操作 */
// オブジェクトの表示・非表示
$page->item('any_object')->hide();
$page->item('any_object')->show();
$page->item('any_object')->setVisible(true);
// 四角形, 楕円形, 線形
$page->item('any_object')->setStyle('border_width', 1)
->setStyle('border_color', '#0000ff')
->setStyle('fill_color', '#ff0000')
// テキスト, テキストブロック
$page->item('any_object')->setStyles(array(
'color' => 'blue',
'align' => 'center', // left, center, right
'valign' => 'bottom' // top, center, bottom
'font_size' => 20,
'bold' => true,
'italic' => false,
'linethrough' => true,
'underline' => false
));
// アイテムに対してまとめて値を設定
$page()->setItemValues([
'hello' => 'ようこそ',
'world' => 'World',
'sekai' => '世界',
]);
/* 複数レイアウトの組み合わせ */
# 内容のレイアウト body.tlf をデフォルトレイアウトとして指定
$report = new Thinreports\Report('body.tlf');
# 表紙のレイアウト cover.tlf でページを作成
$cover = $report->addPage('cover.tlf');
$cover('title')->setValue('Title');
# 内容のレイアウト body.tlf でページを作成
# `#addPage` の第一引数を省略した場合は、デフォルトレイアウトでページを作成する
$body = $report->addPage();
$body('content')->setValue('何かの内容');
$report->generate('result.pdf');
以上!!
参考
Thinreports for PHP を使って PHP7 で帳票や PDF を作る
Thinreports for PHP
Hello Thinreports for PHP