generating pdf hangs on rails 4 using PDFkit gem
pdf, pdf-generation, ruby-on-rails, ruby-on-rails-4, wkhtmltopdf
Solution
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.
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"
Problem
I'm able to download pdf file with: ``` curl google.com | wkhtmltopdf - test.pdf ``` so it means, wkhtmlpdf installation was successful. 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 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) ``` Gemfile: ``` gem 'pdfkit' ``` application.rb: ``` config.middleware.use "PDFKit::Middleware" ``` According to the PDFKit railscast this should be enough for generating pdf files just by adding `.pdf` ... UPDATE: 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> ``` UPDATE 2: 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 %> ``` 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.