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

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

https://zenn.dev/lovegraph/articles/e3c8baedfc5ed6

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

# 導入方法
Dockerfileにchromiumのインストール追加
```dockerfile
RUN apt-get update && apt-get install -y \
    chromium \
    chromium-driver
```

gemインストール
```
gem 'ferrum'
```

routes追加
```rb
get "pdf_test", to: "generate_pdf#index"
get "download_pdf", to: "generate_pdf#generate_pdf"
```

controller作成
```rb: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ファイル作成
```erb:app/views/generate_pdf/index.html.erb
<%= link_to download_pdf_path do %>
  <button>PDF生成</button>
<% end %>
```
pdf変換用のhtmlファイル
```erb: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/1bae53fc-5f40-5500-0c48-3119e16ea13f.png)

PDFが生成される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/6869cb1a-90d0-062f-77a0-0e8c313502ea.png)

# 日本語対応させる
ここでPDFの文字を日本語にしてみます。
```erb:app/views/generate_pdf/pdf_test.html.erb
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
</head>
<body>
  日本語です
</body>
</html>
```

生成すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/858ef29f-ca4b-ca6c-bf42-312cc5f32bd9.png)

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

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

dockerfileを以下に修正
fontconfigと日本語フォントインストールのコードを追加
```dockerfile
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/90227990-c14b-5253-f3df-e5fba49b5003.png)


# CSSを読み込めるようにする
cssを指定するにはcontollerで以下のように指定すればOKです。
```rb
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変換すると画像を載せられるようです。
```erb
<img alt="" src="data:image/png;base64,iVBO..." />
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/bd8326e0-c1b2-a4f3-b0af-d3268cb84f29.png)

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

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

# 参考

https://qiita.com/aisplay/items/7ed4ec9fd311395f6540

https://zenn.dev/geny7i/articles/392dd695b894da

https://support.mescius.jp/hc/ja/articles/4410422759183-Docker%E3%81%A7%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%82%92%E5%90%AB%E3%82%93%E3%81%A0PDF%E3%82%92%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95