37

背景

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

问题

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

我在用什么

  • 操作系统:OSX 10.8.1
  • 导轨:3.2.8
  • 红宝石:1.9.3
  • wkhtmltopdf: 0.11.0_rc1 (虽然当我运行wkhtmltopdf -V它说 0.10.0_rc2)
  • 数量:4.8.2

我做了什么

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

它看起来像什么

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

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

当我最终终止 Rails 进程时ctrl-c,PDF 最终显示在浏览器中,正如我所期望的那样(CSS 和 HTML 正确呈现,因此资产似乎加载良好): 在此处输入图像描述

到目前为止的结论

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

请求帮助

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

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

更新

我还尝试过使用另一种在没有中间件选项的情况下呈现 PDF(带有)的替代方法,如下所示(这样做我从我的文件.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
4

7 回答 7

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

然后验证是否安装了正确的版本,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
于 2012-12-26T16:09:04.140 回答
9

试试最后一个版本。在 MacOS 上安装的简单方法:

brew install Caskroom/cask/wkhtmltopdf
于 2016-08-19T21:33:36.793 回答
2

Scarver2的修复对我有用,正如广告中所宣传的那样。但我需要更新版本的wkhtmltopdf. 由于自制版本似乎仍然过时(它仍然挂在命令行上),并且由于没有最近可用的预编译二进制文件,我使用 os x 构建脚本自己编译一个:

$ 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 

我正在pdfkit 0.6.2使用Rails 3.2.17. 我将二进制文件放入/vendor并在pdfkit初始化程序中用config.wkhtmltopdf. 到目前为止,一切都很好。

于 2014-04-09T10:03:41.213 回答
1

我遇到了同样的问题。它在我添加时起作用:'config.threadsafe!' 在 application.rb 作为堆栈中的答案。希望这有帮助。

于 2012-09-23T06:38:07.187 回答
0

我的还挂起并打开了扩展坞中的 wkhtmltopdf 图标。

我实际上发现我的问题是我只运行了 1 个独角兽工作进程。一旦我添加了 1 个以上,它就可以正常工作了。

我正在使用 pdfkit 0.6.2 在 OS X 上运行 wkhtmltopdf 0.9.9

于 2014-07-10T22:59:37.453 回答
0

完全相同的症状,但WickedPdf目前正在使用。在这一点上,我相信问题wkhtmltopdf也存在。

不幸的是,我在 Stack/Google 中找不到的任何建议都对我有用。相反,我需要结合几个建议,包括这篇文章中的一些建议。

解决方案是:

  1. brew uninstall wkhtmltopdf
  2. wkhtmltopdf查找并删除in 的任何副本/usr/bin
  3. 注释WickedPdf.configconfig/initializers
  4. 添加config.threadsafe!development.rb
  5. 删除中间件并允许主控制器的“显示”操作来处理 pdf 请求(可能不是必需的)
  6. 添加wkhtmltopdf-binary到gemfile
  7. 重启服务器
  8. 您可能还需要添加(Mime::Type.register_alias "application/pdf", :pdfconfig/initializers/mime_types.rb我来说,这会导致“警告:已初始化常量 PDF ”)

我的设置是:带有 Rails 3.2.1、Webrick、Postgres 和 wkhtmltopdf-binary (0.9.9.1) 的 Mac OSX Mountain Lion。

于 2013-04-03T23:08:48.500 回答
-2

尝试config/initializer/pdfkit.rb按以下方式编辑:

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
于 2014-05-29T12:15:34.520 回答