[![Build Status](https://secure.travis-ci.org/igor-alexandrov/wisepdf.png)](http://travis-ci.org/igor-alexandrov/wisepdf) [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/igor-alexandrov/wisepdf) # wisepdf Wkhtmltopdf wrapper done right. **Wisepdf** uses the shell utility [wkhtmltopdf](http://code.google.com/p/wkhtmltopdf/) to serve a PDF file to a user from HTML. In other words, rather than dealing with a PDF generation DSL of some sort, you simply write an HTML view as you would normally, then let PDF take care of the hard stuff. **Wisepdf** is inspired by [Wicked PDF](https://github.com/mileszs/wicked_pdf) and [PDFKit](https://github.com/jdpace/PDFKit). PDF is optimized to use with Rails 3.1 (3.2), Ruby 1.9.2 and wkhtmltopdf 0.10.0 (and above). ## Installation First, be sure to install [wkhtmltopdf](http://code.google.com/p/wkhtmltopdf/). Note that versions before 0.9.0 [have problems](http://code.google.com/p/wkhtmltopdf/issues/detail?id=82&q=vodnik) on some machines with reading/writing to streams. This plugin relies on streams to communicate with wkhtmltopdf. More information about [wkhtmltopdf](http://code.google.com/p/wkhtmltopdf/) could be found [here](http://madalgo.au.dk/~jakobt/wkhtmltoxdoc/wkhtmltopdf_0.10.0_rc2-doc.html). Add this to your Gemfile: gem 'wisepdf' then do: bundle install ## How does it work? ### Basic Usage class ThingsController < ApplicationController def show respond_to do |format| format.html format.pdf do render :pdf => "file_name" end end end end ### Advanced Usage with all available options class ThingsController < ApplicationController def show respond_to do |format| format.html format.pdf do render :pdf => 'file_name', :template => 'things/show.pdf.erb', :layout => 'pdf.html', # use 'pdf.html' for a pdf.html.erb file :show_as_html => params[:debug].present?, # allow debuging based on url param :orientation => 'Landscape', # default Portrait :page_size => 'A4, Letter, ...', # default A4 :save_to_file => Rails.root.join('pdfs', "#{filename}.pdf"), :save_only => false, # depends on :save_to_file being set first :proxy => 'TEXT', :basic_auth => false # when true username & password are automatically sent from session :username => 'TEXT', :password => 'TEXT', :cover => 'URL', :dpi => 'dpi', :encoding => 'TEXT', :user_style_sheet => 'URL', :cookie => ['_session_id SESSION_ID'], # could be an array or a single string in a 'name value' format :post => ['query QUERY_PARAM'], # could be an array or a single string in a 'name value' format :redirect_delay => NUMBER, :zoom => FLOAT, :page_offset => NUMBER, :book => true, :default_header => true, :disable_javascript => false, :greyscale => true, :lowquality => true, :enable_plugins => true, :disable_internal_links => true, :disable_external_links => true, :print_media_type => true, :disable_smart_shrinking => true, :use_xserver => true, :no_background => true, :margin => {:top => SIZE, # default 10 (mm) :bottom => SIZE, :left => SIZE, :right => SIZE}, :header => {:html => { :template => 'users/header.pdf.erb', # use :template OR :url :layout => 'pdf_plain.html', # optional, use 'pdf_plain.html' for a pdf_plain.html.erb file, defaults to main layout :url => 'www.example.com', :locals => { :foo => @bar }}, :center => 'TEXT', :font_name => 'NAME', :font_size => SIZE, :left => 'TEXT', :right => 'TEXT', :spacing => REAL, :line => true}, :footer => {:html => { :template => 'shared/footer.pdf.erb', # use :template OR :url :layout => 'pdf_plain.html', # optional, use 'pdf_plain.html' for a pdf_plain.html.erb file, defaults to main layout :url => 'www.example.com', :locals => { :foo => @bar }}, :center => 'TEXT', :font_name => 'NAME', :font_size => SIZE, :left => 'TEXT', :right => 'TEXT', :spacing => REAL, :line => true}, :outline => {:outline => true, :outline_depth => LEVEL} end end end end By default, it will render without a layout (:layout => false) and the template for the current controller and action. ### Super Advanced Usage ### If you need to just create a pdf and not display it: # create a pdf from a string pdf = Wisepdf::Writer.new.to_pdf('