背景
读完后,我觉得 Prawn已出炉 wkhtmltopdf似乎也像 PDFKit和 wicked_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 页面(我模糊了客户端详细信息):
这是当我尝试导航到 localhost:3000/some/path.pdf
时 Rails 的 CLI 输出。 (应用程序在等待响应时挂起):
当我最终使用 ctrl-c
终止 Rails 进程时,PDF 终于如我所愿地显示在浏览器中(CSS 和 HTML 正确渲染,因此资源似乎加载正常):
到目前为止的结论
将 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
引用:
关于ruby-on-rails-3 - 为什么当 Rails 应用程序被终止时,PDFKit/wkhtmltopdf 会挂起,但会按预期呈现 PDF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12517640/