Thinreportsでらくらく帳票作成


#### Thinreportsの特徴
1. Thinreports用のテンプレートを作成、比較的癖がある
2. RailsでPDFに値を格納する、テーブルカラムの設定があると動的に良い感じ行を追加してくれる
3. バイナリファイルを添付して送信
4. 国内産のライブラリのため日本語の対応も心配がない([@thinreports_org](https://twitter.com/thinreports_org)にメンションを送ると回答が来る)

テンプレート作成には癖があるが、wicked_pdfでHTMLやCSSを書いて作るよりずっと楽

## Thinreports Editor インストール

Chromeの拡張機能で出力する帳票のPDFのテンプレートを作成する
インストール方法は下記URLのドキュメント「ChromeApp 版」の項を参照のこと
http://www.thinreports.org/documentation/ja/getting-started/installation.html

## Thinreports 簡単な使い方の例

#### 公式のクイックスタート

http://www.thinreports.org/documentation/ja/getting-started/quickstart.html

#### ブログ記事

http://ruby-rails.hatenadiary.com/entry/20140909/1410241835

## 帳票の作成の仕方のコツ

Thinreports Editor を起動すると下のような画面が表示される

<img width="1489" alt="2015-12-10 18 17 32" src="https://cloud.githubusercontent.com/assets/1217706/11760095/ac31250e-a0d0-11e5-9f85-e89cda98bdcf.png">

左側のリストをクリックし、パワーポイントのオブジェクトを操作する間隔で四角や、文字、画像を追加することが出来る。

### 画面左側要素
重要なものをいくつか説明していきます

* 一番上の矢印
	* 各オブジェクト選択しプロパティの設定
* 上から2番目の四角
	* 四角のオブジェクト、塗りつぶしなどを行う。
* 上から6番目A
	* 固定文字入力オブジェクト
	* Thinreportsは四角のオブジェクトなどそのものに文字を入力できないので、形のオブジェクトの上に、この固定文字入力オブジェクトを置くと、文字の乗った四角を表現できる
* 上から7番目の画像っぽいアイコン
	* 画像入力オブジェクト
	* 固定画像を挿入できる、バイナリで追加できるのでRailsオブジェクトにパスを渡す必要はない

* 上から8番目枠で囲ったA(以降　囲みA)
	* コードから文字を入力するオブジェクト
	* オブジェクトにIDを指定して、コードでIDを指定することにより対象箇所に文字が入力される
* 一番下　テーブルオブジェクト
	* テーブル作成できる、リスト表示したいN行のデータを表示するときに利用すると良い
	* header, detail, footerで項目を設定する


### 画面右側要素

<img width="126" alt="2015-12-10 8 52 50" src="https://cloud.githubusercontent.com/assets/1217706/11760099/c46cce0c-a0d0-11e5-968c-40cd9b025d2d.png">

フォント種類や、フォントサイズ、文字位置などを変更できる

<img width="337" alt="2015-12-10 9 35 07" src="https://cloud.githubusercontent.com/assets/1217706/11760098/bd689d0c-a0d0-11e5-8946-f0920f9afb57.png">


##### テーブルオブジェクトをクリックした場合

テーブルオブジェクトをクリックした場合に、ヘッダーやフッターを表示・非表示を制御する
自動改ページのチェックを外すと、テーブルの行が１ページをはみ出た場合にそれ以降表を作ってくれなくなるので注意が必要

<img width="329" alt="2015-12-10 8 28 27" src="https://cloud.githubusercontent.com/assets/1217706/11760100/c982615e-a0d0-11e5-8c46-e3e151295e17.png">


### 画面上部

オブジェクトの整列や、オブジェクトの表示位置を前に・後ろに設定することが出来るメニューが有る
<img width="915" alt="2015-12-12 15 30 42" src="https://cloud.githubusercontent.com/assets/1217706/11760641/6f63e372-a0e5-11e5-9abf-fbc4da1c15f8.png">

### オブジェクトの整列、サイズ調整方法

#### 複数オブジェクトの選択方法
MacのChromeを利用した場合は
Shift + Cmd + クリック　で複数オブジェクトを選択することが出来る
※ windowsの場合は把握してません

複数のオブジェクトを設定したら、画面上の整列で位置を揃えたり、サイズ調整をすることが出来きます

<img width="202" alt="2015-12-12 15 30 48" src="https://cloud.githubusercontent.com/assets/1217706/11760640/6f635aba-a0e5-11e5-954e-16f5bb7b7ff3.png">

オブジェクトを前面に出したい場合などは「前面に移動」を選択する
<img width="202" alt="2015-12-12 15 30 58" src="https://cloud.githubusercontent.com/assets/1217706/11760639/6f62b3da-a0e5-11e5-9dbf-a845b4cc1509.png">


### テーブル作成時にのバッドノウハウ

Thinreportsは外枠や各セルの枠をHTMLのように設定することは出来ない。
各セルを並べてあたかも枠の設定しているように見せる必要がある

1. ワクを囲むために四角のオブジェクトをheaderとdeatilに設定する

2. セルの内容を表示するオブジェクトを設定する、headerには固定文字列のオブジェクト、detailにはrailsで変更可能なオブジェクトを設置する

1, 2の順番で作らないと表示順の関係で設定が面倒くさくなる

### 別レイアウト設定方法

レイアウトファイルは、1つのPDFに複数のレイアウトファイルを設定することが出来る
新規ページ作成メソッド時の引数にlayoutを設定すれば実現可能

--------------------------------

## サンプルコード

Routing設定

```routes.rb
  resources :pdfs, only: [index] do
    collection do
      get :output
    end
  end
```

Viewの設定

app/views/index.html.erb

```index.html.erb
# /pdfs/output　へのパス
<%= link_to "PDF送信", output_pdfs_path %>
```


Controllerの設定

```pdfs_controller.rb
class PdfsController < ApplicationController
  def index
  end

  def output
    # ThinreportsでPDFを作成
    # Editorで作ったtlfファイルを読み込む
    report = ThinReports::Report.new(layout: "#{Rails.root}/app/pdfs/table.tlf")

    # 1ページ目
    report.start_new_page
    report.page.item(:title).value("ドキュメントタイトル")

    # テーブルの値を設定
    # list メソッドテーブルの行に値を入れる
    # 表のIDを設定する(デフォルトのID値: default)
    # add_row で列を追加できる
    array = 20.times.map{|i| i}
    #　20行表示する
    array.each do |item|
      report.list(:default).add_row do |row|
      	 # 列の値を入れる
        row.values(id:item, name: "name #{item}")
      end
    end
    # ブロック内のrow.valuesで値を設定する
    # テーブルが1ページを超えた場合は、2ページ目3ぺージ目に追記される

    # 2ページ目　同じ帳票で表示項目を作りたい場合は、start_new_pageする
    report.start_new_page
    report.page.item(:title).value("ドキュメントタイトル2")

    # 3 ページ目
    # 別のレイアウトを適用させる
    report.start_new_page layout: "#{Rails.root}/app/pdfs/page.tlf"
    report.page.item(:text).value("テキストをRailsから入力")

    # PDFファイルのバイナリデータを生成する
    file = report.generate


    # ブラウザでPDFを表示させたい場合
    # パラメタのdisposition: "inline" をつけない場合は、PDFがダウンロードされる
    send_data(
      file,
      filename: "filename_sample.pdf",
      type: "application/pdf",
      disposition: "inline")
  end
end

```

### バイナリの添付方法 email
Thinreportsのチュートリアルのとおりに使うと、画面表示する作業しかないが
生成したPDFのバイナリデータを
Amazon S3においたり、オンラインバッチで生成したり、メールで添付することも可能

```
# PDFファイルのバイナリデータを生成する
file = report.generate
```