HTMLからPDFを生成する処理が上手く動かなくなってしまったため、
PDF生成ライブラリをwicked_pdf
からFerrum
へ移行しました。
まだまだRails初心者なので、何か間違い等あればご指摘いただけると幸いです!
HTMLからPDFの変換処理に定番だったwicked_pdf
上記の通り、PDF生成機能の実装によく使われていたかと思います。
今回、私はRailsのバージョンを6から7へ引き上げて動作確認を行なった際に、
既存で実装されているPDF生成機能が動かなくなっていることに気がつきました。
なお、既存の実装内容は、viewテンプレート(hogehoge.html.erb形式のファイル)から
wicked_pdf
を使用してPDFへ変換処理を行っていました。
wicked_pdf
自体は現在もサポートされているgemですが、
このgemはwkhtmltopdf
というHTMLをPDFに変換するCLIツールに依存しています。
そして、このwkhtmltopdf
は、2023年1月にGitHub上からリポジトリがアーカイブされており、開発終了の理由としてはwkhtmltopdf
がさらに依存しているQtWebkitのメンテナンスが止まったことが原因のようです。
そのほか色々考慮し、 PDFの生成処理にはwicked_pdf
から別のライブラリに移行する必要があると考えました。
技術選定
技術選定時色々な記事を拝見し、結果的にFerrum
を選択しました。
こちらの記事などを参考にさせていただきました。
いざ実装
環境
Ruby 3.2.3
Rails 7.1.3.2
1.DockerfileでChromiumをインストール
Dockerを使用していたので、Dockerfileでインストールコマンドを追記
RUN apt-get update && apt-get install -y \
chromium \
chromium-driver
2. GemfileにFerrumを記述
gem 'ferrum'
$ bundle install
を実行してferrumをインストール
3.HTMLをPDFに変換する処理を記述
require "ferrum"
def generate_pdf
# 省略
respond_to do |format|
format.pdf do
html = render_to_string(
pdf: "書類.pdf",
template: 'download/document', # viewテンプレートを指定
formats: [:html],
)
pdf = htmlToPdf(html)
send_data(pdf, filename: "書類.pdf")
end
end
end
private
def htmlToPdf(html)
browser = Ferrum::Browser.new(
browser_path: '/usr/bin/chromium',
browser_options: { 'no-sandbox': nil }
)
browser.goto("data:text/html,#{html}")
browser.add_style_tag(
content: File.read("#{Rails.root}/app/assets/stylesheets/document.css")
)
pdf = browser.pdf(
format: :A4,
encoding: :binary
)
browser.quit
pdf
end
躓いたところ
hogehoge.html.erbでは<%= stylesheet_link_tag 'receipt' %>
のような形でスタイルシートを読み込んでいましたが、
Ferrumでは単純にviewテンプレートをHTMLとして読み込まれてしまうため、上記の手法ではCSSが読み込まれませんでした。
Ferrumの公式ドキュメントを見て、add_style_tag
オプションで対応しました。
実装においての参考記事
大変参考になりました!ありがとうございます。
wicked_pdfの後継になる?FerrumでHTMLからPDFを生成する