Railsでwickedpdfを使ってPDF出力する

公開日:2016/01/10 更新日:2016/01/10
Railsでwickedpdfを使ってPDF出力するのサムネイル

はじめに

Ruby on RailsでPDF出力させるのに便利なgemはたくさんありますが、htmlをそのままPDF化してくれる「wickedpdf」が一番お手軽で楽でした。wickedpdfの導入手順と使用方法をメモします。基本的な手順は下記の公式サイト通りでOKでした。

mileszs/wicked_pdf | GitHub

環境と前提

  • Rails 4.2.0
  • Ruby 2.2.2

wickedpdfのインストールと準備

まずはじめに以下をGemfileに追記して

Gemfile
gem 'wicked_pdf'
gem 'wkhtmltopdf-binary'

bundleでインストールします。

$ bundle

そして以下コマンドでwickedpdfの設定ファイルを生成します。

$ rails generate wicked_pdf

これでconfig/initializer/wicked_pdf.rbが生成されます。このファイルは下記のようになっています。

config/initializer/wicked_pdf.rb
WickedPdf.config = {
  exe_path: '/usr/local/bin/wkhtmltopdf'
}

上記の中の「exe_path:」の後に続く部分「/usr/local/bin/wkhtmltopdf」を各環境のwkhtmltopdfのパスに合わせて修正します。 なお、各環境のwkhtmltopdfのパスは下記コマンドで確認できます。下記コマンド結果を「/usr/local/bin/wkhtmltopdf」と置き換えて下さい。

$ which  wkhtmltopdf

これでwickedpdfのインストールと準備は完了です。

Controllerの編集

続いてPDF出力をしたいControllerを修正します。例えば、顧客情報を扱うようなWebアプリを想定して、customer_controllerにてshowアクションを以下のように修正します。

app/controller/customers_controller.rb
def show

    @customer = Customer.find(params[:id])

    # for create PDF
    respond_to do |format|
      format.html
      format.pdf do
        render pdf:          "pdffile",                        # ".pdf"拡張子は不要
               footer:       {   html: {   template: 'customers/footer.html.erb' } }, # footer用のテンプレートファイル指定
               show_as_html: params[:debug].present?  # debugを有効にする
      end
    end

end

上記のようにshowアクションの中にPDF出力のための記述を書いた場合、app/views/customerフォルダ直下のshow.pdf.erbというファイルがPDF出力用のテンプレートとして使用されます。なので事前にshow.pdf.erbを作成しておく必要があります。このshow.pdf.erbにはhtmlを記述しておくだけでOKです。ただし、画像やcssファイルなどはwicked_pdf用のタグを使用する必要があります。これについては後述します。

また、上記ではfooter用のテンプレートとしてcustomers/footer.html.erbを指定しています。これにより、app/views/customers/footer.html.erbの記述内容がfooterとして表示されます。

最後にshow_as_html: params[:debug].present?によってhtmlでのデバッグを有効にしています。これはshowアクションのPDFのURLに?debug=trueを付与したURLにアクセスすることでPDF出力内容をhtml表示してくれます。デバッグに関しては以下のサイトが参考になりました。

Rails で Wicked PDF 使って PDF を出力してみた ( 日本語もバッチリ ) | Qiita

PDFテンプレート用ファイルでのcss、画像読み込みについて

PDF出力のテンプレートファイルshow.pdf.erbでは、例えば以下の様な内容を記述しておきます。

app/views/customers/show.pdf.erb
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <%= wicked_pdf_stylesheet_link_tag "wickedpdf/cssstyle" %>
</head>
<body>
<p>test</p>
 <%= wicked_pdf_image_tag('bodyimage.png', {width: "680"})  %>
<footer>
 <%= yield %>
 </footer>
</body>
</html>

上記のように、PDF出力用のテンプレートファイルでは、cssファイルの読み込みにはwicked_pdf_stylesheet_link_tagを、画像ファイルの読み込みにはwicked_pdf_image_tagを使用します。 なお、wicked_pdf_stylesheet_link_tagで指定する際、app/assets/stylesheetsがデフォルトのディレクトリになっています。すなわち、上記の場合だと、app/assets/stylesheets/wickedpdf配下にあるcssstyle.cssファイルが読み込まれます。 wicked_pdf_image_tagではapp/assets/imagesがデフォルトのディレクトリになっているので、上記の場合だとapp/assets/images/bodyimage.pngが読み込まれます。 このように、wickedpdfでPDF出力する際に使用するテンプレートファイルでcss、画像を読み込む場合はwickedpdf用のタグを使う必要があります。

なお、production環境では、PDF出力のテンプレートで読み込むcssをコンパイルするために、必要ならば以下の記述をconfig/environments/production.rbに記述した上でassets:precompileおきます。

config.assets.precompile += %w( wickedpdf/cssstyle.css)

実際に使ってみて

何よりお手軽にhtmlの記述通りにPDF出力してくれるのですごい楽です。公式サイトにあるようにオプションもかなり豊富です。ただ、作りこむ場合は何かと見た目通りにならない場合もあるかもしれません。うまくいかない場合は以下のサイトが大変参考になりました。ありがとうございました。

参考サイト

【Rails】wicked_pdf導入にあたってつまづいたところメモ | Qiita

開発アプリ

nanolog.app

毎日の小さな出来事をなんでも記録して、ログとして残すためのライフログアプリです。