wicked_pdf を Rails アプリケーションで使うまで
html から簡単に PDF が作れる便利なプラグインですが、割と面倒な行程が必要だったのでメモ。Rails 4.1 で確認しました。
インストール
Gemfile で以下のように記述します。
gem 'wkhtmltopdf-binary' gem 'wicked_pdf'
が、環境によってはこれでは動作しません。具体的に言うとコンソールで
wkhtmltopdf
と叩いてパスが通っていないなら動作しません。
この場合、自分で wkhtmltopdf をインストールした後 config/initializers に wicked_pdf.rb というファイルを作成し、環境にあわせて実行パスをフルパスで設定します。
WickedPdf.config = { :wkhtmltopdf => '/path/to/wkhtmltopdf' }
2014-09-25 追記
上記の設定では、追記現在の最新版では正しく動作しません。
以下のように書き換えてください。
WickedPdf.config = { :exe_path => '/path/to/wkhtmltopdf' }
PDF を表示する
wicked_pdf を使うと Rails の render で :pdf が指定可能になります。
routes.rb で
resources :items
と指定されているとして items_controller の show メソッドを編集します。
def show @item = Item.find(params[:id]) respond_to do |f| f.html f.pdf do render pdf: @item.title, encoding: 'UTF-8', layout: 'pdf.html' end end end
このように指定すると @item.title が PDF のタイトルとして使われます。また encoding オプションは日本語を使いたい場合、レイアウトの指定は PDF の作成時に使うレイアウトを変えたい場合に必要となるので、事実上必須と言っていいでしょう。
あとは http://localhost/items/1.pdf のようにアクセスすると PDF が表示されるはずです(この段階でエラーになる場合、上記インストール部分を再度確認してください)。
レイアウトや CSS を正しく反映させる
レイアウトファイルについては以下のようなテンプレートを使います。これは erb ですが haml の場合も同じように指定してください。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <%= wicked_pdf_stylesheet_link_tag 'pdf' %> </head> <body> <%= yield %> </body> </html>
wicked_pdf_stylesheet_link_tag を使うのがポイントで、ここで指定した pdf.css を使うようになります。
大体の場合においてブラウザで表示するレイアウトや CSS と PDF にする CSS は別にしたいと考えるはずですが、その場合は app/assets/stylesheets 以下に pdf などのディレクトリを作成し config/environments/production.rb で
config.assets.precompile += %w( pdf/pdf.css )
のようにプリコンパイルさせるファイルを追加して
<%= wicked_pdf_stylesheet_link_tag 'pdf/pdf' %>
と指定すれば問題ありません。
背景の画像を表示する
CSS の background で指定した画像を表示させるのも素直にはいきません。
まず、先ほどのコントローラーを修正します。
def show @item = Item.find(params[:id]) respond_to do |f| f.html f.pdf do render pdf: @item.title, encoding: 'UTF-8', layout: 'pdf.html', , no_background: false end end end
no_background: false を追加していますが、これを指定しないと何をしても背景画像は表示されません。
次に、公式フォーラムによるとバージョンによっては jpg 以外の画像は表示されないようです(私が試した限りでは png も表示されましたが…)。特に問題がないのであれば、念のため jpg にしておいた方がいいでしょう。
最後に CSS の内部で background を指定する箇所ですが app/assets/stylesheets/pdf/pdf.css を pdf.css.erb にリネームした上で、次のように指定しました。
background: url(<%= Rails.root.join('public', 'images', 'hoge.jpg') %>) right center no-repeat;
ここだけは内部のパス、それもフルパスで指定しないと wkhtmltopdf が読めないのでしょうか。ともあれ、これで画像も表示されるはずです。
なお Rails 4.1 では pdf.css.erb と名前をつけたファイルについても config/environments/production.rb で
config.assets.precompile += %w( pdf/pdf.css )
と指定すればプリコンパイルの対象としてくれるようでした。動作がおかしい場合 public/assets 以下を確認し、対象の CSS ファイルが本当に作成されているか等を確認してみてください。