Why does PDFKit/wkhtmltopdf hang but renders PDF a

2019-01-13 00:31发布

Background

After reading around it seemed to me that Prawn is out and wkhtmltopdf is in. It also seems like the PDFKit and wicked_pdf gems for Rails are the new cool. So I found a screencast by Ryan on how to use PDFKit. I installed everything, tested wkhtmltopdf on the CLI with no problems, fiddled around with Rails settingsto run multiple processes so the asset pipeline works, and all seemed good, except I'm still stuck at the very end of the process (actually getting the PDF response from the server).

Question

When I request a .pdf version of my view (I'm using the PDFKit Middleware option) my browser just sits there waiting for a response, but as soon as I kill the Rails process the PDF I expected to get only then pops up in my browser window. What gives?

What I'm Using

  • OS: OSX 10.8.1
  • Rails: 3.2.8
  • Ruby: 1.9.3
  • wkhtmltopdf: 0.11.0_rc1 (although when I run wkhtmltopdf -V it says 0.10.0_rc2)
  • qt: 4.8.2

What I've Done

  • used the PDFKit middleware by loading config.middleware.use "PDFKit::Middleware" in my application.rb file.
  • included gem 'pdfkit' in my Gemfile and installed it with Bundler
  • set the .pdf mime-type in my mime_types.rb initializer with Mime::Type.register_alias "application/pdf", :pdf
  • added config.threadsafe! to config/environments/development.rb for multiple threads so asset pipeline doesn't conflict with PDF engine
  • tested wkhtmltopdf http://www.google.com google.pdf and it generated a PDF of the Google homepage as expected
  • tried swapping PDFKit for wicked_pdf and encountered the same problem (hanging, but when Rails process is killed the PDF renders as expected)

What it Looks Like

This is the regular html page rendered by Rails (I've blurred the client details): enter image description here

This is the CLI output by Rails when I try to navigate to localhost:3000/some/path.pdf. (the app hangs while waiting for a response): enter image description here

When I finally kill the Rails process with ctrl-c the PDF finally shows up in the browser as I expected to see it (CSS and HTML rendered properly, so assets seem to load fine): enter image description here

Conclusions So Far

Swapping PDFKit for wicked_pdf and getting the same results seems to make me think the problem isn't with those libraries, but something to do with my development environment. But wkhtmltopdf runs fine off the command line, so that makes me think that it and QT are doing their job. The problem must be in Rails. Maybe I'm not configuring something properly?

Plea for Help

How do I determine what exactly the problem is and how do I fix it?

I'll love you if you can help me <3

Update

I've also tried using an alternative method of rendering the PDF (with .to_pdf) without the middleware option as follows (doing this I commented out config.middleware.use "PDFKit::Middleware" from my application.rb file):

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

7条回答
我欲成王,谁敢阻挡
2楼-- · 2019-01-13 01:07

Try the last version. The easy way install on MacOS:

brew install Caskroom/cask/wkhtmltopdf
查看更多
手持菜刀,她持情操
3楼-- · 2019-01-13 01:11

The fix by scarver2 worked for me as advertised. But I needed a more recent version of wkhtmltopdf. Since the homebrew version still seems outdated (it still hangs on the command line), and since there isn't a recent precompiled binary available, I used the os x build script to compile one myself:

$ git clone git@github.com: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 

I'm using pdfkit 0.6.2 with Rails 3.2.17. I put the binary in /vendor and, in a pdfkit initializer, pointed to it with config.wkhtmltopdf. So far, so good.

查看更多
聊天终结者
4楼-- · 2019-01-13 01:12

Try editing config/initializer/pdfkit.rb in the following way:

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
查看更多
唯我独甜
5楼-- · 2019-01-13 01:16

Exact same symptoms but using WickedPdf currently. At this point, I believe the issue lies with wkhtmltopdf as well.

Unfortunately, neither of the recommendations I've been able to find in Stack/Google worked for me. Instead, I needed to combine several suggestions, including some found in this post.

Solution was:

  1. brew uninstall wkhtmltopdf
  2. find and delete any copies of wkhtmltopdf in /usr/bin
  3. comment WickedPdf.config line in config/initializers
  4. add config.threadsafe! to development.rb
  5. remove middleware and allow 'show' action of main controller to handle pdf requests (may not be necessary)
  6. add wkhtmltopdf-binary to gemfile
  7. bundle
  8. restart server
  9. You may also need to add Mime::Type.register_alias "application/pdf", :pdf to config/initializers/mime_types.rb (for me, this causes 'warning: already initialized constant PDF')

My set-up was: Mac OSX Mountain Lion with Rails 3.2.1, Webrick, Postgres and wkhtmltopdf-binary (0.9.9.1).

查看更多
该账号已被封号
6楼-- · 2019-01-13 01:23

I got the same issue. It works when I added: 'config.threadsafe!' in application.rb as the answer in the stack. Hope this help.

查看更多
做个烂人
7楼-- · 2019-01-13 01:24

The problem is with wkhtmltopdf itself, specifically, any version after 0.9.9. wkhtmltopdf hangs when run directly from the command-line.

Steps to correct:

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

Then verify the correct version is installed wkhtmltopdf --version which should yield 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
查看更多
登录 后发表回答