はじめに
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作成
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ファイル作成
<%= link_to download_pdf_path do %>
<button>PDF生成</button>
<% end %>
pdf変換用のhtmlファイル
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
</head>
<body>
test
</body>
</html>
PDF生成
日本語対応させる
ここでPDFの文字を日本語にしてみます。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
</head>
<body>
日本語です
</body>
</html>
文字化けが起こってしまうようでした。
原因は日本語フォントがインストールされていないためです。
日本語フォントを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して、再度サーバーを再起動すると日本語が適用されています。
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..." />
path指定でもっといいやり方はあると思うので、知っている方いればどなたか教えてください!
終わりに
特に、日本語フォント導入部分でやり方が分からず結構時間を取られてしまいました。
もしかしたら、wicked_pdfをもともと使っているシステムは日本語フォント入っているので導入が楽かもしれないですね。
ferrumの日本語での記事が少ないため、導入ハードルも高いと思います。
この記事でどなたかの役に立てば幸いです。
参考