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
に追記して
gem 'wicked_pdf'
gem 'wkhtmltopdf-binary'
bundleでインストールします。
$ bundle
そして以下コマンドでwickedpdfの設定ファイルを生成します。
$ rails generate wicked_pdf
これで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アクションを以下のように修正します。
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
では、例えば以下の様な内容を記述しておきます。
<!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
関連記事
- 公開日:2019/10/04 更新日:2019/10/04
RailsとSendGridでメール送信処理を実装する
Ruby on RailsからAction Mailerを使用してSendGrid経由でメールを送信する処理を実装したのでその手順をまとめます。
- 公開日:2018/05/30 更新日:2018/05/30
ブラウザの操作を自動化できるSeleniumをWSLからRubyで使う
フォーム送信や繰り返し行う必要があるブラウザ操作を自動化できるSeleniumをWindows Subsystem for Linux のUbuntuからRubyを用いて使用するための手順をメモします。
- 公開日:2018/05/27 更新日:2018/05/27
rbenvとruby環境の構築手順
WindowsのWindows Subsystem for LinuxでUbuntuを使いはじめ、その中にrbenvとRuby環境を構築したのでその手順をメモします。なお、UbuntuであればWindows Subsystem for Linux、仮想マシン、純粋なUbuntuのいずれでも同じ手順になります。思っていた以上に簡単に構築できました。
- 公開日:2018/05/06 更新日:2018/05/06
RubyでGoogleスプレッドシートを読み込み・書き込みする
Googleスプレッドシートを自分で作成したRubyコードから読み込んだり、書き込んだりするためのコードについてまとめます。