让Google Visualization(GoogleVisualr gem)使用Pdfkit - Rails

时间:2015-08-31 11:53:13

标签: ruby-on-rails ruby-on-rails-4 google-visualization pdfkit

我正在尝试创建使用google_visualr gem生成的组织结构图的pdf导出。

(rails 4.2.1 / pdfkit 0.7.0 / google_visualr 2.4.0 / wkhtmltopdf binary 0.9.0)

控制器:

  def org_chart
   data_table = GoogleVisualr::DataTable.new
   data_table.new_column('string', 'Name'   )
   data_table.new_column('string', 'Manager')
   data_table.new_column('string', 'ToolTip')
   data_table.add_rows(
    [
      [ {:v => 'Mike', :f => 'Mike<div style="color:red; font-style:italic">President</div>'   }, ''    , 'The President' ],
      [ {:v => 'Jim' , :f => 'Jim<div style="color:red; font-style:italic">Vice President<div>'}, 'Mike', 'VP'            ],
      [ 'Alice'  , 'Mike', ''           ],
      [ 'Bob'    , 'Jim' , 'Bob Sponge' ],
      [ 'Carol'  , 'Bob' , ''           ]
    ]
  )
  opts   = { :allowHtml => true }
  @chart = GoogleVisualr::Interactive::OrgChart.new(data_table, opts)

  respond_to do |format|
    format.pdf do
      html = render_to_string(layout: false, action: "org_chart", formats: :pdf)
      kit = PDFKit.new(html, :orientation => 'Landscape', :page_size => "A3")
      kit.stylesheets << "#{Rails.root}/app/assets/stylesheets/pdf/pdf.css"
      send_data(kit.to_pdf, filename: "org chart", type: 'application/pdf', disposition: 'inline')
    end
  end
end

org_chart.pdf.erb

<script type="text/javascript">
  <%= open("https://www.google.com/jsapi").read.html_safe.force_encoding("UTF-8") %>
</script>
<h1>Org Chart</h1>



<div id="chart"></div>
<%= render_chart @chart, "chart" %>

这会生成一个仅包含h1组织结构图文本的pdf。

记录生成的html字符串会产生:gist

在图表的html版本中,动态生成的javascript文件添加到头部,例如https://www.google.com/uds/?file=visualization&v=1&packages=orgchart&async=2。我不认为这些是在pdf版本中加载的,因此图表无法呈现。

之前是否有人遇到过此问题 - 有关动态加载这些javascript文件的好方法的建议吗?

更新

我通过将javascript文件添加到pdf视图来实现此功能,如下所示:

<%= javascript_include_tag "#{root_url}assets/application.js" %>
<script type="text/javascript" src="https://www.google.com/uds/?file=visualization&v=1&packages=orgchart&async=2"></script>
<script type="text/javascript" src="https://www.google.com/uds/api/visualization/1.0/e4daa89e21758ca575303e781d536a37/format+en,default+en,ui+en,orgchart+en.I.js"></script>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<h1>Org Chart</h1>



<div id="chart"></div>
<%= render_chart @chart, "chart" %>

然而,这有点hacky并且仅适用于orgchart。我想知道如何动态添加javascript文件。

另外,它给了我生产中的线程问题,我还在努力(我在​​开发中使用多个独角兽,所以它在那里工作)

0 个答案:

没有答案