2010-04-22 37 views
28

He leído todas las publicaciones relevantes sobre gambas pero no encontré mención (incluso en la propia documentación de gambas) de los encabezados y pies de página.encabezado y pie de página en gambas PDF

Sin embargo, vi una demostración en el propio sitio web de Prawnto sobre encabezados y pies de página. Copié toda la fuente de esa demostración solo para ver si funciona, pero se queja de un error del "encabezado" del método indefinido. ¿Debo entender que Prawn sacó el encabezado y el pie de página recientemente en la gema o hay algo más que debo hacer primero para usar el encabezado y el pie de página?

La página de demostración: http://cracklabs.com/prawnto/code/prawn_demos/source/text/flowing_text_with_header_and_footer

la parte del código de preocupación:

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 

Y por cabecera, por si acaso, me refiero a los fragmentos de palabras que aparecen por lo general en una esquina de cada página de un documento. Como su número de cuenta en las páginas de su factura.

gracias!

Respuesta

18

@GrantSayer thx para el ejemplo, pero esto solo le permitirá mostrar el número de página actual, no el número total de páginas.

También puede utilizar el number_pages función para el pie:

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 

Sin embargo, en mi caso también necesito formatear/estilo y alinear a la derecha los números de página para que coincida con las guías de estilo de empresa. Usé go_to_page(k) para crear mis propias funciones de encabezado y pie de página, que agregan el encabezado y el pie de página a cada página después de todas las páginas se crean. Esto me da dos opciones de estilo y el número total de páginas:

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

todavía me pregunto cómo manejar, que gambas no escribe cosas sobre sus cuadros de pie de página en este caso. Estoy usando el mismo método y simplemente no funciona. Lo mismo ocurre en tu ejemplo, cuando aumentas la cantidad de texto. Simplemente elimine el start_new_page y agregue un "* 100" a la línea de texto dentro del bucle. Por lo general, muevo todo el documento a un cuadro delimitador y restamos los tamaños de los cuadros de encabezado y pie de página para evitar problemas como ese. – unexist

+1

Ese ejemplo de pie de página realmente me salvó horas de miseria. – Vigrant

0

La única manera que he encontrado para obtener un elemento que se repite en una página es utilizar el método Prawn::Document::LazyBoundingBox. Básicamente, esto le permite definir un cuadro delimitador que solo se representa una vez que lo llama. Por lo que los habituales pseudo-code pasos son

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

El ejemplo de la fuente muestra como

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 

final

Esto le da una salida de texto del recuento de páginas en cada nueva página. Lo que sería ideal es si esto podría aplicarse en la configuración de una plantilla de página que se reutiliza sin la llamada manual para representar el elemento. Combinado con el flujo de texto daría la solución tradicional de encabezados y pies de página.

32

La muestra usted se refiere a, desde el plugin prawnto, está utilizando una versión anterior de gambas.

Como también necesitaba encabezado y pie de página, me pareció un poco más en esto. Parece que esa versión de gambas tenía métodos de encabezado y pie de página, que se implementaron usando el cuadro de límite perezoso. (se encuentra al verificar el código en github)

En la nueva versión de gambas puede hacer lo mismo con repetidores.

Aquí está la muestra completa reescrito utilizando la nueva versión:

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 

se puede comprobar la página de documentación de repetición para otras opciones que le permiten especificar exactamente donde desea que los repetidores.

13

Es poco diferente con la última versión de gambas debe passe un hash

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

este funciona para mí, el otro responde con más de 21 votos, no funciona para mí .. – Kokizzu

+1

Siempre es un placer ayudar –

+0

Gracias: enlace a los documentos actuales también: http://www.rubydoc.info/github/sandal/gambas/gambas% 2FDocument% 3Anumber_pages –

2

inicio de la edición

Esto funciona de gambas> = 0,12

FIN EDITAR

Aquí está mi solución usando repeat, canvas an d celda. Básicamente estoy dibujando mis cuadros delimitadores en la parte superior e inferior absoluta de cada página. Estoy usando una celda para tener un mejor control de estilo sobre ella. Espero que esto sea útil para alguien. (Utilicé colores poco molesto para ilustrar mejor cómo se puede controlar el estilo de encabezado y pie de página)

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

Muchas gracias, es exactamente lo que estaba buscando. – Thrasher

7

Si quieres un pie de página que no escriben cosas sobre su texto, usted tiene que crear el bounding_box por debajo del margen de el documento que usa 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 

Debe quedar como que, se puede ver que el pie está fuera de la parte inferior del margen:

example result

espero que ayude a alguien

Cuestiones relacionadas