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