🎉

[rails]railsでwicked_pdfを扱うためのノウハウ

に公開

railsでwicked_pdfを扱う機会があったので、ノウハウを記事に残します。

環境

その1

  • mac
  • ruby 3.0.7
  • rails 5.2.8
  • wicked_pdf 2.8.0
  • wkhtmltopdf-binary 0.12.3 or 0.12.6.7

その2

  • docker
  • ruby 3.0.7
  • rails 7.0.8
  • wicked_pdf 2.8.0
  • wkhtmltopdf-binary 0.12.6.1

wicked_pdfとは

HTMLからPDFを出力するライブラリです。

現在の利用は非推奨となっています。

なので、現状でゼロから実装する場合は利用してはしてはいけません。

とはいえ、他のライブラリに移行するまで利用する必要があるプロジェクトも多いと思います。

gem

二種類必要です。

gem 'wkhtmltopdf-binary' 
gem 'wicked_pdf'

gemの特徴と性質

railsなどのupdateでgemのversionを上げるときは、なるべくwicked_pdfのみをupdateしてください。

wkhtmltopdf-binaryを大幅にupdateしてしまうと、表示(padding等の余白の大きさ)が変わってしまう可能性があります。(マイナーupdateなら多分平気)

なのでgemfileは

gem 'wkhtmltopdf-binary', '0.12.3'
gem 'wicked_pdf'

のようにwkhtmltopdf-binaryを固定しておくと良いでしょう。

wicked_pdfのupdate方法は

bundle update --conservative wicked_pdf

もしくは

bundle update --conservative wicked_pdf wkhtmltopdf-binary

で行うことができます。

設定

config/initializers/wicked_pdf.rb

は以下のように記載します。

WickedPdf.configure do |c|
  puts "wkhtmltopdf-binarywkhtmltopdf-binary"
  puts "#{Gem.loaded_specs['wkhtmltopdf-binary'].full_gem_path}/bin/wkhtmltopdf"
  c.exe_path = "#{Gem.loaded_specs['wkhtmltopdf-binary'].full_gem_path}/bin/wkhtmltopdf"
  c.enable_local_file_access = true
end

config/initializers/mime_types.rbには

Mime::Type.register "application/pdf", :pdfle_local_file_access = true
end

を追記します。

sample実行

bundle exec rails c

pdf = WickedPdf.new.pdf_from_string('<h1>Hello There!</h1>')

とすると

test.pdfが作成されていて、開くとPDFが出力されます。

もしくはterminalを開いて

wkhtmltopdf https://example.com test.pdf

で確認しても良いでしょう

エラー

上記はうまく行った場合の方法です。

wicked_pdfは癖があり、うまく動かないことも多いです。

よく発生するエラーは

qemu-i386: Could not open '/lib/ld-linux.so.2': No such file or directory

です。

これは

wicked_pdfに必要なライブラリがないことを示しています。

この場合whichででpathを調べます。

which wkhtmltopdf
/usr/local/bundle/bin/wkhtmltopdf

上記の調査でpathがある場合はfileコマンドで調査します。

file /usr/local/bundle/bin/wkhtmltopdf
/usr/local/bundle/bin/wkhtmltopdf: Ruby script, ASCII text executable

フルパスでコマンドを叩きます。

/usr/local/bundle/bin/wkhtmltopdf https://example.com output.pdf

これで

qemu-i386: Could not open '/lib/ld-linux.so.2': No such file or directory

が発生する場合は32bitバイナリなので、64bitバイナリを導入します。

dockerの場合は

# wkhtmltopdfの64bit DEBパッケージを取得してインストール
RUN curl -LO https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.6/wkhtmltox_0.12.6-1.buster_amd64.deb && \
    apt-get update && \
    apt install -y ./wkhtmltox_0.12.6-1.buster_amd64.deb && \
    rm wkhtmltox_0.12.6-1.buster_amd64.deb

を追記します。

上記でも解決しない場合

上記でも修正できないケースがあります。

その場合は

bundle update --conservative wkhtmltopdf-binary

で表示に影響のでない範囲でwkhtmltopdf-binaryをupdateしましょう。

wkhtmltopdf-binaryはソースコードを読むとわかりますが、ただ単にbinに格納されたwkhtmltoxを呼び出すだけです。

dockerなどではライブラリなどに応じた相性があるので、updateをすることで解決することもあります。

まとめ

今回はwicked_pdfの説明をしました。

作者が今後はもうupdateしないことを明言しているので、なるべく早く移行作業を行いましょう。

参考

Discussion