Верхний и нижний колонтитулы в Prawn PDF
Я прочитал все соответствующие сообщения о Кревете, но не нашел упоминания (даже в собственной документации Прайна) верхних и нижних колонтитулов.
Тем не менее, я видел демо на собственном веб-сайте Prawnto о верхних и нижних колонтитулах. Я скопировал весь источник этой демонстрации только для того, чтобы увидеть, работает ли она, но об ошибке "заголовок" метода undefined жалуется. Должен ли я понять, что в последнее время в эпоху драгоценности креветка подняла верхний и нижний колонтитулы, или есть что-то еще, что мне нужно сделать сначала, чтобы использовать верхний и нижний колонтитулы?
Демо-страница:
http://cracklabs.com/prawnto/code/prawn_demos/source/text/flowing_text_with_header_and_footer
часть кода, вызывающего озабоченность:
Prawn::Document.generate("flow_with_headers_and_footers.pdf") do
header margin_box.top_left do
text "Here My Fancy Header", :size => 25, :align => :center
end
text "hello world!"
end
И по заголовку, на всякий случай, я имею в виду фрагменты слов, которые обычно появляются в углу каждой страницы документа. Как ваш номер счета на страницах ваших счетов.
спасибо!
Ответы
Ответ 1
@GrantSayer спасибо для примера, но это позволит вам показывать текущий номер страницы, а не общее количество страниц.
Вы также можете использовать функцию number_pages для нижнего колонтитула:
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
Однако, в моем случае мне также нужно форматировать/стилизовать и выравнивать номера страниц в соответствии с руководствами по стилю. Я использовал go_to_page (k) для создания собственных функций верхнего и нижнего колонтитула, которые добавляют верхний и нижний колонтитулы на каждую страницу после создаются все страницы. Это дает мне как варианты стилизации, так и общее количество страниц:
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
Ответ 2
Образец, на который вы ссылаетесь, из плагина prawnto использует более старую версию креветок.
Так как мне также нужен верхний и нижний колонтитул, я смотрел немного больше на это. Похоже, что у этой версии креветок были методы заголовка и нижнего колонтитула, которые были реализованы с использованием ленивой ограничивающей рамки. (определяется путем проверки кода на github)
В новой версии креветок вы можете сделать то же самое с помощью повторителей.
Вот полный образец, переписанный с использованием новой версии:
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 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 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
вы можете проверить страницу документации повтора для других параметров, которые позволяют точно указать, где вы хотите повторители.
Ответ 3
Это немного отличается от последней версии креветки, вы должны обработать хеш
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
Ответ 4
Если вы хотите, чтобы нижний колонтитул не записывал текст поверх вашего текста, вы должны создать bounding_box
ниже поля документа с помощью 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
Это должно выглядеть так, вы можете видеть, что нижний колонтитул находится за пределами поля:
![example result]()
Надеюсь, что это поможет кому-то
Ответ 5
СТАРТ РЕДАКТИРОВАТЬ
Это работает в креветке >= 0,12
END EDIT
Вот мое решение, использующее повтор, холст и ячейку. По сути, я рисую свои ограничивающие прямоугольники в абсолютном верхнем и нижнем углу каждой страницы. Я использую ячейку, чтобы лучше управлять стилем. Надеюсь, это будет полезно кому-то. (Я использовал слегка раздражающие цвета, чтобы лучше проиллюстрировать, как вы можете управлять стилем верхнего и нижнего колонтитула)
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
Ответ 6
Единственный способ найти повторяющийся элемент на странице - использовать метод Prawn::Document::LazyBoundingBox
. В основном это позволяет вам определить ограничивающий прямоугольник, который отображается только после его вызова. Таким образом, обычные шаги pseudo-code
:
1. Define lazy bounding box element assign to somevar
2. One each new page call the element.
Пример из источника показывает, как
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
конец
Это дает вам вывод текста страницы-счетчика на каждой новой странице. Идеально было бы, если бы это можно было применить при настройке шаблона страницы, который повторно используется без ручного вызова для визуализации элемента. В сочетании с текстовым потоком это даст традиционное решение верхних и нижних колонтитулов.