为什么PDFKit/wkhtmltopdf挂起但是在Rails应用程序被杀死时按预期呈现PDF?

rob*_*rty 37 pdf pdfkit wkhtmltopdf ruby-on-rails-3 osx-mountain-lion

背景

在阅读之后,在我看来Prawn已经出局并且wkhtmltopdf已经进入.看起来Rails 的PDFKitwicked_pdf宝石也是新的酷.所以我发现了Ryan关于如何使用PDFKit的截屏视频.我安装了所有东西,在CLI上测试wkhtmltopdf没有任何问题,摆弄Rails设置运行多个进程,所以资产管道工作,一切似乎都很好,除了我仍然停留在过程的最后(实际上得到PDF来自服务器的响应).

当我请求.pdf我的视图版本(我正在使用PDFKit中间件选项)时,我的浏览器就坐在那里等待响应,但是一旦我杀死了Rails进程,我希望得到的PDF只会在我的浏览器中弹出窗口.是什么赋予了?

我在用什么

  • 操作系统:OSX 10.8.1
  • Rails:3.2.8
  • Ruby:1.9.3
  • wkhtmltopdf:0.11.0_rc1(虽然当我运行wkhtmltopdf -V它时说0.10.0_rc2)
  • qt:4.8.2

我做了什么

  • 通过加载config.middleware.use "PDFKit::Middleware"我的application.rb文件使用PDFKit中间件.
  • 包含gem 'pdfkit'在我的Gemfile中并与Bundler一起安装
  • .pdf用我的mime_types.rb初始化程序设置mime-typeMime::Type.register_alias "application/pdf", :pdf
  • 添加config.threadsafe!config/environments/development.rb多个线程,因此资产管道不与PDF引擎冲突
  • 经过测试wkhtmltopdf http://www.google.com google.pdf,它按预期生成了Google主页的PDF
  • 尝试交换wicked_pdf的PDFKit并遇到同样的问题(挂起,但是当Rails进程被杀死时,PDF会按预期呈现)

它看起来像什么

这是由Rails呈现的常规html页面(我已经模糊了客户端详细信息): 在此输入图像描述

当我尝试导航到时,这是Rails的CLI输出localhost:3000/some/path.pdf.(应用程序在等待响应时挂起): 在此输入图像描述

当我最终杀死Rails进程时ctrl-c,PDF终于出现在浏览器中,因为我期望看到它(CSS和HTML正确呈现,所以资产似乎加载正常): 在此输入图像描述

结论到目前为止

为wicked_pdf交换PDFKit并获得相同的结果似乎让我觉得问题不在于那些库,而是与我的开发环境有关.但是wkhtmltopdf在命令行中运行良好,这让我觉得它和QT正在完成它们的工作.问题必须在Rails中.也许我没有正确配置?

请求帮助

如何确定问题到底是什么以及如何解决?

如果你能帮助我,我会爱你的<3

更新

我也尝试过使用另一种方法来渲染PDF(with .to_pdf)而没有中间件选项,如下所示(这样做我config.middleware.use "PDFKit::Middleware"从我的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
Run Code Online (Sandbox Code Playgroud)

sca*_*er2 70

问题出在wkhtmltopdf本身,特别是0.9.9之后的任何版本.wkhtmltopdf直接从命令行运行时挂起.

纠正的步骤:

brew uninstall wkhtmltopdf
cd /usr/local/Library/Formula/
git checkout 6e2d550 /usr/local/Library/Formula/wkhtmltopdf.rb
brew install wkhtmltopdf
Run Code Online (Sandbox Code Playgroud)

然后验证是否安装wkhtmltopdf --version了应该产生的正确版本wkhtmltopdf 0.9.9

引文:

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

  • 单个命令中的步骤2-4:`brew install https:// raw.github.com/mxcl/homebrew/6e2d550cf4961129a790bfb0973f8e88704f439d/Library/Formula/wkhtmltopdf.rb` (6认同)
  • gemfile"``gem'wkhtmltopdf-binary'```目前为那些有兴趣使用gem而不是brew的人安装了0.9.9 (4认同)
  • 如果你安装了Ruby,你可以绕过所有这个Homebrew操作,只需`gem install wkhtmltopdf`.删除现有的Homebrew符号链接:`rm/usr/local/bin/wkhtmltopdf`.然后链接到gem的二进制文件,例如`ln -s~/.rvm/gems/ruby​​-2.0.0-p0/bin/wkhtmltopdf/usr/local/bin/wkhtmltopdf`.使用`which wkhtmltopdf`命令查找二进制文件.将"gem"wkhtmltopdf"添加到GemFile中.如果使用`wicked_pdf` gem,请将其配置设置为`WickedPdf.config = {exe_path:'/ usr/local/bin/wkhtmltopdf'}`.参考文献:wkhtmltopdf gem(0.1.2)安装wkhtmltopdf二进制版本0.8.3补丁qt. (3认同)
  • @Marklar`wkhtmltopdf_binary` gem实际绕过任何Homebrew安装并使用gem的bin文件夹中找到的版本.作者Dmitry Rocha一直在保持二进制文件. (2认同)

Abe*_*bel 8

试试最新版本.在MacOS上安装的简便方法:

brew install Caskroom/cask/wkhtmltopdf
Run Code Online (Sandbox Code Playgroud)