Wicked PDF uses shell utility wkhtmltopdf to serve a PDF file to a user from HTML. In other words, you simply write an HTML view as you would normally, then wicked PDF takes care of other stuff.
wicked PDF works on Ruby versions 1.8.7 through 2.3; Rails 2 through 5.0
Installation:
To use Wicked PDF, first install wkhtmltopdf. Alternatively, you could use the wkhtmltopdf-binary gem by including it in your Gemfile.
Add following gems to your Gemfile and run bundle install.
gem 'wicked_pdf'
gem 'wkhtmltopdf-binary'
Register the PDF mime type in config/initializers/mime_types.rb
Mime::Type.register "application/pdf", :pdf
Wicked PDF comes with a middleware that allows user to get a PDF view of any page on your site by appending .pdf to the URL. This is achived by adding
config.middleware.use WickedPdf::Middleware
to the /config/application.rb file.
We can create template and layout files for the PDF, and modify controller action to handle PDF-format request.
Modify the controller as shown. Here, I am specifying the name of the PDF file.
class SalaryFilesController
def download
respond_to do |forma|
format.pdf do
render pdf: "SalarySlip" #Excluding .pdf extension
end
end
and template file: download.pdf.haml
= wicked_pdf_stylesheet_link_tag "salary_files", media: "all"
.container
%table
%tr
%td
= wicked_pdf_image_tag('kiprosh_pdf_logo.png', id:"pdf-logo")
Here I have used following Wicked helpers
wicked_pdf_stylesheet_link_tag
wicked_pdf_image_tag
There is one more helper as follows
wicked_pdf_javascript_include_tag
Using the regular stylesheet_link_tag
and javascript_include_tag
tags cause the application to hang when a PDF is requested. Also image will not be render with regular img
tag.
If you want t just crete a pdf and not display it:
#create a pdf from a string
pdf = WickedPdf.new.pdf_from_string('<h1>Hello world!</h1>')
Or from your controller using views ad templates and save to a file
pdf = render_to_string pdf: "some_file_name", temlate: "templates/pdf"
save_path = Rails.roor.join('pdfs', 'filename.pdf')
File.open(sve_path, 'wb') do |file|
file << pdf
end
Thank you!