在heroku上实现wicked pdf的问题

时间:2011-02-16 08:07:53

标签: ruby-on-rails heroku pdf-generation production-environment wicked-pdf

我正在使用this guide在heroku上集成wicked_pdf。但不知何故它似乎不起作用。我从heroku获得了日志,它说:

Processing PdfController#get_pdf to pdf (for 115.248.175.50 at 2011-02-15 23:54:44) [GET]
  Parameters: {"format"=>"pdf", "action"=>"get_pdf", "id"=>"1", "controller"=>"pdf"}
***************WICKED***************
Rendering pdf/get_pdf

RuntimeError (PDF could not be generated!
/usr/ruby1.8.7/lib/ruby/1.8/open3.rb:73:in `exec': No such file or directory - /app/fa369291-829b-4b61-9efe-b2f0d0a0a42c/home/bin/wkhtmltopdf-amd64       - -  (Errno::ENOENT)
    from /usr/ruby1.8.7/lib/ruby/1.8/open3.rb:73:in `popen3'
    from /usr/ruby1.8.7/lib/ruby/1.8/open3.rb:59:in `fork'
    from /usr/ruby1.8.7/lib/ruby/1.8/open3.rb:59:in `popen3'
    from /usr/ruby1.8.7/lib/ruby/1.8/open3.rb:57:in `fork'
    from /usr/ruby1.8.7/lib/ruby/1.8/open3.rb:57:in `popen3'
    from /app/fa369291-829b-4b61-9efe-b2f0d0a0a42c/home/vendor/plugins/wicked_pdf/lib/wicked_pdf.rb:22:in `pdf_from_string'
    from /app/fa369291-829b-4b61-9efe-b2f0d0a0a42c/home/vendor/plugins/wicked_pdf/lib/pdf_helper.rb:28:in `make_pdf'
    from /app/fa369291-829b-4b61-9efe-b2f0d0a0a42c/home/vendor/plugins/wicked_pdf/lib/pdf_helper.rb:39:in `make_and_send_pdf'
    from /app/fa369291-829b-4b61-9efe-b2f0d0a0a42c/home/vendor/plugins/wicked_pdf/lib/pdf_helper.rb:13:in `render'
    from /app/fa369291-829b-4b61-9efe-b2f0d0a0a42c/home/app/controllers/schedule_controller.rb:33:in `get_pdf'

请帮助。在此先感谢。

修改

我在代码中做了一些更改并完成了此错误但仍然停留在此处

NoMethodError (undefined method empty? for #<Pathname:0x2b7112392480>)

4 个答案:

答案 0 :(得分:38)

如何让WickedPdf gem在Heroku上工作

(请参阅以下引用的网址)

  1. 在Rails应用的根目录中创建名为bin的文件夹。
  2. wkhtmltopdf二进制文件的 0.9.9 版本下载并解压缩到bin文件夹。您将需要适用于您的开发系统的版本和适用于Heroku的AMD64版本。 尚未添加到您的git仓库。
  3. bin文件夹中的每个二进制文件设置执行权限,例如chmod +x bin/wkhtmltopdf-amd64
  4. 现在git add bin
  5. wicked_pdf添加到您的Gemfilebundle install。不需要其他wkhtmltopdf宝石。
  6. 在名为config/initializers的{​​{1}}文件夹中创建一个文件,其中包含以下源代码。
  7. wicked_pdf.rb
  8. git commit -am 'added wkhtmltopdf binaries and wicked_pdf gem'
  9. 您的Rails项目现已配置为Heroku。从这里,添加PDF文件的程序逻辑。

    ** config / initializers / wicked_pdf.rb **

    git push heroku

    我是如何得出这个结论的:

    首先,网上有关于if Rails.env.production? wkhtmltopdf_path = "#{Rails.root}/bin/wkhtmltopdf-amd64" else # Linux (check your processor for Intel x86 or AMD x64) # wkhtmltopdf_path = "#{Rails.root}/bin/wkhtmltopdf-amd64" # wkhtmltopdf_path = "#{Rails.root}/bin/wkhtmltopdf-i386" # OS X wkhtmltopdf_path = "#{Rails.root}/bin/wkhtmltopdf-0.9.9-OS-X.i386" # Windows # wkhtmltopdf_path = 'C:\Program Files/wkhtmltopdf/wkhtmltopdf.exe' end WickedPdf.config = { exe_path: wkhtmltopdf_path, wkhtmltopdf: wkhtmltopdf_path } wkhtmltopdf宝石和wicked_pdf的一些误导性文章。 最新版本的Heroku(10.0+)也存在导致执行挂起的问题。

    最后,在某些时候,wkhtmltopdf的配置变量名称必定会发生变化,因为有些文章引用WickedPdf而其他文章引用:exe_path。 甚至WickedPdf的GitHub文档也在每个变量之间交替。

    我做的的解决方案需要从源代码编译:wkhtmltopdf。 您需要从Homebrew安装wkhtmltopdf。如果你真的想wkhtmltopdf,我提供了解决方案。 你也需要在项目中添加任何'wkhtmltopdf' helper 宝石。我尝试了brew install wkhtmltopdfwkhtmltopdfwkhtmltopdf-herokuwkhtmltopdf-engineyard宝石和GitHub回购。在当地工作得很好。 Heroku没有运气。

    从Heroku上的Rails控制台: 我通过运行产生wkhtmltopdf-binary的{​​{1}}来调查运行Heroku服务器的CPU。 我还通过发出RUBY_PLATFORM来查看Heroku上的"x86_64-linux"文件夹,看看那里有哪些文件。我注意到我测试的一些bin宝石将它们的可执行文件放在这个文件夹中。线索! 我运行Dir.entries('bin')来查看输出错误并测试各种WickedPdf配置。

    然后,在@ barlow对配置wkhtmltopdf的回答中,有一个子句给出了最终的关键。在提交给Git之前,必须给予WickedPdf.new.pdf_from_string('Hello')二进制文件的Unix执行权限。宾果!

    引用:

    1. 官方wkhtmltopdf旧版静态二进制文件http://wkhtmltopdf.org/old-downloads.html
    2. wicked_pdf https://github.com/mileszs/wicked_pdf
    3. Barlow的PDFKit.config https://stackoverflow.com/a/5098984/307308
    4. 如何使用Homebrew` https://stackoverflow.com/a/14043085/307308
    5. 安装wkhtmltopdf

      撰写本文时:

      • rails(3.2.13)
      • wicked_pdf(0.9.6)
      • wkhtmltopdf(0.9.9)

      2015年2月12日修订

      dscout开发了一个包含我的答案概念的宝石。如果您的Heroku实例支持buildpack,我建议使用gem。

      2015年3月27日修订

      与Heroku(和Linux AMD64操作系统)一起使用的另一个gem wkhtmltopdf-heroku 它会自动检测是否安装了pdfkit,wicked_pdf和wisepdf gems。

答案 1 :(得分:5)

查看编辑部分,其中“未定义的方法为空?对于#<Pathname:0x2b...>

这意味着你在某个地方使用空?路径上的函数对象是空的吗?是字符串而不是路径的函数。

尝试找出使用路径Object的位置并在该对象上使用to_s。

尝试一下。

答案 2 :(得分:3)

如果您将wkhtmltopdf的本地副本添加到您的仓库,您可以在初始化程序中指向它。

PDFKit.configure do |config|
config.wkhtmltopdf = "#{RAILS_ROOT}/lib/wkhtmltopdf"
end

记得在你的回购之前chmod + x你的wkhtmltopdf副本 - git add it

希望这有帮助。

答案 3 :(得分:0)

正在寻找:/app/fa369291-829b-4b61-9efe-b2f0d0a0a42c/home/bin/wkhtmltopdf-amd64

中的wicked_pdf二进制文件

并不存在,将二进制文件放在应用程序的文件夹中,然后将文件config/initializers/wicked_pdf.rb更改为包括:

:exe_path => "#{Rails.root}/path/to/wkhtmltopdf-amd64"

如果wicked_pdf创建文件,你可能遇到的另一个问题是Heroku文件系统只能读取,所以除非你找到一种方法告诉wicked_pdf在tmp目录中创建pdfs,否则你可能无法使用它。