我正在尝试创建使用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文件。
另外,它给了我生产中的线程问题,我还在努力(我在开发中使用多个独角兽,所以它在那里工作)