我可以下载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
来生成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是我需要的,但我仍然无法弄清楚我的情况会是怎样的。
答案 0 :(得分:8)
问题是由stylesheet_link_tag
和javascript_include_tag
使用相对网址导致wkhtmltopdf
从运行wkhtmltopdf
的同一服务器加载资产时导致asset_host
挂起。
对资产使用绝对网址解决了问题。
在Rails的配置中设置stylesheet_link_tag
,这也会影响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"
:
{{1}}
答案 1 :(得分:3)
设置config.action_controller.asset_host = "http://localhost"
在开发中.rb实际上并不适合我。也就是说,PDF生成可以工作,但在呈现HTML时,资产将无法通过。
我按照这里的方法:http://jguimont.com/post/2627758108/pdfkit-and-its-middleware-on-heroku
它对我来说就像一个魅力。希望这有助于某人。只需在配置/初始化器中抛出assets.rb就可以了。
答案 2 :(得分:0)
我遇到了同样的问题,我的日志显示页面已呈现但是没有生成pdf并且浏览器会挂起。它最终与操作系统兼容性,缺少图书馆员,宝石和依赖关系无关,而是我需要将我的Puma服务器(已设置为1)的最大允许线程数提高到2或更多。然后生成pdf正常。