web-dev-qa-db-fra.com

Pourquoi PDFKit/wkhtmltopdf se bloque-t-il mais rend-il PDF comme prévu lorsque l'application Rails est tuée?

Contexte

Après avoir lu autour de moi, il m'a semblé que Prawn est sorti et wkhtmltopdf est entré. Il semble également que le PDFKit et wicked_pdf les gemmes pour Rails sont le nouveau cool. J'ai donc trouvé un screencast de Ryan sur comment utiliser PDFKit . J'ai tout installé, testé wkhtmltopdf sur la CLI sans aucun problème, manipulé les paramètres Rails pour exécuter plusieurs processus afin que le pipeline d'actifs fonctionne, et tout semblait bien aller, sauf que je suis toujours bloqué à la toute fin du processus PDF réponse du serveur).

Question

Lorsque je demande une version .pdf de ma vue (j'utilise l'option PDFKit Middleware), mon navigateur reste dans l'attente d'une réponse, mais dès que je tue les Rails, je traite PDF I attendu que alors seulement apparaît dans la fenêtre de mon navigateur. Ce qui donne?

Ce que j'utilise

  • OS: OSX 10.8.1
  • Rails: 3.2.8
  • Rubis: 1.9.3
  • wkhtmltopdf: 0.11.0_rc1 (même si quand je lance wkhtmltopdf -V, il est écrit 0.10.0_rc2)
  • qt: 4.8.2

Ce que j'ai fait

  • utilisé le middleware PDFKit en chargeant config.middleware.use "PDFKit::Middleware" dans mon fichier application.rb.
  • gem 'pdfkit' inclus dans mon Gemfile et installé avec Bundler
  • définir le .pdf mime-type dans mon initialiseur mime_types.rb avec Mime::Type.register_alias "application/pdf", :pdf
  • ajout de config.threadsafe! à config/environments/development.rb pour plusieurs threads afin que le pipeline d'actifs n'entre pas en conflit avec le moteur PDF
  • testé wkhtmltopdf http://www.google.com google.pdf et généré comme prévu un PDF de la page d'accueil Google
  • essayé d'échanger PDFKit pour wicked_pdf et rencontre le même problème (blocage, mais lorsque le processus Rails est tué, le PDF s'affiche comme prévu)

À quoi il ressemble

Voici la page html standard rendue par Rails (j'ai brouillé les détails du client): enter image description here

Il s'agit de la sortie de la CLI par Rails lorsque j'essaie d'accéder à localhost:3000/some/path.pdf. (l'application se bloque en attendant une réponse): enter image description here

Lorsque je supprime enfin le processus Rails avec ctrl-c, le PDF s'affiche enfin dans le navigateur tel que je m'attendais à le voir (CSS et HTML restitués correctement, les ressources semblent donc se charger correctement): enter image description here

Conclusions jusqu'ici

Echanger PDFKit pour wicked_pdf et obtenir les mêmes résultats me laisse penser que le problème ne concerne pas ces bibliothèques, mais que cela a un rapport avec mon environnement de développement. Mais wkhtmltopdf fonctionne correctement en ligne de commande, ce qui me laisse penser que QT et lui font leur travail. Le problème doit être dans Rails. Peut-être que je ne configure pas correctement quelque chose?

Plaidoyer pour l'aide

Comment puis-je déterminer quel le problème est exact et comment le résoudre?

Je t'aimerai si tu peux m'aider <3

Mettre à jour

J'ai également essayé d'utiliser une méthode alternative pour rendre le PDF (avec .to_pdf) sans l'option de middleware comme suit (en procédant ainsi, j'ai commenté config.middleware.use "PDFKit::Middleware" à partir de mon fichier 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
37
robmclarty

Le problème vient de wkhtmltopdf lui-même, en particulier de toute version postérieure à 0.9.9. wkhtmltopdf se bloque lorsqu'il est exécuté directement à partir de la ligne de commande.

Étapes à suivre pour corriger:

brew uninstall wkhtmltopdf
cd /usr/local/Library/Formula/
git checkout 6e2d550 /usr/local/Library/Formula/wkhtmltopdf.rb
brew install wkhtmltopdf

Puis vérifiez que la version correcte est installée wkhtmltopdf --version, ce qui devrait donner wkhtmltopdf 0.9.9

Citations:

  1. https://github.com/mileszs/wicked_pdf/issues/110
  2. http://wearepandr.com/blog/article/homebrew-and-installing-old-package-versions#blog_nav
70
scarver2

Essayez la dernière version. Le moyen facile d'installer sur MacOS: 

brew install Caskroom/cask/wkhtmltopdf
8
Abel

Le correctif de scarver2 a fonctionné pour moi comme annoncé. Mais il me fallait une version plus récente de wkhtmltopdf. Étant donné que la version homebrew semble toujours obsolète (elle est toujours suspendue à la ligne de commande) et qu’aucun fichier binaire précompilé récent n’est disponible, j’ai utilisé le script os x build pour le compiler moi-même:

$ 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 

J'utilise pdfkit 0.6.2 avec Rails 3.2.17. Je mets le binaire dans /vendor et, dans un initialiseur pdfkit, je le pointe avec config.wkhtmltopdf. Jusqu'ici tout va bien. 

2
user778174

J'ai le même problème. Cela fonctionne quand j'ai ajouté: 'config.threadsafe!' dans application.rb comme réponse dans la pile . J'espère que cette aide.

1
Jacky

Exactement les mêmes symptômes mais en utilisant WickedPdf pour le moment. À ce stade, j'estime que le problème réside également dans wkhtmltopdf.

Malheureusement, aucune des recommandations que j'ai pu trouver dans Stack/Google n'a fonctionné pour moi. Au lieu de cela, je devais combiner plusieurs suggestions, y compris celles trouvées dans ce post.

La solution était:

  1. brew uninstall wkhtmltopdf
  2. rechercher et supprimer des copies de wkhtmltopdf dans /usr/bin
  3. commentaire WickedPdf.config ligne dans config/initializers
  4. ajouter config.threadsafe! à development.rb
  5. supprime le middleware et autorise l'action 'show' du contrôleur principal à gérer les requêtes pdf (peut ne pas être nécessaire)
  6. ajouter wkhtmltopdf-binary à gemfile
  7. paquet
  8. redémarrer le serveur
  9. Vous devrez peut-être aussi ajouter Mime::Type.register_alias "application/pdf", :pdf à config/initializers/mime_types.rb (pour moi, cela provoque " avertissement: constante déjà initialisée PDF ').

Ma configuration était: Mac OSX Mountain Lion avec Rails 3.2.1, Webrick, Postgres et wkhtmltopdf-binary (0.9.9.1).

0
Zorak

Le mien était également suspendu et ouvrait l'icône wkhtmltopdf dans le dock.

En fait, j'ai constaté que le problème était que je n'avais qu'un seul processus de travail Unicorn en cours d'exécution. Une fois que j'en ai ajouté plus d'un, cela a bien fonctionné.

J'exécute wkhtmltopdf 0.9.9 sur OS X avec pdfkit 0.6.2

0
Bob Fleming