为什么PDFKit / wkhtmltopdf挂起,但如果Rails应用程序被杀死,则按预期呈现PDF?

背景

看了看周围,我觉得虾是出来, wkhtmltopdf是在。它似乎像PDFKit和Rails的wicked_pdfgem是新的酷。 所以我find了Ryan关于如何使用PDFKit的截屏video。 我安装了所有东西,在CLI上testing了wkhtmltopdf,没有任何问题,摆弄Rails设置,运行多个进程,以便资产pipe道工作,并且一切似乎都很好,除了我仍然在进程的最后阶段(实际上获取PDF来自服务器的响应)。

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

我正在使用什么

  • OS: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

我做了什么

  • 通过在我的application.rb文件中加载config.middleware.use "PDFKit::Middleware"来使用PDFKit中间件。
  • 在我的Gemfile中包含gem 'pdfkit' ,并将其与Bundler一起安装
  • 使用Mime::Type.register_alias "application/pdf", :pdf设置.pdf mime-type在我的mime_types.rb初始化Mime::Type.register_alias "application/pdf", :pdf
  • 添加config.threadsafe! 为multithreadingconfig/environments/development.rb ,以便资产pipe道不与PDF引擎冲突
  • testing了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 for wicked_pdf并得到相同的结果似乎让我觉得这个问题不在这些库中,而是与我的开发环境有关。 但是wkhtmltopdf在命令行中运行良好,所以这让我觉得它和QT正在做他们的工作。 问题必须在Rails中。 也许我没有正确configuration一些东西?

请求帮助

我如何确定究竟什么问题,如何解决?

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

更新

我也尝试过使用不带中间件选项的PDF(使用.to_pdf )的替代方法,如下所示(这样我从application.rb文件中注释掉config.middleware.use "PDFKit::Middleware" ):

 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 

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

MacOS上的简单方法:

 brew install Caskroom/cask/wkhtmltopdf 

scarver2的修复工作为我广告。 但是我需要更新版本的wkhtmltopdf 。 由于自制软件版本似乎仍然过时(它仍然挂在命令行上),并且由于没有可用的最近预编译二进制文件,所以我使用os x build脚本自己编译一个:

 $ 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.2Rails 3.2.17 。 我把二进制文件放在/vendor ,在一个pdfkit初始化程序中,用config.wkhtmltopdf指向它。 到现在为止还挺好。

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

我也挂了,并在docker打开wkhtmltopdf图标。

其实我发现问题是我只有1个独angular兽工作进程在运行。 一旦我添加超过1,它工作正常。

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

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

不幸的是,我在Stack / Google中找不到的build议都是为我工作的。 相反,我需要结合几个build议,包括在这篇文章中find的一些。

解决scheme是:

  1. brew uninstall wkhtmltopdf
  2. find并删除/usr/bin任何wkhtmltopdf副本
  3. config/initializers注释WickedPdf.config
  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

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

尝试按以下方式编辑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