2011-02-25 13 views
5

He estado buscando el uso de PDFKit para generar informes en PDF para una aplicación Rail 3 en la que estoy trabajando. Básicamente, si uso PDFKit como middleware, cualquier página en la aplicación está muy bien representada en pdf, incluidos los gráficos generados por JavaScript.PDFkit javascript issues

Sin embargo, quiero usar un diseño diferente para informes PDF que elimina cualquiera de la barra lateral o de navegación detalles para que en lugar de utilizar la opción de middleware que he estado jugando con la adición de lo siguiente a la acción del controlador correspondiente

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} 

(también probé la opción más ordenado de extraer esta funcionalidad a una opción de procesador como Katz describe here pero la lógica y el problema son los mismos)

esto definitivamente soluciona mi problema de diseño, pero parece que ninguno de los JavaScript de la aplicación e se ejecuta y los gráficos ya no aparecen. Eché un vistazo a la fuente de PDFKit, pero no pude encontrar diferencias importantes en la forma en que se producen los archivos PDF.

Todavía estoy encontrando mis pies con un montón de cosas con rieles, así que estoy seguro de que es probablemente algo bastante obvio que me está mirando a la cara. Cualquier indicador que cualquier persona podría tener sería muy apreciada

+0

en realidad mirando a la fuente de middleware un poco más cuidadosamente que se parece a los caminos de javascript necesitan ser traducidos a su forma absoluta para que wkhtmltopdf puede encontrar los recursos. También hay una sección de solución de problemas de la página PDFKit github que básicamente señala esto también. Voy a publicar mi solución aquí una vez que la haya ordenado – Conor

Respuesta

7

Esto básicamente es la solución Fui con que está más o menos basada en realmente grande 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 

El método translate_paths de Katz es básicamente la misma que la utilizada en PDKKit código estante middleware que se puede ver here y por debajo

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. complemento: print_media_type => true como una opción con la middlewar e por ejemplo: config.middleware.use "PDFKit :: Middleware",: print_media_type => true
  2. complemento: los medios de comunicación => "universal" y, incluidas sus hojas de estilo
  3. en hoja de estilos que agrega el siguiente
@media print {  
    #id_of_divs_to_hide{ 
    display: none; 
    } 
}