Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

header and footer in Prawn PDF

I have read through all relevant posts on Prawn but found no mentioning (even in Prawn's own documentation) of headers and footers.

However, I did see a demo on Prawnto's own website about headers and footers. I copied the entire source of that demo just to see if it works but an error of undefined method "header" is complained about. Am I to understand that Prawn took out header and footer recently in the gem or is there something else I need to do first to use header and footer?

The demo page: http://cracklabs.com/prawnto/code/prawn_demos/source/text/flowing_text_with_header_and_footer

the part of code of concern:

Prawn::Document.generate("flow_with_headers_and_footers.pdf")  do    header margin_box.top_left do        text "Here's My Fancy Header", :size => 25, :align => :center      end       text "hello world!" end 

And by header, just in case, I mean the snippets of words that appear usually at a corner of every page of a document. Like your account number in your bills pages.

thanks!

like image 375
Nik So Avatar asked Apr 22 '10 22:04

Nik So


People also ask

What is header and footer in PDF?

The Header & Footer tool lets you insert text, images, and other PDF files into one or more pages in a PDF document. You have full control over the position, size, opacity, and other properties of your headers and footers, and you can save them for reuse.

Can you add header and footer PDF?

Open the PDF file containing header and footer. Choose Tools > Edit PDF. In the secondary toolbar, choose Header & Footer > Add, and then click Add New in the message that appears. The preview shows any existing headers and footers.

How can I add header and footer in pdf online?

1Drag & drop the PDF file to the browser. Upload a document from the computer using the “Add File” button or from Google Drive or Dropbox. 2Add text for the header and footer, then customize advanced settings like the text color and positioning. 3Click on “Apply Changes” to proceed.


2 Answers

The sample you are refering to, from the prawnto plugin, is using an older version of prawn.

Since i also needed header and footer i looked a bit more into this. It seems that that version of prawn had header and footer methods, which were implemented using lazy bounding box. (found by checking the code on github)

In the new prawn version you can do the same thing using repeaters.

Here is the full sample rewritten using the new version:

require "#{File.dirname(__FILE__)}/../example_helper.rb"  Prawn::Document.generate("test.pdf")  do     repeat :all do     # header     bounding_box [bounds.left, bounds.top], :width  => bounds.width do         font "Helvetica"         text "Here's My Fancy Header", :align => :center, :size => 25         stroke_horizontal_rule     end      # footer     bounding_box [bounds.left, bounds.bottom + 25], :width  => bounds.width do         font "Helvetica"         stroke_horizontal_rule         move_down(5)         text "And here's a sexy footer", :size => 16     end   end    bounding_box([bounds.left, bounds.top - 50], :width  => bounds.width, :height => bounds.height - 100) do                     text "this is some flowing text " * 200         move_down(20)     font "#{Prawn::BASEDIR}/data/fonts/DejaVuSans.ttf"    table [["ὕαλον ϕαγεῖν",    "baaar",             "1" ],           ["This is","a sample",          "2" ],           ["Table",  "dont\ncha\nknow?",  "3" ],           [ "It",    "Rules",             "4" ],                [ "It",    "Rules",             "4" ],                [ "It",    "Rules",             "4" ],                [ "It",    "Rules",             "4" ],                [ "It",    "Rules",             "4" ],                [ "It",    "Rules",             "4" ],                [ "It",    "Rules",             "4" ],                [ "It",    "Rules",             "4" ],                [ "It",    "Rules",             "4" ],                [ "It",    "Rules\nwith an iron fist", "x" ],                [ "It",    "Rules",             "4" ],                [ "It",    "Rules",             "4" ],                [ "It",    "Rules",             "4" ],                [ "It",    "Rules",             "4" ],                [ "It",    "Rules",             "4" ],                [ "It",    "Rules",             "4" ],                [ "It",    "Rules",             "4" ],              [ "It",    "Rules",             "4" ],                [ "It",    "Rules",             "4" ],                [ "It",    "Rules",             "4" ],                [ "It",    "Rules",             "4" ],                [ "It",    "Rules",             "4" ],                [ "It",    "Rules",             "4" ],                [ "It",    "Rules",             "4" ],           [ "It",    "Rules",             "4" ],                [ "It",    "Rules",             "4" ],                [ "It",    "Rules",             "4" ],                [ "It",    "Rules",             "4" ],                [ "It",    "Rules",             "4" ],                [ "It",    "Rules",             "4" ],                [ "It",    "Rules",             "4" ],             [ "It",    "Rules",             "4" ],                [ "It",    "Rules",             "4" ]],            :font_size          => 24,       :horizontal_padding => 10,      :vertical_padding   => 3,      :border_width       => 2,      :position           => :center,      :headers            => ["Column A","Column B","#"]    end end 

you can check the documentation page of repeat for other options which allow you to exactly specify where you want the repeaters.

like image 78
memical Avatar answered Sep 21 '22 11:09

memical


@GrantSayer thx for the example, but this will only let you show the current page number, not the total number of pages.

You can also use the number_pages function for the footer:

Prawn::Document.generate("page_with_numbering.pdf") do   text "Hai"   start_new_page   text "bai"   start_new_page   text "-- Hai again"   number_pages "<page> in a total of <total>", [bounds.right - 50, 0] end 

However, in my case I also need to format/style and right align the page numbers to match company style guides. I used go_to_page(k) to create my own header and footer functions, which add the header and footer to each page after all the pages are created. This gives me both styling options and the total number of pages:

Prawn::Document.generate("footer_example.pdf", :skip_page_creation => true) do   10.times do     start_new_page     text "Some filler text for the page"   end    # footer   page_count.times do |i|     go_to_page(i+1)     lazy_bounding_box([bounds.right-50, bounds.bottom + 25], :width => 50) {       text "#{i+1} / #{page_count}"     }.draw   end end 
like image 35
Gawin Avatar answered Sep 19 '22 11:09

Gawin