Rupdf – Simple Ruby PDF Rails Plugin
December 15th, 2007 by pyrat
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 ruportStep 2: Install the plugin (from RAILS_ROOT)
./script/plugin install http://iformis.svnrepository.com/svn/rupdfStep 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.
December 16th, 2007 at 6:42 pm
Looks like a really interesting plugin. As the current lead developer of Ruport, it’s great to see it being used this way. We’d really like to explore opportunities for synergies with your project. For instance, some of the PDF helper methods would be great for Ruport directly. I also wanted to give you a heads-up about some changes coming in Ruport 1.4 that will break some of your implementation. I couldn’t find an email for you, so could you contact me so we can talk? In any case, great job – looks like this could be very useful.
March 25th, 2008 at 1:36 am
I’m interested in a PDF export from something using textile markup. You mentioned that you can’t put HTML in the PDF. Is there an alternative to stripping whatever format the user has applied? Or would it be possible to interpret the textile as appropriate commands to style the PDF similarly (realize that this might take some hacking)?