LoginSignup
3
2

More than 3 years have passed since last update.

wicked_pdfでコンソールからPDFを作成したい

Last updated at Posted at 2021-02-25

はじめに

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を行わない場合、文字化けが発生します。(何十分か溶かしました)

生成されたファイルがこちら

スクリーンショット 2021-02-24 16.48.53.png

まとめ

先ほど紹介したPrawnを用いる場合ですと、ActionControllerやActionViewに頼らずにコンソールからPDF出力ができるのですが、wicked_pdfでとなるとActionControllerやActionViewに頼らないと厳しいのかなと思いました。

「PDFを一括で出してほしい」のような依頼は意外とありますので、誰かの参考になればと思います。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2