Pregunta

He leído a través de todos los cargos relevantes en la gamba, pero no encontró ninguna mención (incluso en la propia documentación de gambas) de las cabeceras y pies de página.

Sin embargo, vi una demostración en el propio sitio web Prawnto sobre los encabezados y pies de página. He copiado todo el origen de esa demostración sólo para ver si funciona, pero un error de método indefinido "cabecera" se quejó de. ¿Debo entender que la gamba sacó cabecera y el pie recientemente en la gema o hay algo más que tenga que hacer en primer lugar a la cabecera de utilización y 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 de 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. Al igual que su número de cuenta en sus páginas de cuentas.

Gracias!

¿Fue útil?

Solución

@GrantSayer THX para el ejemplo, pero esto sólo 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 de página:

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 es necesario para el formato / estilo y Alinear a la derecha los números de las páginas a las guías de estilo de la empresa partido. Solía ?? go_to_page (k) para crear mi propios encabezado y pie de funciones, que se suman la cabecera y el pie de cada página después 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

Otros consejos

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

Debido a que también necesitaba cabecera y el pie i parecía un poco más en esto. Parece que esa versión de gambas tenía encabezado y pie de métodos, que se implementa utilizando cuadro delimitador perezoso. (Encontrado por comprobar el código en github)

En la nueva versión de gambas se puede hacer lo mismo usando 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 permiten especificar exactamente donde desea que los repetidores.

Es poco diferente poco con la última versión de gambas debe pasar 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

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 del documento usando 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 de página se encuentra fuera del margen inferior:

ejemplo resultado

La esperanza que ayuda a alguien

START editar

Esto funciona de la gamba> = 0,12

Edit End

Aquí está mi solución mediante la repetición, lienzo y celular. Esencialmente estoy dibujando mis cuadros delimitadores en la parte superior absoluto y final de cada página. Estoy usando celular para tener un mejor control sobre ella el estilo. Espero que esto va a ser útil a alguien. (Utilicé colores ligeramente molestos para ilustrar mejor cómo se puede controlar el estil 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

La única manera que he encontrado para conseguir 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 sólo se representa una vez que usted lo llama. Así que los pasos son pseudo-code habitual

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

El ejemplo de los espectáculos de origen cómo

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

end

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 se podría aplicar en la configuración de una plantilla de página que se reutiliza sin la llamada manual para generar el elemento. El combinado con flujo de texto que daría a la solución tradicional de cabeceras y pies de página.

aquí está el problema cuando se utiliza el bounding_box para crear el contenido de pie de página ... todavía está rindiendo dentro de los límites de un margen.

Yo estaba buscando algo que va a escribir el contenido en el área del margen junto con number_pages. (Debido a un pie de página por lo general se encuentra en el área del margen inferior) ... y parece que hubo ninguno.

Así que en lugar, he utilizado text_box y colocar las coordenadas fuera de mi caja principal de delimitación de este modo:

repeat :all do
      text_box "My custom footer", size: 7, align: :center, :at => [bounds.left, bounds.bottom], :height => 100, :width => bounds.width
end

toma nota de que el repeat :all, hará que este texto pie de página para cada página.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top