在 Heroku 上实现 wicked pdf 的问题

Posted

技术标签:

【中文标题】在 Heroku 上实现 wicked pdf 的问题【英文标题】:problem implementing wicked pdf on heroku 【发布时间】:2011-06-28 04:32:58 【问题描述】:

我正在使用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>)

【问题讨论】:

【参考方案1】:

正在寻找 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,否则您可能无法使用它。

【讨论】:

谢谢。但是我已经做到了二进制文件存在于我的RAILS_ROOT/bin/config/initializers/wicked_pdf.rb 中我已经指定了:exe_path => Rails.root.join('bin', 'wkhtmltopdf-amd64').to_s 但它仍然不起作用 您的回答似乎合法。可能与二进制的平台类型有关吗?我从 Heroku 控制台运行 RUBY_PLATFORM 并得到 => "x86_64-linux" 作为响应。【参考方案2】:

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

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

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

希望这会有所帮助。

【讨论】:

对不起,习惯使用PDFkit我看到wkhtmltopdf,我马上想到PDFkit, 也许 PDFkit 是您真正想要的答案? 不,我需要使用 wicked_pdf :)【参考方案3】:

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

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

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

试试看。

【讨论】:

您可以参考ruby-doc.org/core/classes/String.html和ruby-doc.org/stdlib/libdoc/pathname/rdoc/index.html 谢谢,实际上在 wicked_pdf 配置文件中我使用的是 Rails.root.join('bin', 'wkhtmltopdf-amd64'),这给了我添加了 to_sPATH 对象,它起作用了【参考方案4】:

如何让 WickedPdf gem 在 Heroku 上工作

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

    在 Rails 应用的根目录中创建一个名为 bin 的文件夹。 下载wkhtmltopdf 二进制文件的0.9.9 版本并将其解压缩到bin 文件夹。您将需要开发系统的版本和 Heroku 的 AMD64 版本。 不要添加到你的 git repo 中。 为bin 文件夹中的每个二进制文件设置执行权限,例如chmod +x bin/wkhtmltopdf-amd64 现在git add binwicked_pdf 添加到您的Gemfilebundle install。不需要其他 wkhtmltopdf gem。 使用下面的源代码在config/initializers 文件夹中创建一个名为wicked_pdf.rb 的文件。 git commit -am 'added wkhtmltopdf binaries and wicked_pdf gem' 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 

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

首先,网络上有几篇关于wkhtmltopdfwicked_pdf gem 和Heroku 的误导性文章。 wkhtmltopdf (10.0+) 的最新版本也存在导致执行挂起的问题。

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

我的解决方案不是需要从源代码编译wkhtmltopdf。 您确实不需要需要从 Homebrew 安装 wkhtmltopdf。如果您真的想brew install wkhtmltopdf,我提供了解决方案。 您也确实需要将任何“wkhtmltopdf”helper gem 添加到您的项目中。我尝试了wkhtmltopdfwkhtmltopdf-herokuwkhtmltopdf-engineyardwkhtmltopdf-binary gems 和 GitHub 存储库。在当地工作得很好。 Heroku 运气不好。

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

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

引用:

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

在撰写本文时:

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

2015 年 2 月 12 日修订

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

https://github.com/dscout/wkhtmltopdf-buildpack https://devcenter.heroku.com/articles/buildpacks

于 2015 年 3 月 27 日修订

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

【讨论】:

清晰、简洁的答案。第一次为我工作。非常感谢。 作为更新,首次在 Heroku 上使用以下代码:Rails 4.1.6、wicked_pdf 0.11.0 和 wkhtmltopdf-binary 0.9.9.3 您是如何获得 AMD64 二进制文件的?我看到的只是 Linux 软件包。我提取了 .deb 存档,看起来有链接的依赖项,而不是一个包罗万象的独立二进制文件。 @Dex 感谢您引起我的注意。静态数据已移至此位置:wkhtmltopdf.org/old-downloads.html 我将引用更新为 2015 年 2 月 11 日的新网址。 谢谢。我刚刚尝试使用这个构建包,它似乎工作:github.com/dscout/wkhtmltopdf-buildpack

以上是关于在 Heroku 上实现 wicked pdf 的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在已加载到 PDFView 的 PDF 上实现文本到语音

如何在android上实现PDF的下划线,批注功能

Rails wikedPDF错误。无法生成PDF

如何存根 WickedPdf?

wkhtmltopdf 自动分页符

如何在部署在 heroku 上的解析服务器上使用云代码?