使用PDFkit-gem生成pdf挂在rails 4上



我可以用下载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)

Gemfile:

gem 'pdfkit'

application.rb:

config.middleware.use "PDFKit::Middleware"

根据PDFKit railscast,只需添加.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 %>

layouts/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 %>

现在,我不知道如何用绝对路径来代替它。这篇帖子似乎正是我所需要的,但我仍然不知道我的情况会是什么样子。

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

对资产使用绝对URL解决了问题。

在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"

设置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/intilizers中,就可以开始了。

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

最新更新