43
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

railsでwicked_pdfの使い方

Last updated at Posted at 2018-01-23

Gemインストール

pdfを作成するためのgemをrailsに入れる

Gemfile
gem 'wicked_pdf'
gem 'wkhtmltopdf-binary'

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

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

バイナリについてのわかりやすいページ
ラッパーについてのわかりやすいページ
wicked_pdf gem's page
wkhtmltopdf official page

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

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

次にinitializerを作ります

$ rails generate wicked_pdf

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

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

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

$ which wkhtmltoodf

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

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

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

基本的な使い方

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

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

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

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ページ

注意点

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の公式ページに乗っているので(advanced usageのとこ)、そこを参考にすれば大丈夫です。

デバッグ

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

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で出力されてデバッグすることができるようになります。

43
33
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
43
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?