在heroku上实现wicked pdf的问题

Roh*_*hit 17 pdf-generation ruby-on-rails heroku production-environment wicked-pdf

我正在使用本指南在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'
Run Code Online (Sandbox Code Playgroud)

请帮忙.提前致谢.

编辑:

我在代码中做了一些更改并完成了这个错误,但仍然停留在这里

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

sca*_*er2 38

如何让WickedPdf gem在Heroku上运行

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

  1. 创建一个bin在Rails应用程序的根目录中命名的文件夹.
  2. 下载并提取版本0.9.9中的wkhtmltopdf二进制文件的bin文件夹.您将需要适用于您的开发系统的版本和适用于Heroku的AMD64版本.不要添加到您的git回购呢.
  3. bin文件夹中的每个二进制文件设置执行权限,例如chmod +x bin/wkhtmltopdf-amd64
  4. 现在 git add bin
  5. 添加wicked_pdf到您的Gemfilebundle install.不需要其他wkhtmltopdf宝石.
  6. 使用下面的源代码在config/initializers调用的文件夹中创建一个文件wicked_pdf.rb.
  7. git commit -am 'added wkhtmltopdf binaries and wicked_pdf gem'
  8. git push heroku

您的Rails项目现在已配置为Heroku.从这里,添加PDF文件的程序逻辑.

**config/initializers/wicked_pdf.rb**

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 }
Run Code Online (Sandbox Code Playgroud)

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

对于初学者来说,有关于网络的几个误导性的文章wkhtmltopdf中,wicked_pdf宝石,和Heroku.最新版本的wkhtmltopdf(10.0+)也存在导致执行挂起的问题.

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

我的解决方案,你就不会需要编译wkhtmltopdf从源代码.你没有需要安装wkhtmltopdf的自制.如果你真的想,我提供了解决方案brew install wkhtmltopdf.您也不需要在项目中添加任何'wkhtmltopdf' 辅助宝石.我试过wkhtmltopdf,wkhtmltopdf-heroku,wkhtmltopdf-engineyard,wkhtmltopdf-binary宝石和GitHub的回购协议.在当地工作得很好.Heroku没有运气.

从Heroku上的Rails控制台:我通过运行RUBY_PLATFORM产生了什么来调查运行Heroku服务器的CPU "x86_64-linux".我还bin通过发出Dir.entries('bin')查看实际存在的文件来查看Heroku上的文件夹.我注意到wkhtmltopdf我测试的一些宝石将它们的可执行文件放在这个文件夹中.线索!我跑去WickedPdf.new.pdf_from_string('Hello')查看输出错误并测试各种WickedPdf配置.

然后,在@ barlow的配置答案中PDFKit,有一个子笔记给出了最终的关键.在提交给Git之前,你必须wkhtmltopdf二进制文件执行Unix执行权限.答对了!

引用:

  1. 官方wkhtmltopdf遗留静态二进制文件http://wkhtmltopdf.org/old-downloads.html
  2. wicked_pdf https://github.com/mileszs/wicked_pdf
  3. Barlow的PDFKit.config /sf/answers/356928911/
  4. 如何使用自制`安装wkhtmltopdf /sf/answers/983015981/

在撰写本文时:

  • 铁轨(3.2.13)
  • wicked_pdf(0.9.6)
  • wkhtmltopdf(0.9.9)

2015年12月2日修订

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

2015年3月27日修订

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


小智 5

看完你的编辑部分后面写着"未定义的方法为空? #<Pathname:0x2b...>

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

尝试找出你在哪里使用路径对象并在该对象上使用to_s.

试试看.

  • 谢谢,实际上在wicked_pdf配置文件中,我使用的是`Rails.root.join('bin','wkhtmltopdf-amd64')`,这给了我``PATH`对象添加`to_s`给它,它工作了 (2认同)