【问题标题】:generating pdf hangs on rails 4 using PDFkit gem使用 PDFkit gem 生成 pdf 在 Rails 4 上挂起
【发布时间】:2013-07-28 07:37:19
【问题描述】:

我可以通过以下方式下载 pdf 文件:

curl google.com | wkhtmltopdf - test.pdf

也就是说,wkhtmlpdf安装成功了。

但是,当我尝试通过访问 http://localhost:3000/contacts/1.pdf 来生成 pdf 文件时,它会挂起。在状态栏中显示:Waiting for localhost...

Rails 服务器输出:

Started GET "/contacts/1.pdf" for 127.0.0.1 at 2013-07-28 21:45:06 +0900
  ActiveRecord::SchemaMigration Load (0.1ms)  SELECT "schema_migrations".* FROM "schema_migrations"
Processing by ContactsController#show as HTML
  Parameters: {"id"=>"1"}
  Contact Load (0.3ms)  SELECT "contacts".* FROM "contacts" WHERE "contacts"."id" = ? LIMIT 1  [["id", "1"]]
  Rendered contacts/show.html.erb within layouts/application (1.4ms)
Completed 200 OK in 99ms (Views: 57.0ms | ActiveRecord: 0.7ms)

宝石文件:

gem 'pdfkit'

应用程序.rb:

config.middleware.use "PDFKit::Middleware"

根据PDFKit railscast,这应该足以生成pdf文件,只需添加.pdf ...


更新:

show.html.erb:

<p id="notice"><%= notice %></p>

<p>
  <strong>Name:</strong>
  <%= @contact.name %>
</p>

<p>
  <strong>Age:</strong>
  <%= @contact.age %>
</p>

<%= link_to 'Edit', edit_contact_path(@contact) %> |
<%= link_to 'Back', contacts_path %>

布局/application.html.erb:

<!DOCTYPE html>
<html>
<head>
  <title>Pdftest</title>
  <%= stylesheet_link_tag    "application", media: "all", "data-turbolinks-track" => true %>
  <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
  <%= csrf_meta_tags %>
</head>
<body>

<%= yield %>

</body>
</html>

更新 2:

感谢@Arman H 帮助我弄清楚我必须为资产指定绝对路径而不是相对路径。当我删除以下行时,我能够生成 PDF 文件:

<%= stylesheet_link_tag    "application", media: "all", "data-turbolinks-track" => true %>
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>

现在,我不知道如何用绝对路径替换它。看来 post 是我需要的,但我仍然无法弄清楚这对于我的情况来说会是什么样子。

【问题讨论】:

  • 挂了多久?在 Rails 的控制台中,您是否收到来自 wkhtmltopdf 的任何错误?有时它似乎挂起,但实际上处理 PDF 需要很长时间。在切断请求之前,它运行了多长时间?
  • 我在 Mac OS x 上遇到的上述问题。现在我在 Linux Mint 上也有同样的情况。它仍然“等待本地主机...” 20 分钟,似乎这将是无止境的。我只需要按 Ctrl + c 取消服务器。
  • 当我在 40 分钟后关闭服务器时,它为我生成了 pdf 文件。我在 1 分钟后再次尝试关闭服务器,在这种情况下它显示:命令失败:/usr/bin/wkhtmltopdf --page-size Letter --margin-top 0.75in --margin-right 0.75in --margin-bottom 0.75in --margin-left 0.75in --encoding UTF-8 --quiet - -
  • 尝试从终端运行wkhtmltopdf,在 Rails 之外,使用相同的参数,看看它是否会给你任何错误。也就是说,运行/usr/bin/wkhtmltopdf --page-size Letter --margin-top 0.75in --margin-right 0.75in --margin-bottom...
  • 我运行时它也挂了: /usr/bin/wkhtmltopdf --page-size Letter --margin-top 0.75in --margin-right 0.75in --margin-bottom 0.75in -- margin-left 0.75in --encoding UTF-8 --quiet - -

标签: ruby-on-rails pdf pdf-generation ruby-on-rails-4 wkhtmltopdf


【解决方案1】:

问题是由于 stylesheet_link_tagjavascript_include_tag 使用相对 URL,当从运行 wkhtmltopdf 的同一服务器加载资产时,这通常会导致 wkhtmltopdf 挂起。

对资产使用绝对网址解决了这个问题。

在 Rails 的配置中设置asset_host,这也会影响stylesheet_link_tagjavascript_include_tag

# Modify asset host config setting in `config/application.rb`
# Or create a new initializer: `config/initializers/wkhtmltopdf.rb`
config.action_controller.asset_host = "http://mysite.com"

# Or you can have different hosts for development (local) and production (CDN):
# In `config/environments/development.rb`
config.action_controller.asset_host = "http://localhost"
# In `config/environments/production.rb`
config.action_controller.asset_host = "http://d111111abcdef8.cloudfront.net"

【讨论】:

  • 谢谢!在配置中,我应该编辑哪个文件?我没有任何主机名,我正在本地运行应用程序。在这种情况下我应该指定什么而不是 "mysite.com" ?
  • localhost127.0.0.1(或您从 Rails 控制台获得的任何本地 IP)。
  • 我应该编辑哪个文件来添加 config.action_controller.asset_host = "mysite.com" ?
  • 我更新了答案。您可以在config/application.rbconfig/initializers/wkhtmltopdf.rb 中设置它(您必须创建此文件)。您还可以通过在 config/environments/development.rbconfig/environments/production.rb 中分配不同的值来为开发/生产设置不同的主机(请参阅更新)。
  • 非常感谢!很好的帮助!
【解决方案2】:

设置config.action_controller.asset_host = "http://localhost" 在 development.rb 实际上对我不起作用。也就是说,PDF 生成可以工作,但在呈现 HTML 时,资产将无法通过。

我按照这里的方法:http://jguimont.com/post/2627758108/pdfkit-and-its-middleware-on-heroku

它对我来说就像一个魅力。希望这可以帮助某人。只需将 assets.rb 放入 config/initializers 即可。

【讨论】:

  • 这意味着本地在哪里?前端还是后端?
  • 您是从 IP 地址访问localhost,反之亦然?也就是说,也许您设置了asset_host = "http://localhost",但试图通过http://127.0.0.1/my_app/some-route 生成?
  • 对于图像,您可以使用嵌入的 base64 编码图像。
【解决方案3】:

我遇到了同样的问题,我的日志显示页面已呈现,但没有生成 pdf 并且浏览器会挂起。它最终与操作系统兼容性、缺少库、gem 或依赖项无关,但我需要将我的 Puma 服务器(已设置为 1)的最大允许线程数提高到 2 或更多。然后这会正常生成pdf。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 2013-12-21
    • 1970-01-01
    • 2012-06-28
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多