为什么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
引文:
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.2
和Rails 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是:
-
brew uninstall wkhtmltopdf
- find并删除
/usr/bin
任何wkhtmltopdf
副本 - 在
config/initializers
注释WickedPdf.config
行 - 添加
config.threadsafe!
development.rb
- 删除中间件,允许主控制器的“显示”操作来处理pdf请求(可能不需要)
- 将
wkhtmltopdf-binary
添加到gemfile - 束
- 重启服务器
- 您可能还需要添加
Mime::Type.register_alias "application/pdf", :pdf
到config/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