encabezado y pie de página en PDF de gambas
-
01-10-2019 - |
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!
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:
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.