Rails 4 pdfkit无法将chartkick图转换为pdf

时间:2014-10-30 20:58:54

标签: ruby-on-rails-4 pdfkit

我正在使用Rails 4

我遵循https://github.com/pdfkit/pdfkit

的指示

在控制器中我有

respond_to do |format|
                    format.html {render layout:'application'}
                    format.csv {send_data @testdatares.to_csv}
                    format.pdf {
                            html = render_to_string(:layout => 'application' , :action => "testpage.html.erb");
                            kit = PDFKit.new(html);
                            kit.stylesheets << "#{Rails.root}/app/assets/stylesheets/application.css";
                            send_data(kit.to_pdf, :filename => "some_name.pdf", :type => 'application/pdf')
                    }
            end

在application.html.erb中我有

<!DOCTYPE html>
<html>          
<head>                  
<title>STNEW</title>
<%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
<%= javascript_include_tag "http://www.google.com/jsapi", "/usr/local/lib/ruby/gems/2.1.0/gems/chartkick-1.3.2/app/assets/javascripts/chartkick",media:'all' %>
<%= csrf_meta_tags %>
</head>       

请注意我已使用chartkick.js的绝对路径

现在在html中,完整地显示了chartkick内容。

但是在pdfkit生成的pdf文件中,所有chartkick内容都显示为“正在加载”,而正确显示文本

用Google搜索但没有找到答案

2 个答案:

答案 0 :(得分:6)

最后,经过3天的搜索,追踪和错误,我找到了解决方案

首先,我必须使用wicked_pdf而不是pdfkit,因为前者提供了两个重要的辅助函数

wicked_pdf_stylesheet_link_tag
wicked_pdf_javascript_include_tag

然后我必须使用这两个帮助器来包含样式表和javascript,就像这样

<%= wicked_pdf_stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
<%= wicked_pdf_javascript_include_tag 'application', 'data-turbolinks-track' => true %>
<%= javascript_include_tag "http://www.google.com/jsapi"%>
<%= wicked_pdf_javascript_include_tag 'chartkick'%>

javascript_include_tag和wicked_pdf_javascript_include_tag之间的区别在于后者会将所有原始java代码写入html文件。这很重要,因为wicktml_df的核心wkhtmltopdf不知道在哪里可以找到js和css资产。这些资产位于/usr/local/lib/ruby/gems/2.1.0/gems/之类的位置(您的资产可能会有所不同),但只有您的rails应用知道它在哪里

请注意

<%= javascript_include_tag "http://www.google.com/jsapi"%>

你不能也不需要wicked_pdf_javascript_include_tag。

这里最重要的是。 wicked_pdf(以及pdfkit)将指示您安装gem wkhtmltopdf-binary,它具有最新版本0.9.9,然后只需调用类似这样的内容

format.pdf {render pdf :"test",layout:'application',template:'stinfos/testpage.html.erb'}         

生成pdf。这仅适用于没有chartkick或highchart组件的html。在生成的PDF文件中,chartkick或highchart数字仅显示为“loading”

要解决此问题,您需要通过运行

删除wkhtmltopdf-binary gem
gem uninstall wkhtmltopdf-binary

在你的rails app root

然后从http://wkhtmltopdf.org/downloads.html

下载最新版本的wkhtmltopdf

对我来说预编译版本工作 http://downloads.sourceforge.net/project/wkhtmltopdf/0.12.1/wkhtmltox-0.12.1_linux-trusty-amd64.deb

并安装

dpkg -i wkhtmltox-0.12.1_linux-trusty-amd64.deb

很可能它位于/ usr / local / bin / wkhtmltopdf

如果没有,请更改config / initializers / wicked_pdf.rb

:exe_path => '/yourpath/wkhtmltopdf'

然后将javascript_delay:2000添加到format.pdf

 format.pdf {render pdf:"test",javascript_delay:2000,
 layout:'application',template:'stinfos/testpage.html.erb'}

然后你应该看到图表生成的数字显示在pdf中。如果没有,请使用更长的延迟时间。

请注意,javascript_delay选项不适用于版本0.10以下的wkhtmlpdf

答案 1 :(得分:0)

虽然WickedPDF可能工作得很好,但还有一个使PDFKit工作的解决方法。您只需要将wkhtmltopdf指向.js文件的绝对路径,类似于用于包含CSS文件的方法:

html = render_to_string(:layout => 'application' , :action => "testpage.html.erb")

html.gsub!("/assets", "#{Rails.root}/public/assets")

kit = PDFKit.new(html)
kit.stylesheets << "#{Rails.root}/app/assets/stylesheets/application.css"
send_data(kit.to_pdf, :filename => "some_name.pdf", :type => 'application/pdf')

预编译的chartkick.js将位于/public/assets文件夹中,wkhtmltopdf可以在那里找到它。