wicked rails generate example ruby-on-rails prawn prawnto

ruby on rails - rails - Encabezado y pie de página en Prawn PDF.



wicked pdf example (7)

He leído todas las publicaciones relevantes sobre Prawn, pero no he encontrado ninguna mención (ni siquiera en la propia documentación de Prawn) de encabezados y pies de página.

Sin embargo, vi una demostración en el sitio web de Prawnto sobre encabezados y pies de página. Copié la fuente completa de esa demostración solo para ver si funciona, pero se queja de un error del método "encabezado" indefinido. ¿Debo entender que Prawn eliminó el encabezado y el pie de página recientemente en la gema o hay algo más que deba 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 encabezado, por si acaso, me refiero a los fragmentos de palabras que aparecen generalmente en una esquina de cada página de un documento. Al igual que su número de cuenta en sus páginas de facturas.

¡Gracias!


@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 usar la función number_pages 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 necesito dar formato / estilo y alinear correctamente los números de página para que coincidan con las guías de estilo de la empresa. Utilicé 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 crear todas las páginas. Esto me da tanto las opciones de estilo como 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


Es un poco diferente con la última versión de Prawn, debes 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


Este es el problema cuando se usa el bounding_box para crear el contenido del pie de página personalizado ... aún se está procesando dentro de los límites de un margen.

Estaba buscando algo que escribiera los contenidos en el área del margen junto con number_pages (porque un pie de página generalmente se encuentra en el área del margen inferior) ... y parece que no había ninguno.

así que en lugar de eso, utilicé text_box y text_box las coordenadas fuera de mi caja delimitadora principal de la siguiente manera:

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

tenga en cuenta que la repeat :all , representará este texto de pie de página en cada página.


La única forma que encontré para obtener un elemento que se repite en una página es usar el método Prawn::Document::LazyBoundingBox . Básicamente, esto le permite definir un cuadro delimitador que solo se procesa una vez que lo llama. Así que los pasos habituales de pseudo-code son

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

El ejemplo de la fuente muestra 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

fin

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


La muestra a la que se refiere, desde el complemento prawnto, está utilizando una versión anterior de gamba.

Como también necesitaba encabezado y pie de página miré un poco más en esto. Parece que esa versión de gamba tenía métodos de encabezado y pie de página, que se implementaron utilizando un cuadro perimetral perezoso. (Encontrado comprobando el código en github)

En la nueva versión de gambas puedes hacer lo mismo usando repetidores.

Aquí está la muestra completa reescrita usando 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

puede consultar la página de documentación de repetición para otras opciones que le permiten especificar exactamente dónde desea que los repetidores.


Si quieres un pie de página que no escriba cosas sobre tu texto, debes crear el bounds.bottom bounding_box 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

Debería verse así, puedes ver que el pie de página está fuera del margen inferior:

Espero que ayude a alguien


INICIAR EDICIÓN

Esto funciona en gambas> = 0.12

EDICIÓN FINAL

Aquí está mi solución usando repetición, lienzo y celular. Esencialmente, estoy dibujando mis cuadros delimitadores en la parte superior e inferior absolutas de cada página. Estoy usando celular para tener un mejor control de estilo sobre él. Espero que esto sea de ayuda para alguien. (Utilicé colores ligeramente molestos para ilustrar mejor cómo se puede controlar el estilo del encabezado y el 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