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
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
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
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
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>
LINKS
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-format supports inline text formatting that gives user enough flexibility to use html tags
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
!!! NOTE: As of time now ‘prawn-format’ is incompatible with latest prawn gem, It is compatible with prawn version <= 0.6 s