wicked_pdf로 콘솔에서 PDF를 만들고 싶어요.

5766 단어 Rails

입문


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_우리 집 자료고는 여기에 있다
https://github.com/mileszs/wicked_pdf

전제 조건


app/views/users/profile_pdf.pdf.슬림이라는 서류가 있어요. 안에 있어요.
h1 = @user.name
h3
  メールアドレス
p = @user.email
h3
  プロフィール
p = @user.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_인코딩을 하지 않으면 혼란이 발생합니다.수십 분 동안 녹았어요
생성된 파일은 여기 있습니다.

총결산


방금 소개한 Prawn을 사용할 때 ActionController 또는 ActionView에 의존하지 않고 콘솔에서 PDF를 출력할 수 있지만 wicked_pdf라면 ActionController와 ActionView에 의존하지 않으면 엄격하겠죠.
"PDF를 한꺼번에 꺼내달라"는 의뢰가 의외로 있어 누구에게 참고가 됐으면 좋겠다.

좋은 웹페이지 즐겨찾기