Search code examples
ruby-on-railsprawnprawnto

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!


Solution

  • @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