4
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?

wicked_pdfの代わりにFerrumを導入する方法

Last updated at Posted at 2024-08-14

はじめに

wicked_pdfで使用されているWkHtmlToPDFというgemが2023/1/2にアーカイブされました。
更新が行われなくなるため、維持のリスクが高まってきます。

そこで、wicked_pdfに代わるferrumを導入してみました。
wicked_pdfと同じようにhtmlをpdfに変換できます。
導入の際に引っかかった点もあるので紹介していきたいと思います。

導入方法

Dockerfileにchromiumのインストール追加

RUN apt-get update && apt-get install -y \
    chromium \
    chromium-driver

gemインストール

gem 'ferrum'

routes追加

get "pdf_test", to: "generate_pdf#index"
get "download_pdf", to: "generate_pdf#generate_pdf"

controller作成

app/controllers/generate_pdf_controller.rb
class GeneratePdfController < ApplicationController
  def index
  end

  def generate_pdf
    html = render_to_string(
      template: 'generate_pdf/pdf_test',
      formats: [:html],
    )

    pdf = html_to_pdf(html)

    send_data pdf, filename: "Ferrumサンプル.pdf", type: "application/pdf", disposition: "inline"
  end

  private

    def html_to_pdf(html)
        browser = Ferrum::Browser.new(
          browser_path: '/usr/bin/chromium',
          browser_options: { 'no-sandbox': nil }
        )
        page = browser.create_page
        page.command("Emulation.setEmulatedMedia", media: "screen")

        page.content = html

        pdf = page.pdf(
          format: :A4,
          encoding: :binary,
          scale: 0.8,
          print_background: true,
        )

    ensure
      browser&.quit
    end
end

viewファイル作成

app/views/generate_pdf/index.html.erb
<%= link_to download_pdf_path do %>
  <button>PDF生成</button>
<% end %>

pdf変換用のhtmlファイル

app/views/generate_pdf/pdf_test.html.erb
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
</head>
<body>
  test
</body>
</html>

PDF生成

PDF生成をクリック
image.png

PDFが生成される
image.png

日本語対応させる

ここでPDFの文字を日本語にしてみます。

app/views/generate_pdf/pdf_test.html.erb
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
</head>
<body>
  日本語です
</body>
</html>

生成すると
image.png

文字化けが起こってしまうようでした。

原因は日本語フォントがインストールされていないためです。
日本語フォントをdockerにインストールする必要があります。

dockerfileを以下に修正
fontconfigと日本語フォントインストールのコードを追加

RUN apt-get update && apt-get install -y \
    chromium \
    chromium-driver \
    fontconfig # 追加

# 日本語フォントインストール
RUN wget https://moji.or.jp/wp-content/ipafont/IPAexfont/IPAexfont00301.zip
RUN unzip IPAexfont00301.zip
RUN mkdir -p /usr/share/fonts/ipa
RUN cp IPAexfont00301/*.ttf /usr/share/fonts/ipa
RUN fc-cache -fv

buildして、再度サーバーを再起動すると日本語が適用されています。
image.png

CSSを読み込めるようにする

cssを指定するにはcontollerで以下のように指定すればOKです。

def html_to_pdf(html)
    browser = Ferrum::Browser.new(
      browser_path: '/usr/bin/chromium',
      browser_options: { 'no-sandbox': nil }
    )
    page = browser.create_page
    page.command("Emulation.setEmulatedMedia", media: "screen")

    page.content = html

    # cssを指定
    browser.add_style_tag(
      content: File.read("#{Rails.root}/app/assets/stylesheets/pdf.css")
    )

    pdf = page.pdf(
      format: :A4,
      encoding: :binary,
      scale: 0.8,
      print_background: true,
    )

ensure
  browser&.quit
end

画像をpdfに載せる

画像をbase64変換すると画像を載せられるようです。

<img alt="" src="data:image/png;base64,iVBO..." />

image.png

path指定でもっといいやり方はあると思うので、知っている方いればどなたか教えてください!

終わりに

特に、日本語フォント導入部分でやり方が分からず結構時間を取られてしまいました。
もしかしたら、wicked_pdfをもともと使っているシステムは日本語フォント入っているので導入が楽かもしれないですね。
ferrumの日本語での記事が少ないため、導入ハードルも高いと思います。
この記事でどなたかの役に立てば幸いです。

参考

4
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
4
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?