Rails 4 pdfkit 无法将 Chartkick 图表转换为 pdf

2024-06-20

我正在使用 Rails 4

我按照指示https://github.com/pdfkit/pdfkit 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内容都显示为“正在加载”,而文本则正确显示

谷歌搜索但没有找到答案


最后,经过三天的搜索、尝试和错误,我找到了解决方案

首先,我必须使用 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 文件中。这很重要,因为 wicked_pdf 的核心 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 图形仅显示为“正在加载”

要解决此问题,您需要通过运行删除 wkhtmltopdf-binary gem

gem uninstall wkhtmltopdf-binary

在你的 Rails 应用程序根目录中

然后从下载最新版本的 wkhtmltopdfhttp://wkhtmltopdf.org/downloads.html http://wkhtmltopdf.org/downloads.html

对我来说预编译版本有效http://downloads.sourceforge.net/project/wkhtmltopdf/0.12.1/wkhtmltox-0.12.1_linux-trusty-amd64.deb 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 中显示了 Chartkick 数据。如果不是,请使用更大的延迟时间。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails 4 pdfkit 无法将 Chartkick 图表转换为 pdf 的相关文章

随机推荐