ruby-on-rails-3 - 为什么当 Rails 应用程序被终止时,PDFKit/wkhtmltopdf 会挂起,但会按预期呈现 PDF?

标签 ruby-on-rails-3 pdf osx-mountain-lion wkhtmltopdf pdfkit

背景

读完后,我觉得 Prawn已出炉 wkhtmltopdf似乎也像 PDFKitwicked_pdf Rails 的 gem 很酷。所以我找到了Ryan的截屏视频上how to use PDFKit 。我安装了所有东西,在 CLI 上测试了 wkhtmltopdf 没有任何问题,摆弄 Rails 设置来运行多个进程,以便 Assets 管道工作,一切看起来都很好,除了我仍然停留在进程的最后(实际上获取 PDF来自服务器的响应)。

问题

当我请求 View 的 .pdf 版本时(我正在使用 PDFKit 中间件选项),我的浏览器只是坐在那里等待响应,但一旦我终止了Rails 处理我期望获得的 PDF,然后才在我的浏览器窗口中弹出。给出了什么?

我正在使用什么

  • 操作系统:OSX 10.8.1
  • 导轨:3.2.8
  • ruby :1.9.3
  • wkhtmltopdf:0.11.0_rc1(尽管当我运行wkhtmltopdf -V时它显示0.10.0_rc2)
  • qt:4.8.2

我做了什么

  • 通过在我的 application.rb 文件中加载 config.middleware.use "PDFKit::Middleware" 来使用 PDFKit 中间件。
  • 在我的 Gemfile 中包含 gem 'pdfkit' 并使用 Bundler 安装它
  • 在我的 mime_types.rb 初始值设定项中使用 Mime::Type.register_alias "application/pdf", :pdf 设置 .pdf mime-type
  • config/environments/development.rb 中为多线程添加了 config.threadsafe!,以便资源管道不会与 PDF 引擎发生冲突
  • 测试了 wkhtmltopdf http://www.google.com google.pdf 并按预期生成了 Google 主页的 PDF
  • 尝试将 PDFKit 替换为 wicked_pdf 并遇到相同的问题(挂起,但当 Rails 进程被终止时,PDF 将按预期呈现)

它看起来像什么

这是 Rails 渲染的常规 html 页面(我模糊了客户端详细信息): enter image description here

这是当我尝试导航到 localhost:3000/some/path.pdf 时 Rails 的 CLI 输出。 (应用程序在等待响应时挂起): enter image description here

当我最终使用 ctrl-c 终止 Rails 进程时,PDF 终于如我所愿地显示在浏览器中(CSS 和 HTML 正确渲染,因此资源似乎加载正常): enter image description here

到目前为止的结论

将 PDFKit 替换为 wicked_pdf 并获得相同的结果似乎让我认为问题不在于这些库,而与我的开发环境有关。但是 wkhtmltopdf 在命令行下运行得很好,所以这让我认为它和 QT 正在完成他们的工作。问题一定出在 Rails 上。也许我没有正确配置某些东西?

请求帮助

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

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

更新

我还尝试使用另一种渲染 PDF 的方法(使用 .to_pdf),而不使用中间件选项,如下所示(这样做时我注释掉了 config.middleware.use "PDFKit::Middleware" 来 self 的 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

最佳答案

问题出在 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

然后验证安装了正确的版本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

关于ruby-on-rails-3 - 为什么当 Rails 应用程序被终止时,PDFKit/wkhtmltopdf 会挂起,但会按预期呈现 PDF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12517640/

相关文章:

ruby-on-rails - 两个数组的交集为空

jquery - Rails Jquery 从另一个 js.erb 文件渲染 js.erb 部分

ruby-on-rails - Rails 3 禁用 session cookie

ios - 如何在 iOS 上绘制具有色调和不透明度的单色 PDF?

javascript - 在超过 1000 页的 PDF 文件中搜索文本

macos - 枚举 OS X 上所有已安装的应用程序

Python 输出换行

ruby-on-rails - rake 中止! "filter: progid": expected ";", 之后的无效 CSS 是 ":DXImageTransfo..."

python - 如何让 flask 发送文件然后重定向?

postgresql - Mountain Lion Postgres 无法连接