ruby-on-rails-3 - rails - wkhtmltopdf pdf
¿Por qué PDFKit/wkhtmltopdf se cuelga pero genera PDF como se espera cuando se destruye la aplicación Rails? (7)
El mío también colgaba y abría el ícono wkhtmltopdf en el banquillo.
De hecho, me di cuenta de que el problema era que solo tenía en marcha 1 proceso de trabajo de unicornio. Una vez que agregué más de 1, funcionó bien.
Estoy ejecutando wkhtmltopdf 0.9.9 en OS X con pdfkit 0.6.2
Fondo
Después de leer todo, me pareció que Prawn está fuera y wkhtmltopdf está adentro. También parece que las gemas PDFKit y wicked_pdf para Rails son lo nuevo. Así que encontré un screencast de Ryan sobre cómo usar PDFKit . Instalé todo, probé wkhtmltopdf en la CLI sin problemas, jugueteé con la configuración de Rails para ejecutar múltiples procesos para que la canalización de activos funcionara, y todo parecía estar bien, excepto que todavía estoy atascado al final del proceso (en realidad obtengo el PDF respuesta del servidor).
Pregunta
Cuando solicito una versión .pdf
de mi vista (estoy usando la opción PDFKit Middleware), mi navegador se queda allí esperando una respuesta, pero tan pronto como mato el proceso de Rails, el PDF que esperaba obtener solo aparece en mi ventana del navegador ¿Lo que da?
Lo que estoy usando
- OS: OSX 10.8.1
- Rieles: 3.2.8
- Ruby: 1.9.3
- wkhtmltopdf: 0.11.0_rc1 (aunque cuando ejecuto
wkhtmltopdf -V
dice 0.10.0_rc2) - qt: 4.8.2
Qué he hecho
- Usé el middleware PDFKit cargando
config.middleware.use "PDFKit::Middleware"
en mi archivoapplication.rb
. -
gem ''pdfkit''
en mi Gemfile y lo instalé con Bundler - establezca
.pdf
mime-type en mi inicializadormime_types.rb
conMime::Type.register_alias "application/pdf", :pdf
- agregado
config.threadsafe!
aconfig/environments/development.rb
para varios subprocesos, por lo que la interconexión de activos no entra en conflicto con el motor de PDF - probado
wkhtmltopdf http://www.google.com google.pdf
y generó un PDF de la página principal de Google como se esperaba - intenté intercambiar PDFKit para wicked_pdf y encontré el mismo problema (colgando, pero cuando el proceso Rails se cancela, el PDF se renderiza como se esperaba)
Como se ve
Esta es la página html normal que renderiza Rails (borré los detalles del cliente):
Esta es la salida CLI de Rails cuando intento navegar a localhost:3000/some/path.pdf
. (la aplicación se cuelga mientras espera una respuesta):
Cuando finalmente mato el proceso de Rails con ctrl-c
el PDF finalmente aparece en el navegador como esperaba verlo (CSS y HTML se procesaron correctamente, por lo que los activos parecen cargar bien):
Conclusiones hasta el momento
Intercambiar PDFKit para wicked_pdf y obtener los mismos resultados parece hacerme pensar que el problema no está en esas bibliotecas, sino en algo relacionado con mi entorno de desarrollo. Pero wkhtmltopdf funciona bien desde la línea de comandos, así que eso me hace pensar que QT y Q están haciendo su trabajo. El problema debe estar en Rails. Tal vez no estoy configurando algo correctamente?
Petición de ayuda
¿Cómo puedo determinar exactamente cuál es el problema y cómo lo soluciono?
Te amaré si me puedes ayudar <3
Actualizar
También intenté usar un método alternativo para renderizar el PDF (con .to_pdf
) sin la opción de middleware de la siguiente manera (haciendo esto, comenté config.middleware.use "PDFKit::Middleware"
desde mi archivo application.rb
):
respond_to do |format|
format.html
format.pdf do
html = ''<html><body>This is a test.</body></html>''
@pdf = PDFKit.new(html)
send_data @pdf.to_pdf,
:filename => ''whatever.pdf'',
:type => ''application/pdf'',
:disposition => ''attachment''
end
end
El problema es con wkhtmltopdf en sí, específicamente, cualquier versión después de 0.9.9. wkhtmltopdf se cuelga cuando se ejecuta directamente desde la línea de comandos.
Pasos para corregir:
brew uninstall wkhtmltopdf
cd /usr/local/Library/Formula/
git checkout 6e2d550 /usr/local/Library/Formula/wkhtmltopdf.rb
brew install wkhtmltopdf
Luego verifique que la versión correcta esté instalada wkhtmltopdf --version
que debería dar wkhtmltopdf 0.9.9
resultado wkhtmltopdf 0.9.9
Citaciones:
Exactamente los mismos síntomas pero usando WickedPdf
actualmente. En este punto, creo que el problema también recae en wkhtmltopdf
.
Lamentablemente, ninguna de las recomendaciones que he podido encontrar en Stack / Google funcionó para mí. En cambio, necesitaba combinar varias sugerencias, incluidas algunas que se encuentran en esta publicación.
La solución fue:
-
brew uninstall wkhtmltopdf
- encuentre y elimine cualquier copia de
wkhtmltopdf
en/usr/bin
- Comentar la línea
WickedPdf.config
enconfig/initializers
- agregar
config.threadsafe!
adevelopment.rb
- elimine el middleware y permita que la acción ''show'' del controlador principal maneje las solicitudes de PDF (puede no ser necesario)
- agregar
wkhtmltopdf-binary
a gemfile - haz
- reiniciar el servidor
- Es posible que también deba agregar
Mime::Type.register_alias "application/pdf", :pdf
aconfig/initializers/mime_types.rb
(para mí, esto causa '' advertencia: ya se ha inicializado el PDF constante '')
Mi configuración fue: Mac OSX Mountain Lion con Rails 3.2.1, Webrick, Postgres y wkhtmltopdf-binary (0.9.9.1).
Intente editar config/initializer/pdfkit.rb
de la siguiente manera:
PDFKit.configure do |config|
config.wkhtmltopdf = Rails.root.join(''bin'', ''wkhtmltopdf-i386'').to_s
config.default_options = {
:encoding=>"UTF-8",
:page_size=>"A4",
:margin_top=>"0.25in",
:margin_right=>"0.1in",
:margin_bottom=>"0.25in",
:margin_left=>"0.1in",
:disable_smart_shrinking=> false
}
end
La manera fácil en MacOS:
brew install Caskroom/cask/wkhtmltopdf
La solución de scarver2 funcionó para mí según lo anunciado. Pero necesitaba una versión más reciente de wkhtmltopdf
. Como la versión homebrew todavía parece obsoleta (todavía se cuelga en la línea de comandos), y como no hay disponible un binario precompilado reciente, utilicé el script de construcción os x para compilar uno yo mismo:
$ git clone [email protected]:wkhtmltopdf/wkhtmltopdf.git
$ cd wkhtmltopdf
$ ./build_osx.sh # i''m running 10.9.2
$ bin/wkhtmltopdf --version
Name:
wkhtmltopdf 0.12.1-72a9f2066fe9ffd162dec007a4d9b6a5cd63b670
$ curl www.example.com | bin/wkhtmltopdf - test.pdf # render pdf of example.com
$ open test.pdf # to confirm pdf
Estoy usando pdfkit 0.6.2
con Rails 3.2.17
. Puse el binario en /vendor
y, en un inicializador de pdfkit
, lo señalé con config.wkhtmltopdf
. Hasta aquí todo bien.
Tengo el mismo problema. Funciona cuando agregué: ''config.threadsafe!'' en application.rb como la respuesta en la pila . Espero que esto ayude.