Help us understand the problem. What is going on with this article?

Laravel5でPDF出力 [Thinreports編]

More than 1 year has passed since last update.

はじめに

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以下をダウンロードしましょう.

thinreports-editor

次に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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away