read

Building PDF Document in ruby & rails application using prawn Library
Brief. Before getting started with this tutorial, I would like to thanks Greg and
Prawn team
for their awesome work towards ruby and rails community

Installing prawn (core, layout, format, security)

gem install prawn

or
Add following line in rails environment file inside initializer block

<div class='code-highlight'><pre class='code-highlight-pre'><div data-line='1' class='code-highlight-row numbered'><div class='code-highlight-line'>config.gem ‘prawn’</div></div></pre></div>

Optionally you can specify version to be used and then run task

<div class='code-highlight'><pre class='code-highlight-pre'><div data-line='1' class='code-highlight-row numbered'><div class='code-highlight-line'>rake gems:install</div></div></pre></div>

Generating pdf using rails console

ruby script/console
pdf = Prawn::Document.new

It creates new pdf document object. Here you can additionally pass options parameters such as -

Prawn::Document.new(:page_size => [11.32, 8.49], :page_layout => :portrait)
Prawn::Document.new(A0) Here A0 is page size.
Prawn::Document.new(:page_layout => :portrait,
:left_margin => 10.mm, # different
:right_margin => 1.cm, # units
:top_margin => 0.1.dm, # work
:bottom_margin => 0.01.m, # well
:page_size => 'A4')
pdf.text("Prawn Rocks")
=> 12
pdf.render_file('prawn.pdf')
=> #<file:prawn.pdf (closed)=""></file:prawn.pdf>

Here is output file generated
click

Now let’s go through other goodness of prawn library

<div class='code-highlight'><pre class='code-highlight-pre'><div data-line='1' class='code-highlight-row numbered'><div class='code-highlight-line'>pdf = Prawn::Document.new(‘A3’) do</div></div></pre></div>

FONTS

click

<div class='code-highlight'><pre class='code-highlight-pre'><div data-line='1' class='code-highlight-row numbered'><div class='code-highlight-line'># Specify font to be used or specify path to font file. </div></div><div data-line='2' class='code-highlight-row numbered'><div class='code-highlight-line'>font “times.ttf” </div></div><div data-line='3' class='code-highlight-row numbered'><div class='code-highlight-line'>font(“/times.ttf”)</div></div></pre></div>

TEXT

click

text 'Sandip Ransing', :size => 41, :position => :center, :style => :bold

STROKE LINE

click

<div class='code-highlight'><pre class='code-highlight-pre'><div data-line='1' class='code-highlight-row numbered'><div class='code-highlight-line'>stroke do </div></div><div data-line='2' class='code-highlight-row numbered'><div class='code-highlight-line'> rectangle [300,300], 100, 200 </div></div><div data-line='3' class='code-highlight-row numbered'><div class='code-highlight-line'> end</div></div></pre></div>

IMAGE

click

Displaying Local file system Image

<div class='code-highlight'><pre class='code-highlight-pre'><div data-line='1' class='code-highlight-row numbered'><div class='code-highlight-line'>image ‘sandip.png’, :height => 50, :position => :center, :border => 2 </div></div><div data-line='2' class='code-highlight-row numbered'><div class='code-highlight-line'>Scale Image </div></div><div data-line='3' class='code-highlight-row numbered'><div class='code-highlight-line'> </div></div><div data-line='4' class='code-highlight-row numbered'><div class='code-highlight-line'>image ‘sandip.png’, :scale => 0.5, :position => :left </div></div><div data-line='5' class='code-highlight-row numbered'><div class='code-highlight-line'>Display Remote image from Internet inside pdf </div></div><div data-line='6' class='code-highlight-row numbered'><div class='code-highlight-line'> </div></div><div data-line='7' class='code-highlight-row numbered'><div class='code-highlight-line'>require “open-uri” </div></div><div data-line='8' class='code-highlight-row numbered'><div class='code-highlight-line'> image open(‘http://t2.gstatic.com/images?q=tbn:kTG6gAKrnou2gM:http://www.facebook.com/profile/pic.php?uid=AAAAAQAQrLXvTWfyY2ANjttV8D1c0QAAAAnDHPFJe0pPFR84iIzXPKro&t=1”) </div></div><div data-line='9' class='code-highlight-row numbered'><div class='code-highlight-line'>end</div></div></pre></div>

LINE BREAKS

movedown(20)

TABLE/GRID

click

<div class='code-highlight'><pre class='code-highlight-pre'><div data-line='1' class='code-highlight-row numbered'><div class='code-highlight-line'>data = [ </div></div><div data-line='2' class='code-highlight-row numbered'><div class='code-highlight-line'> [“Name”, {:text => ‘Sandip Ransing’, :font_style => :bold, :colspan => 4 }], </div></div><div data-line='3' class='code-highlight-row numbered'><div class='code-highlight-line'> [“Address”, {:text => ‘SHIVAJINAGAR, PUNE 411005’, :colspan => 4 }], </div></div><div data-line='4' class='code-highlight-row numbered'><div class='code-highlight-line'> [“Landmark”,{:text => ‘NEAR FC COLLEGE’, :colspan => 4 }], </div></div><div data-line='5' class='code-highlight-row numbered'><div class='code-highlight-line'> [“Mobile”,”9860648108”, {:text => “”, :colspan => 3 }], </div></div><div data-line='6' class='code-highlight-row numbered'><div class='code-highlight-line'> [“Education”, {:text => “Bachelor in Computer Engineering”, :colspan => 4 }], </div></div><div data-line='7' class='code-highlight-row numbered'><div class='code-highlight-line'> [“Vehicle”, ‘Hero Honda’,”Reg. No.”, {:text => “MH 12 EN 921”, :colspan => 3 }], </div></div><div data-line='8' class='code-highlight-row numbered'><div class='code-highlight-line'> [“Additional”, “GDCA”, “class”, ‘First’, “”], </div></div><div data-line='9' class='code-highlight-row numbered'><div class='code-highlight-line'> [{:text => “Areas of Speciality”, :font_style => :bold}, {:text => “Ruby, Rails, Radiant, Asterisk, Adhearsion, Geokit, Prawn, ….,…”, :font_style => :bold, :colspan => 4}], </div></div><div data-line='10' class='code-highlight-row numbered'><div class='code-highlight-line'> [{:text => “Website”, :colspan => 2},{:text => “www.funonrails.com”, :colspan => 3}], </div></div><div data-line='11' class='code-highlight-row numbered'><div class='code-highlight-line'> [{:text => “Company”, :colspan => 2},{:text => “Josh Software”, :colspan => 3}] </div></div><div data-line='12' class='code-highlight-row numbered'><div class='code-highlight-line'> ] </div></div><div data-line='13' class='code-highlight-row numbered'><div class='code-highlight-line'>table data, </div></div><div data-line='14' class='code-highlight-row numbered'><div class='code-highlight-line'> :border_style => :grid, #:underline_header </div></div><div data-line='15' class='code-highlight-row numbered'><div class='code-highlight-line'> :font_size => 10, </div></div><div data-line='16' class='code-highlight-row numbered'><div class='code-highlight-line'> :horizontal_padding => 6, </div></div><div data-line='17' class='code-highlight-row numbered'><div class='code-highlight-line'> :vertical_padding => 3, </div></div><div data-line='18' class='code-highlight-row numbered'><div class='code-highlight-line'> :border_width => 0.7, </div></div><div data-line='19' class='code-highlight-row numbered'><div class='code-highlight-line'> :column_widths => { 0 => 130, 1 => 100, 2 => 100, 3 => 100, 4 => 80 }, </div></div><div data-line='20' class='code-highlight-row numbered'><div class='code-highlight-line'> :position => :left, </div></div><div data-line='21' class='code-highlight-row numbered'><div class='code-highlight-line'> :align => { 0 => :left, 1 => :right, 2 => :left, 3 => :right, 4 => :right }</div></div></pre></div>

click

<div class='code-highlight'><pre class='code-highlight-pre'><div data-line='1' class='code-highlight-row numbered'><div class='code-highlight-line'>link_annotation([200, 200, 500, 40],:Border => [0,0,1], :A => { :Type => :Action, :S => :URI, :URI => Prawn::LiteralString.new(“http://twitter.com/sandipransing”) } ) </div></div><div data-line='2' class='code-highlight-row numbered'><div class='code-highlight-line'>link_annotation(([0, 100, 100, 150]), :Border => [0,0,1], :Dest => s”http://funonrails.com”)</div></div></pre></div>

PDF Security

click

<div class='code-highlight'><pre class='code-highlight-pre'><div data-line='1' class='code-highlight-row numbered'><div class='code-highlight-line'>encrypt_document :user_password => ‘hello’, :owner_password => ‘railer’, </div></div><div data-line='2' class='code-highlight-row numbered'><div class='code-highlight-line'> :permissions => { :print_document => false }</div></div></pre></div>

Prawn Inline Formatting

Prawn-format supports inline text formatting that gives user enough flexibility to use html tags

require 'prawn/format'
text 'This is Strong text', :inline_format => true
text 'This is bold text \n It should be on newline.', :inline_format => true

SAVE Generated PDF

end
pdf.render_file 'my.pdf'

!!! NOTE: As of time now ‘prawn-format’ is incompatible with latest prawn gem, It is compatible with prawn version <= 0.6 s

Blog Logo

Sandip Ransing


Published

Image

Fun On Rails

Journal of a Web Developer #ruby #rails #JS

Back to Overview