Gemインストール
pdfを作成するためのgemをrailsに入れる
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系の環境では不要でした。
Mime::Type.register "application/pdf", :pdf
次にinitializerを作ります
$ rails generate wicked_pdf
すると設定ファイルができるので、pdfに変換するコマンドのパスを指定します。
WickedPdf.config = {
exe_path: '/usr/local/bin/wkhtmltopdf'
}
と書けとgem公式ページには書いてあります。
wkhtmltopdf
の場所はシェル上で
$ which wkhtmltoodf
と打つことで、表示されます。
が、これはもちろんローカル環境でしか動かないので、より包括的な書き方は
WickedPdf.config = {
:exe_path => "#{Gem.loaded_specs['wkhtmltopdf-binary'].full_gem_path}/bin/wkhtmltopdf"
}
となります。要するにこっちにしましょう。
基本的な使い方
まずはpdf用のroutingを設定します。
get 'things/show', to: 'things#show'
次にコントローラー側でformat形式によって処理を分離させて、pdf用の処理とhtml用の処理を作っておきます。
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ページ
注意点
<!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で出力してデバッグするやり方が用意されています。
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で出力されてデバッグすることができるようになります。