2010-04-22 25 views
28

Ich habe alle relevanten Beiträge auf Prawn gelesen, fand aber keine Erwähnung (auch in Prawns eigener Dokumentation) von Kopf- und Fußzeilen.Kopf- und Fußzeile in Prawn PDF

Ich sah jedoch eine Demo auf Prawnto's eigener Website über Kopf- und Fußzeilen. Ich kopierte die gesamte Quelle dieser Demo, nur um zu sehen, ob es funktioniert, aber ein Fehler der undefinierten Methode "Header" wird beschwert. Darf ich verstehen, dass Prawn in diesem Juwel Kopf- und Fußzeilen aufgenommen hat, oder muss ich noch etwas anderes tun, um Kopf- und Fußzeilen zu verwenden?

Die Demo-Seite: http://cracklabs.com/prawnto/code/prawn_demos/source/text/flowing_text_with_header_and_footer

der Teil des Codes zur Sorge:

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 

Und durch Header, nur für den Fall, meine ich die Schnipsel von Wörtern, die in der Regel an einer Ecke jeder erscheinen Seite eines Dokuments. Wie Ihre Kontonummer in Ihren Rechnungsseiten.

danke!

Antwort

18

@GrantSayer thx für das Beispiel, aber dies zeigt Ihnen nur die aktuelle Seitenzahl, nicht die Gesamtzahl der Seiten.

Sie können auch die number_pages Funktion für die Fußzeile verwenden:

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 

jedoch in meinem Fall muss ich auch/Style Format und rechts die Seitenzahlen ausrichten Unternehmen Styleguides entsprechen. Ich benutzte go_to_page(k), um meine eigenen Kopf- und Fußzeilenfunktionen zu verursachen, die die Kopf- und Fußzeile jeder Seite hinzufügen, nachdem alle Seiten erstellt werden. Das gibt mir die beiden Styling-Optionen und die Gesamtzahl der Seiten:

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 
+4

helfen immer noch frage ich mich, wie Sie verwalten, dass Garnelen schreibt in diesem Fall nichts über deine Fußzeilen. Ich benutze den gleichen Weg und es funktioniert einfach nicht. Das gleiche passiert in Ihrem Beispiel, wenn Sie die Menge an Text erhöhen. Entfernen Sie einfach die start_new_page und fügen Sie der Textzeile innerhalb der Schleife ein * 100 hinzu. Normalerweise verschiebe ich das gesamte Dokument in eine Begrenzungsbox und subtrahiere die Größe der Kopf-/Fußzeilen, um solche Probleme zu vermeiden. – unexist

+1

Dieses Fußzeilenbeispiel rettete mir wirklich Stunden des Elends. – Vigrant

0

Die einzige Möglichkeit, ein wiederholtes Element auf einer Seite zu erhalten, ist die Prawn::Document::LazyBoundingBox Methode. Grundsätzlich können Sie damit eine Bounding Box definieren, die nur beim Aufruf gerendert wird. So sind die üblichen pseudo-code Schritte

1. Define lazy bounding box element assign to somevar 
2. One each new page call the element. 

Das Beispiel von der Quelle sind zeigt, wie

file = "lazy_bounding_boxes.pdf" 
Prawn::Document.generate(file, :skip_page_creation => true) do 
    point = [bounds.right-50, bounds.bottom + 25] 
    page_counter = lazy_bounding_box(point, :width => 50) do 
    text "Page: #{page_count}" 
end 

10.times do 
    start_new_page 
    text "Some filler text for the page" 
    page_counter.draw 
end 

Ende

Dies gibt Ihnen eine Seitenzählung Textausgabe auf jeder neuen Seite. Was wäre ideal, wenn dies beim Einrichten einer Seitenvorlage angewendet werden könnte, die ohne den manuellen Aufruf wiederverwendet wird, um das Element zu rendern. Die Kombination mit Textfluss würde die traditionelle Lösung von Kopf- und Fußzeilen ergeben.

32

Die Proben Sie sich beziehen, aus dem prawnto Plugin wird eine ältere Version von Garnelen verwendet wird.

Da ich auch Header und Footer brauchte, habe ich ein bisschen mehr in das hineingeschaut. Es scheint, dass diese Version von Prawn Header- und Footer-Methoden hatte, die mit Lazy Bounding Box implementiert wurden. (gefunden durch Überprüfung des Codes auf GitHub)

In der neuen Garnelen Version können Sie das Gleiche tun, mit Repeater.

Hier ist die vollständige Probe neu geschrieben, die neue Version mit:

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 

Sie die Dokumentation Seite der Wiederholung für andere Optionen, die Sie genau erlauben überprüfen können angeben, wo Sie die Repeater möchten.

13

Es ist etwas anders mit der neuesten Version von Garnelen Sie einen Hash-

in Garnelen
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>", { :start_count_at => 0, :page_filter => :all, :at => [bounds.right - 50, 0], :align => :right, :size => 14 } 
end 
+0

dieser funktioniert für mich, die anderen Antworten mit 21+ Stimmen, funktioniert nicht für mich .. – Kokizzu

+1

Immer ein Vergnügen zu helfen –

+0

Danke: Link zu aktuellen Dokumenten auch: http://www.rubydoc.info/github/sandal/Prawn/Prawn% 2FDocument% 3Anumber_pages –

2

START EDIT

passe muss Dies funktioniert> = 0,12

END EDIT

Hier ist meine Lösung mit wiederholen, Leinwand ein d Zelle. Im Wesentlichen zeichne ich meine Begrenzungsrahmen am absoluten oberen und unteren Ende jeder Seite. Ich benutze Zelle, um bessere Styling-Kontrolle darüber zu haben. Ich hoffe, dass dies für jemanden hilfreich sein wird. (I etwas ärgerlich Farben verwendet besser zu veranschaulichen, wie Sie Styling von Kopf- und Fußzeilen steuern kann)

Prawn::Document.generate("headers_and_footers_with_background.pdf") do 
    repeat :all do 
    # header 
    canvas do 
     bounding_box([bounds.left, bounds.top], :width => bounds.width) do 
     cell :content => 'Header', 
      :background_color => 'EEEEEE', 
      :width => bounds.width, 
      :height => 50, 
      :align => :center, 
      :text_color => "001B76", 
      :borders => [:bottom], 
      :border_width => 2, 
      :border_color => '00FF00', 
      :padding => 12 
     end 
    end 
    # footer 
    canvas do 
     bounding_box [bounds.left, bounds.bottom + 50], :width => bounds.width do 
     cell :content => 'Footer', 
      :background_color => '333333', 
      :width => bounds.width, 
      :height => 50, 
      :align => :center, 
      :text_color => "FFFFFF", 
      :borders => [:top], 
      :border_width => 2, 
      :border_color => 'FF0000', 
      :padding => 12 
     end 
    end 
    end 
    # body 
    bounding_box([bounds.left, bounds.top - 25], :width => bounds.width, :height => bounds.height - 50) do 
    100.times do 
     text "Some filler text for the page" 
    end 
    end 
end 
+1

Vielen Dank, es ist genau das, was ich gesucht habe. – Thrasher

7

Wenn Sie eine Fußzeile möchten, dass Sie nicht Sachen über Ihren Text schreiben, haben die bounding_box unter den Rand erstellen das Dokument mit bounds.bottom.

require 'prawn' 

file_name = 'hello.pdf' 
random_table = (0..50).map{|i|[*('a'..'z')]} # generate a 2D array for example (~2 pages) 

Prawn::Document::generate(file_name) do |pdf| 
    pdf.table random_table 
    pdf.page_count.times do |i| 
     pdf.bounding_box([pdf.bounds.left, pdf.bounds.bottom], :width => pdf.bounds.width, :height => 30) { 
     # for each page, count the page number and write it 
     pdf.go_to_page i+1 
      pdf.move_down 5 # move below the document margin 
      pdf.text "#{i+1}/#{pdf.page_count}", :align => :center # write the page number and the total page count 
     } 
    end 
end 

Es ist wie es aussehen soll, können Sie sehen, dass die Fußzeile außerhalb des Rand unten ist:

example result

Hoffe, dass es jemand