Заголовок и нижний колонтитул в Crawn PDF
-
01-10-2019 - |
Вопрос
Я прочитал все релевантные посты на креветке, но не упомянул не упоминание (даже в собственной документации креветок) заголовков и нижних колонтитулов.
Тем не менее, я видел демонстрацию на собственном сайте Prwrto о заголовках и нижних колонтитулах. Я скопировал весь источник этой демо просто для того, чтобы увидеть, работает ли это, но ошибка неопределенного метода «заголовок» жаловалась. Я могу понимать, что креветки недавно взяли заголовок и нижний колонтитул в драгоценном камне или есть что-то еще, что мне нужно сделать первым, чтобы использовать заголовок и нижний колонтитул?
Демо-страница:http://cracklabs.com/prawnto/code/prann_demos/source/text/flways_text_with_header_and_footer.
Часть концерна:
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
И по заголовку, на всякий случай, я имею в виду, что фрагменты слов, которые обычно появляются в углу каждой страницы документа. Как номер вашей учетной записи на страницах ваших счетов.
Спасибо!
Решение
@Grantsayer THX Для примера, но это позволит вам только показать текущий номер страницы, а не общее количество страниц.
Вы также можете использовать число_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
Другие советы
Образец вы отправляетесь с плагином Prwrto, используют более старую версию креветки.
Поскольку я также нужен заголовок и нижний колонтитул, я немного посмотрел в это. Похоже, что эта версия кревета имела методы заголовка и нижнего колонтитула, которые были реализованы с использованием ленивой ограничительной коробки. (Найдено путем проверки кода на 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'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
Вы можете проверить страницу документации повторной страницы для других вариантов, которые позволяют точно указать, где вы хотите повторители.
Это немного отличается от последней версии креветок, вы должны посмотреть хеш
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
Если вы хотите, чтобы нижний колонтитул, который не пишет вещи по тексту, вы должны создать 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
Следует выглядеть так, вы можете увидеть, что нижний колонтитул за пределами дна поля:
Надеюсь, это поможет кому-то
Начать редактировать
Это работает на кревенье> = 0,12
Конец редактирования
Вот мое решение с использованием повтора, холста и ячейки. По сути, я рисую свои ограничивающие коробки на абсолютном верхнем и нижней части каждой страницы. Я использую клетку, чтобы иметь лучший стиль контроля над ним. Надеюсь, что это будет полезно для кого-то. (Я использовал слегка раздражающие цвета, чтобы лучше проиллюстрировать, как вы можете контролировать стайлинг заголовка и нижнего колонтитула)
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
Единственный способ, которым я нашел, чтобы получить повторяющийся элемент на странице, это использовать 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
конец
Это дает вам текстовый вывод графика страницы на каждой новой странице. Что было бы идеально, если это может быть применено в настройке шаблона страницы, которая повторно используется без ручного вызова для рендера элемента. В сочетании с текстовым потоком он дал бы традиционное решение заголовков и нижних колонтитулов.
Вот проблема при использовании bounding_box
Для создания пользовательского содержимого нижнего колонтитула ... он все еще рендеринг в границах поля.
Я искал то, что напишет содержимое В маржинальном районе вместе с number_pages
, (Потому что нижний колонтитул обычно устанавливается в нижней части маржировки) ... И кажется, что их нет.
так вместо этого я использовал text_box
и поместите координаты за пределами моей главной границы, как так:
repeat :all do
text_box "My custom footer", size: 7, align: :center, :at => [bounds.left, bounds.bottom], :height => 100, :width => bounds.width
end
Обратите внимание, что repeat :all
сделает этот нижний колонтитул текстом на каждую страницу.