[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