Laravel5でPDF出力 [Thinreports編]

## はじめに

LaravelでPDFを出力するには様々な方法があります．
一番メジャーなのはTCPDFとFPDIを組み合わせた形式ではあると思います([参考](http://cly7796.net/wp/php/to-create-a-pdf-with-laravel/))．

他にもBladeを利用したPDF出力もあり，自分の環境に適した形で実装するのが一番でしょう([参考](http://qiita.com/mu_sette/items/1346bb47ec19fac266b3))．

## 本題

そんな中でも今回は Thinreports を利用したPDF出力を紹介します．
Thinreportsについては[こちら](https://thinreports-php.github.io/)

ざっくり言えば，自分でPDF出力のための雛形を作って，そこに値をはめ込んでいくライブラリです．PDFテンプレートを用意する必要もなく，自分で雛形を作れるので私は愛用しています．

ただ，Thinreports は Ruby on Railsの gem　として開発されたもので，PHPに対応したのは最近になります．
なのでまだまだ発展途上です．

しかし，それでも十分に使えるので紹介していきます．

## 導入

### Thinreports はChromeの拡張機能を利用したEditorで雛形を作成します．

Editorは以下でダウンロードして解凍してください．
本家ではバージョンが0.91まで出ていますが，0.90以降は，現時点では仕様上まだ対応していません．
PHPの場合は0.82以下をダウンロードしましょう．

[thinreports-editor](https://github.com/thinreports/thinreports-editor/releases/tag/0.8.2)


次にcomposerで [thinreports-php](https://github.com/thinreports-php/thinreports-php) をインストール

```
$ composer require thinreports-php/thinreports-php
```

## 使い方


PDFを出力する際にはデータを利用することになるので，Laravelを利用する際にはController, Model, または独自で作成したクラスで行うことになるでしょう．
今回は利用方法を示すだけなので全てControllerに書くこととします．書き方を理解すればいくらでも応用が効くでしょう．

- ファイル作成

まず，適当なディレクトリ（ここでは app/）に雛形ファイルを入れるディレクトリ(ここでは Reports/)を作成しましょう．

次にThinreports Editorを起動し，雛形ファイルを作ります．
※過去のバージョンのEditor起動方法は[ここ](http://www.thinreports.org/documentation/ja/getting-started/installation.html)に記載されています．

雛形ファイルの作り方は[ここ](http://www.thinreports.org/documentation/ja/getting-started/quickstart.html)に書いてあります．

- 保存

作成が終了したら， app/Reports/ にファイルを保存します．

- 表示

次にControllerで雛形ファイルを読み込み，ブラウザに表示します．

```php
<?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()を呼んで返されたオブジェクトに対して各種メソッドを呼びます．

```php

/* 基本操作 */
# 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 を作る](http://hidakatsuya.hateblo.jp/entry/2015/12/21/024315)
[Thinreports for PHP](https://thinreports-php.github.io/)
[Hello Thinreports for PHP](http://www.thinreports.org/news/2015/06/hello-thinreports-for-php/)