5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Rails】Ferrumを使ってHTMLをPDFへ変換してみた(wicked_pdfからの移行)

Last updated at Posted at 2024-04-05

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を記述

Gemfile
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を生成する

5
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
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?