2011-02-25 38 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; 
    } 
}