使用 PDFkit gem 生成 pdf 挂在 rails 4 上 [英] generating pdf hangs on rails 4 using PDFkit gem

查看:25
本文介绍了使用 PDFkit gem 生成 pdf 挂在 rails 4 上的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm able to download pdf file with:

curl google.com | wkhtmltopdf - test.pdf

也就是说,wkhtmlpdf安装成功.

so it means, wkhtmlpdf installation was successful.

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

But, when I try to generate pdf file by accessing http://localhost:3000/contacts/1.pdf it hangs. In the status bar it shows: Waiting for localhost...

Rails 服务器输出:

Rails server output:

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'

application.rb:

application.rb:

config.middleware.use "PDFKit::Middleware"

根据 PDFKit railscast 这应该足以生成 pdf 文件只需添加 <代码>.pdf ...

According to the PDFKit railscast this should be enough for generating pdf files just by adding .pdf ...

更新:

show.html.erb:

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:

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 文件:

Thanks to @Arman H for helping me to figure out that I have to specify absolute path for assets instead of a relative ones. When I removed the following lines I was able to generate PDF file:

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

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

Now, I can't get how to substitute this with an absolute paths. It seems this post is what I need, but I still can't figure out how this would look like for my case.

推荐答案

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

The issue was due to stylesheet_link_tag and javascript_include_tag using relative URLs, which often causes wkhtmltopdf to hang when loading assets from the same server that wkhtmltopdf is running on.

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

Using absolute URLs for assets solved the problem.

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

Set asset_host in Rails' config, which also affects stylesheet_link_tag and javascript_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"

这篇关于使用 PDFkit gem 生成 pdf 挂在 rails 4 上的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆