wicked_pdf で chartkick のグラフを表示する


HTMLをPDFとしてレンダリングできるWicked PDFでは,HTML上では正常に表示されいるchartkickのグラフが正常に表示されず, Loading... の表示のままPDFが生成される.

window_status オプションを指定

オプションwindow_status を用いると,JSで window.status が更新されるまで,グラフのレンダリングを待ってくれる.

似たようなオプションで javascript_delay が使えるようだが,このオプションだといくら待っても Loading... のままだった.

--javascript-delay : Wait some milliseconds for javascript finish (default 200)
https://wkhtmltopdf.org/usage/wkhtmltopdf.txt

app/controllers/pdfs_controller
class PdfsController < ApplicationController
  def show
    respond_to do |format|
      format.html
      format.pdf do
        render pdf: "file_name",
               layout: "pdf",
               window_status: "FLAG_FOR_PDF" # Wait until window.status is equal to this string before rendering page
      end
    end
  end
end

JS側で window.status を設定し,グラフを再レンダリング

app/assets/javascripts/pdf.js
//= require libs/chartkick
//= require libs/loader
setTimeout((function () {
    window.status = "FLAG_FOR_PDF";
    Object.keys(Chartkick.charts).forEach(function (key) {
        Chartkick.charts[key].redraw();
    });
}), 3000);

Production環境で動作しない問題

ローカル環境では正常に動作するが,プリコンパイルをしているProduction環境で,いくら待ってもPDFがレンダリングされない問題が発生した.
サーバのログ的にはPDFレンダリングがいつまで経っても実行されていなかったので window.status が正常に更新されないと推測,JSファイルの読み込み方 wicked_pdf_javascript_include_tag から javascript_include_tag wicked_pdf_asset_base64 に変更したところ正常に動作した.

app/views/layouts/pdf.html.erb
<!DOCTYPE html>
<html>
  <head>
    <%= csrf_meta_tags %>

    <%= wicked_pdf_stylesheet_link_tag 'application' %>
   <!-- 本番環境で動作しなくなる -->
    <!-- <%= wicked_pdf_javascript_include_tag 'pdf' %> -->
    <%= javascript_include_tag wicked_pdf_asset_base64('pdf') %>
  </head>

  <body>
    <%= yield %>
  </body>
</html>