17

我正在使用本指南在 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

4 回答 4

42

如何让 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 gem。
  6. 在使用以下源代码config/initializers调用的文件夹中创建一个文件。wicked_pdf.rb
  7. git commit -am 'added wkhtmltopdf binaries and wicked_pdf gem'
  8. git push heroku

您的 Rails 项目现在已针对 Heroku 进行了配置。从这里,为 PDF 文件添加程序逻辑。

** 配置/初始化程序/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 }

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

wkhtmltopdf对于初学者来说,网络上有几篇关于 .gemwicked_pdfHeroku. (10.0+)的最新版本也存在wkhtmltopdf导致执行挂起的问题。

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

我的解决方案你不需要源代码编译wkhtmltopdf。您不需要wkhtmltopdfHomebrew安装。如果您真的想要,我提供了解决方案brew install wkhtmltopdf。您也不需要将任何“wkhtmltopdf”助手gem 添加到您的项目中。我试过wkhtmltopdf, wkhtmltopdf-heroku, wkhtmltopdf-engineyard, wkhtmltopdf-binarygems 和 GitHub repos。在当地工作得很好。Heroku 没有运气。

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

然后,在PDFKit@barlow 对配置的回答中,有一个子注释给出了最终的关键。在提交到 Git 之前,您必须授予 Unix 对二进制文件的执行权限。wkhtmltopdf答对了!

引用:

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

在撰写本文时:

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

2015 年 2 月 12 日修订

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

2015 年 3 月 27 日修订

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

于 2013-05-16T01:36:52.007 回答
6

在查看您的编辑部分后,上面写着“未定义的方法为空?#<Pathname:0x2b...>

这意味着您在某处使用空?在路径对象上运行而为空?是字符串而不是路径的函数。

尝试找出您在哪里使用了路径对象并在该对象上使用 to_s。

试试看。

于 2011-02-24T09:07:57.710 回答
3

如果您将 wkhtmltopdf 的本地副本添加到您的 repo,您​​可以在初始化程序中像这样指向它。

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

记得在你之前在你的仓库中 chmod +x 你的 wkhtmltopdf 副本 - git add it

希望这可以帮助。

于 2011-02-24T00:18:19.790 回答
0

正在寻找 wicked_pdf 二进制文件:/app/fa369291-829b-4b61-9efe-b2f0d0a0a42c/home/bin/wkhtmltopdf-amd64

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

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

如果 wicked_pdf 创建文件,您可能会遇到的另一个问题是 Heroku 文件系统仅被读取,因此除非您找到一种方法告诉 wicked_pdf 在 tmp 目录中创建 pdf,否则您可能无法使用它。

于 2011-02-16T09:10:35.380 回答