はじめに
wicked_pdfでコンソールからPDFを作成したいシチュエーションに遭遇したので、備忘録も兼ねてQiitaに記事を残します。
環境
Ruby 2.6.5
Rails 5.2.4
wicked_pdf 1.1.0
wicked_pdfとは?
RailsでPDF出力をしたい時に用いるGemで、HTMLを書くようにPDFを作成することができます。
PDFを作成するGemにはPrawnもありますが、PrawnはゴリゴリのDSLなので、自由度は高いですが学習コストがかかります。
wicked_pdf本家リポジトリはこちら
https://github.com/mileszs/wicked_pdf
前提
app/views/users/profile_pdf.pdf.slimというファイルがあり、中身が
h1 = @user.name
h3
メールアドレス
p = @user.email
h3
プロフィール
p = @user.profile
のようになっているとします。(雑でごめんなさい、、、)
Userモデルにはnameとemailとprofileがあるとします。
手順
$ rails c
controller = ActionController::Base.new # コントローラーのインスタンスを生成(ActionView::Baseのインスタンス生成に必要なため)
view = ActionView::Base.new(Rails.root.join('app', 'views'), {}, controller) # ビューインスタンスの生成。renderメソッドを呼ぶために使う
view.extend(ApplicationHelper) # viewファイルでHelperを使っている場合に使う。ApplicationHelper以外にもHelperファイルがある場合は、そちらもextendする
pdf = WickedPdf.new.pdf_from_string(
view.render(
template: "users/profile_pdf.pdf.slim", # 自動でviews/配下のファイルを探しに行くため、users/profile_pdf.slimでOK
layout: 'layouts/base_pdf_layout.pdf.slim', # layoutファイルを使わない場合は指定の必要なし
locals: { @user => User.first }, # slimファイル内で変数を使う場合に指定する。
encoding: 'UTF-8'
)
).force_encoding("UTF-8")
save_path = Rails.root.join('tmp', "#{User.first.name}_profile.pdf") # 保存するpathを作成
# Fileクラスを使って保存する処理
# 参考: https://github.com/mileszs/wicked_pdf#super-advanced-usage
File.open(save_path, 'wb') do |file|
file << pdf
end
localsは@userのみを渡していますが、変数は複数渡すことができます。
force_encodingを行わない場合、文字化けが発生します。(何十分か溶かしました)
生成されたファイルがこちら
まとめ
先ほど紹介したPrawnを用いる場合ですと、ActionControllerやActionViewに頼らずにコンソールからPDF出力ができるのですが、wicked_pdfでとなるとActionControllerやActionViewに頼らないと厳しいのかなと思いました。
「PDFを一括で出してほしい」のような依頼は意外とありますので、誰かの参考になればと思います。