railsでwicked_pdfの使い方

## Gemインストール
pdfを作成するためのgemをrailsに入れる

```ruby:Gemfile
gem 'wicked_pdf'
gem 'wkhtmltopdf-binary'
```

```wkhtmltopdf``` というオープンソースのコマンドラインツールでhtmlをpdfに変換することができます。それのバイナリをrailsにインストールすることができるのが、 ```wkhtmltopdf-binary``` というgemです。

しかしそのままではrails内で ```wkhtmltopdf``` を使うことはできません。
ラッパーが必要です。そのラッパーに当たるのが ``` wicked_pdf ``` gemです。

[バイナリについてのわかりやすいページ](http://wa3.i-3-i.info/word14226.html)
[ラッパーについてのわかりやすいページ](http://wa3.i-3-i.info/word191.html)
[wicked_pdf gem's page](https://github.com/mileszs/wicked_pdf)
[wkhtmltopdf official page](https://wkhtmltopdf.org/)

railsの古いバージョンを使っているならこれを付け加える必要があるそう。
私のrails5.1系の環境では不要でした。

```ruby:config/initializers/mime_types.rb
Mime::Type.register "application/pdf", :pdf
```

次にinitializerを作ります

```shell
$ rails generate wicked_pdf
```

すると設定ファイルができるので、pdfに変換するコマンドのパスを指定します。

```ruby:config/initializers/mime_types.rb
WickedPdf.config = {
  exe_path: '/usr/local/bin/wkhtmltopdf'
}
```

と書けとgem公式ページには書いてあります。
```wkhtmltopdf``` の場所はシェル上で

```
$ which wkhtmltoodf
```

と打つことで、表示されます。
が、これはもちろんローカル環境でしか動かないので、より包括的な書き方は

```ruby:config/initializers/mime_types.rb
WickedPdf.config = {
  :exe_path => "#{Gem.loaded_specs['wkhtmltopdf-binary'].full_gem_path}/bin/wkhtmltopdf"
}
```

となります。要するにこっちにしましょう。

## 基本的な使い方

まずはpdf用のroutingを設定します。

```ruby:routes.rb
  get 'things/show', to: 'things#show'
```

次にコントローラー側でformat形式によって処理を分離させて、pdf用の処理とhtml用の処理を作っておきます。

```ruby:controller.rb
class ThingsController < ApplicationController
  def show
    respond_to do |format|
      format.html
      format.pdf do
        render pdf: 'file_name', #pdfファイルの名前。これがないとエラーが出ます
               layout: 'pdf_layouts.html', #レイアウトファイルの指定。views/layoutsが読まれます。
               template: 'things/show' #テンプレートファイルの指定。viewsフォルダが読み込まれます。
      end
    end
  end
end
```

このように書くことで例えば ```things/show.html``` と叩けばhtmlで出力するし、 ```things/show.pdf``` と叩けばpdfで出力してくれる。

これで ```things/show.pdf``` が叩かれた時に、 ```views/show.html``` が読み込まれて、そのhtmlをpdfに変換してくれる。

[formatについてのわかりやすいstack overflowページ](https://stackoverflow.com/questions/20320263/what-does-format-mean-in-rake-routes)

### 注意点

```html+erb:layouts/pdf.html.erb
<!doctype html>
<html>
  <head>
    <meta charset='utf-8' />
    <%= wicked_pdf_stylesheet_link_tag "pdf" -%>
    <%= wicked_pdf_javascript_include_tag "number_pages" %>
  </head>
  <body onload='number_pages'>
    <div id="header">
      <%= wicked_pdf_image_tag 'mysite.jpg' %>
    </div>
    <div id="content">
      <%= yield %>
    </div>
  </body>
</html>
```

```yield``` と書いた部分がテンプレートファイルとして指定したファイルに置き換わる

とpdfに変換する用のhtmlに基本的な設定などを記述するのですが、注意点があります。
 **アセットファイルへのパスの指定に気をつけてください。**

具体的には

|  | もともと | wkhtmltopdf |
|:-----------|:------------|:------------|
| cssファイル     |   stylesheet_link_tag |    wicked_pdf_stylesheet_link_tag    |
| jsファイル     |   javascript_include_tag|   wicked_pdf_javascript_include_tag  |
| iamgeファイル  |    image_tag |    wicked_pdf_image_tag     |

と置き換えてください。
アセットファイルを読み込まないときは、いつも通りのパスの指定の仕方で大丈夫です。

基本的にはこれだけでhtmlをpdfに変換することができます。
他の様々なオプションに関しては[wicked_pdf gemの公式ページ](https://github.com/mileszs/wicked_pdf)に乗っているので(advanced usageのとこ)、そこを参考にすれば大丈夫です。

### デバッグ

「pdfに変換したはいいものの、レイアウトが崩れている・・」なんて時があると思います。
そんな時にpdfのままデバッグするのってめんどさいので、htmlで出力してデバッグするやり方が用意されています。

```ruby:controller.rb
  def pdf
    respond_to do |format|
      format.html { redirect_to action: :pdf, format: :pdf, debug: true }
      format.pdf do
        render pdf: 'pdf',
               layout: 'pdflayouts.html.slim',
               template: '/things/show.html.slim',
               encording: 'UTF-8',
               show_as_html: params.key?('debug')
      end
    end
  end
```
と書くことで、pdf生成用のurlをhtmlフォーマットで呼び出した時に、pdfがhtmlで出力されてデバッグすることができるようになります。