2011-04-10 21 views
15

Estoy usando PDFKit (que usa wkhtmltopdf) en un intento de representar una vista como PDF dentro de una aplicación de Rails 3.PDFKit (wkhtmltopdf) Broken Pipe, OS X y Rails 3

PDFKit hace con Errno::EPIPE (Broken pipe) apuntando a send_data(kit.to_pdf, :filename => "generated.pdf", :type => 'application/pdf') en mi controlador de acción Mostrar:

# Controller 
def show 
    respond_to do |format| 
    format.html { render } 
    format.pdf do 
     html = render_to_string(:layout => false , :action => "show.html.haml") 
     kit = PDFKit.new(html) 
     send_data(kit.to_pdf, :filename => "invoice.pdf", :type => 'application/pdf') 
     return # to avoid double render call 
    end 
    end 
end 

# Gemfile 
... 
gem 'pdfkit' 
gem 'wkhtmltopdf' 
... 

Sé wkhtmltopdf no es el origen de este error como wkhtmltopdf public/404.html tmp/404.pdf desde dentro Rails.root funciona como se espera.

Estoy usando un example from jonathanspies.com después de haber fallado el middleware de la misma manera.

# config/application.rb 
require 'pdfkit' 
config.middleware.use PDFKit::Middleware 

Después de probarlo en unos rieles frescas 3 aplicación, me sale el siguiente error:

command failed: "~/.rvm/gems/[email protected]/bin/wkhtmltopdf" "--page-size" "Letter" "--margin-right" "0.75in" "--margin-top" "0.75in" "--margin-bottom" "0.75in" "--encoding" "UTF-8" "--margin-left" "0.75in" "--quiet" "-" "-" 

Al ejecutar el comando manualmente y se muestra el uso de la pantalla, mirando a la opción --quiet es fácil para ver que se supone que es --tit

Cambie /lib/pdfkit/pdfkit.rb:35 a lo siguiente y todo funciona como se espera (con middleware también).

args << '--quit' 

Así, una vez más, he resuelto mi problema en el hecho de escribir la pregunta para obtener ayuda (siempre vale la pena incluir el detalle). Envié un pull request que corrige el error de ortografía (siempre un error tonto que pasa desapercibido). Espero que a nadie le importe publicar de todos modos.

+0

¡Gracias por publicar esto! –

+0

Es posible que desee publicar su solución como una respuesta y aceptarla. Solo para hacer que el SO sea feliz. :) –

Respuesta

6

En cuanto a cambiar el argumento tranquilo para salir.

Este cambio solo es válido si usa la gema wkhtmltopdf que usa una versión muy antigua del binario wkhtmltopdf.

Con la gema wkhtmltopdf

10:32:15 wkhtml >  wkhtmltopdf --version 
wkhtmltopdf 0.8.3 using wkhtmltopdf patched qt 
Copyright (C) 2008,2009 Jakob Truelsen, 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. 

Written by Jakob Truelsen 
Patches by Mário Silva and Emmanuel Bouthenot 

10:32:16 wkhtml >  wkhtmltopdf --help | grep quit 
    -q, --quit      Be less verbose. 
10:32:16 wkhtml >  wkhtmltopdf --help | grep quite 
10:32:19 wkhtml > 

Con la última binaria He instalado

10:33:40 tmp > wkhtmltopdf --version 
Name: 
    wkhtmltopdf 0.9.9 

License: 
    Copyright (C) 2008,2009 Wkhtmltopdf Authors. 



    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>. 
    This is free software: you are free to change and redistribute it. There is NO 
    WARRANTY, to the extent permitted by law. 

Authors: 
    Written by Jakob Truelsen. Patches by Mário Silva, Benoit Garret and Emmanuel 
    Bouthenot. 

10:33:50 tmp > wkhtmltopdf --help | grep quit 
10:34:02 tmp > wkhtmltopdf --help | grep quiet 
    -q, --quiet       Be less verbose 
10:34:07 tmp > 

Existe el error de ortografía en el antiguo binaria que viene con la gema wkhtmltopdf. Sugeriría que mono patch pdfkit con una inicialización o algo basado en si incluyó la gema wkhtmltopdf o no.

También aceptaría una solicitud de extracción que hizo que pdfkit tenga conocimiento de la versión de wkthtmltopdf contra la que se estaba ejecutando y condicionalmente cambió ese argumento.

+0

Oops destinado a publicar eso como un comentario en contra de la solución publicada por @jvatic –

2

Cambie /lib/pdfkit/pdfkit.rb:35 a los siguientes y todo funciona como se espera (con middleware también).

+1

una versión abreviada 'args <<" -q "' es mejor, porque funciona en todas las versiones –

Cuestiones relacionadas