2011-02-25 95 views
5

我一直在寻找到使用PDFKit产生了铁路 3应用程序我工作的PDF报告。基本上,如果我用PDFKit中间件在应用程序中的任何 页面是很好的呈现到PDF包含的JavaScript生成的图表。PDFkit JavaScript的问题

不过,我想使用的PDF报告不同的布局,消除任何 侧边栏或导航细节,而不是使用中间件选项我一直添加以下到相关控制器动作玩弄

format.pdf {    
       html = render_to_string(:action => "show.html.erb", :layout => "report.html.erb") 
       kit = PDFKit.new(html) 
       kit.stylesheets << "#{Rails.root}/public/stylesheets/application.css" 
       send_data kit.to_pdf, :filename => "file.pdf", :type => :pdf} 

(我也尝试提取此功能渲染器选项的更简洁的选择,因为卡茨介绍here但逻辑,问题是相同的)

这无疑解决了我的布局问题,但似乎没有任何的应用程序的JavaScript的AR正在运行,图形不再出现。我有一个看看PDFKit来源,但我不能发现在PDF文件中的生产方式的任何重大分歧。

我还在摸索了很多的事情轨道,所以我敢肯定,这是可能的东西,盯着我的脸很明显的。任何指针,任何人都可能将不胜​​感激

+0

其实看着中间件源多一点小心它看起来像JavaScript的路径需要转换到他们的绝对形式,使wkhtmltopdf可以找到资源。还有PDFKit github上页的故障排除部分,基本上也指出了这一点。一旦我对它进行排序,我会在这里发布我的解决方案 – Conor 2011-02-26 10:53:56

回答

7

这基本上是我去解决这大概是基于凯茨的真正伟大blog post

ActionController.add_renderer :pdf do |template, options| 
    html = render_to_string template, options 
    html = translate_paths(html, env) 
    kit = PDFKit.new(html) 
    css_files = Array.wrap(options.delete(:css)).each do |css_sheet| 
    kit.stylesheets << "#{Rails.root}/public/stylesheets/#{css_sheet}.css" 
    end 
    send_data kit.to_pdf, :filename => options[:filename], :type => Mime::PDF 
end 

的translate_paths方法基本相同,所使用的一个PDKKit齿条中间件代码由此可以看出here和下方

def translate_paths(body, env) 
    # Host with protocol 
    root = "#{env['rack.url_scheme']}://#{env['HTTP_HOST']}/" 
    body.gsub(/(href|src)=(['"])\/([^\"']*|[^"']*)['"]/, '\1=\2' + root + '\3\2') 
end 
1
  1. 添加:print_media_type =>真作为与middlewar一个选项E对于例如:config.middleware.use “PDFKit ::中间件”:print_media_type =>真
  2. 附加:媒体=> “所有”,而包括你的样式表
  3. 在你的样式表文件中添加以下
@media print {  
    #id_of_divs_to_hide{ 
    display: none; 
    } 
}