Rupdf - Simple Ruby PDF Rails Plugin
This is a plugin which I have developed internally with Iformis. I realised it would be nice to share yet another pdf plugin with the rails community. This is designed to render pdfs with layouts. This is especially useful when working on projects where the pdf has to conform to a set design and where the data is presented in a generate report style. Banks often operate their tools in this manner.
Simple PDF reporting rails plugin designed to render layout based pdfs. Built on top of Ruport which is in turn built on top of pdf-writer.
Requires Ruport
Step 1: Install Ruport
gem install ruport
Step 2: Install the plugin (from RAILS_ROOT)
./script/plugin install http://iformis.svnrepository.com/svn/rupdf
Step 3: Create a class extending Rupdf::Base
Note: The only methods calls required are define_header, define_body and define_footer
The other methods are helper methods. Remember that html doesnt work in the body.
class Simple < Rupdf::Base
define_variables :report_title
renders :pdf, :for => Rupdf::Renderer
define_header do
add_header(report_title)
end
define_body do
add_text("hello man\n\n\n")
add_text("bye man.")
add_text("bye man.")
add_text("hello man\n\n\n")
add_text("bye man.")
add_text("hello man\n\n\n")
add_text("bye man.")
# add image (path defined at runtime)
image(smile_path)
add_text("hello man\n\n\n")
add_text("bye man.")
add_text("hello man\n\n\n")
end
define_footer do
footer_text = %(
This is the beautiful footer text.
)
add_footer(footer_text)
end
def add_header(title)
rounded_text_box("<b>#{title}</b>") do |o|
header_color = Color::RGB.from_html("#FFDE16")
o.fill_color = header_color
o.stroke_color = header_color
o.radius = 0
o.width = options.header_width || 550
o.height = options.header_height || 80
o.font_size = options.header_font_size || 12
o.x = pdf_writer.absolute_right_margin - o.width
o.y = pdf_writer.absolute_top_margin
end
end
def add_footer(text, options = nil)
unless options
options = OpenStruct.new(:font_size => 6)
end
rounded_text_box(text) do |o|
footer_color = Color::RGB.from_html("#EAECEE")
o.fill_color = footer_color
o.stroke_color = footer_color
o.radius = 0
o.width = options.header_width || 550
o.height = options.header_height || 60
o.font_size = options.font_size || 12
o.x = pdf_writer.absolute_right_margin - o.width
o.y = pdf_writer.absolute_bottom_margin + o.height
end
end
end
Step 4: Tie it into a controller and pass the variables at runtime.
class TestController < ApplicationController
def pdf
simple = Simple.new
pdf = Rupdf::Renderer.render_pdf do |o|
o.report_title = 'This is a test of a var being passed.'
o.smile_path = RAILS_ROOT + '/public/images/smile.jpg'
end
send_pdf(pdf)
end
end
The send_pdf function sends the rendered pdf to the browser.
If you need to perform more complicated pdf rendering operation
please refer to the API Documentation for pdf-writer. The API docs for
ruport will also be useful if you are involved in presenting tabular
data from activerecord.
Example programming code along with how to call it is supplied in the
examples directory. I suggest you use these as a base for pdf generation code you write.
This has been tested with both Rails 1.2 and Rails 2.01. Thanks for listening.