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 ファイルが本当に作成されているか等を確認してみてください。