首页 文章

为什么PDFKit / wkhtmltopdf挂起但是在Rails应用程序被杀死时按预期呈现PDF?

提问于
浏览
37

背景

在看完之后,我觉得Prawn已经出局了wkhtmltopdf . 看起来Rails的PDFKitwicked_pdf宝石似乎是新的酷 . 所以我在how to use PDFKit上找到了Ryan的截屏视频 . 我安装了所有东西,在CLI上测试wkhtmltopdf没有问题,摆弄Rails设置运行多个进程,所以资产管道工作,一切看起来都很好,除了我仍然停留在过程的最后(实际上得到PDF来自服务器的响应) .

问题

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

我正在使用什么

  • 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", :pdfmime_types.rb 初始化程序中设置 .pdf mime-type

  • 为多个线程添加了 config.threadsafe!config/environments/development.rb ,因此资产管道与PDF引擎不冲突

  • 测试 wkhtmltopdf http://www.google.com google.pdf 并按预期生成了Google主页的PDF

  • 尝试为wicked_pdf交换PDFKit并遇到了同样的问题(挂起,但是当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

结论到目前为止

为wicked_pdf交换PDFKit并获得相同的结果似乎让我觉得问题不在于那些库,而是与我的开发环境有关 . 但是wkhtmltopdf在命令行上运行良好,这让我觉得它和QT正在完成它们的工作 . 问题必须在Rails中 . 也许我没有正确配置?

请求帮助

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

如果你能帮助我,我会爱你的<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

7 回答

  • 7

    我还挂着并打开了码头上的wkhtmltopdf图标 .

    我实际上发现问题在于我只有1个独角兽工作进程在运行 . 一旦我添加超过1,它工作正常 .

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

  • 2

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

    试试最新版本 . 在MacOS上安装的简便方法:

    brew install Caskroom/cask/wkhtmltopdf
    
  • 70

    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 指向它 . 到现在为止还挺好 .

  • 0

    我遇到了同样的问题 . 当我在application.rb中添加:'config.threadsafe!'作为the stack中的答案时,它可以正常工作 . 希望这有帮助 .

  • 0

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

    不幸的是,我在Stack / Google中找到的建议都没有为我工作 . 相反,我需要结合几个建议,包括本文中的一些建议 .

    解决方案是:

    • brew uninstall wkhtmltopdf

    • /usr/bin 中查找并删除 wkhtmltopdf 的任何副本

    • 评论 WickedPdf.config 一行 config/initializers

    • config.threadsafe! 添加到 development.rb

    • 删除中间件并允许主控制器的'show'动作来处理pdf请求(可能没有必要)

    • wkhtmltopdf-binary 添加到gemfile

    • 捆绑

    • 重启服务器

    • 您可能还需要将 Mime::Type.register_alias "application/pdf", :pdf 添加到 config/initializers/mime_types.rb (对我来说,这会导致'警告:已初始化常量PDF')

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

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

相关问题