LoginSignup
4
1

More than 5 years have passed since last update.

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

Posted at

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

image.png

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>
4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1