Я столкнулся с проблемой при отрисовке заголовка с аргументом report_date, переданным в метод render_header. Несмотря на то, что каждый раз передается другое значение report_date, PDF-файл всегда отображает одну и ту же дату, что не является ожидаемым поведением.
Я ожидаю, что PDF-файл должен отображаться со значением report_date, переданным в метод render_header. Однако похоже, что аргумент report_date используется в методе неправильно.
def render_pages(pdf)
grouped_items = rows.group_by { |item| item[0] }
grouped_items.each_with_index do |(report_date, booking_items), index|
render_page(pdf, report_date, booking_items)
pdf.start_new_page unless index == grouped_items.size - 1
end
end
# Renders a page of the PDF
#
# @param pdf [Prawn::Document] The PDF object
def render_page(pdf, report_date, booking_items)
pdf.repeat(:all, dynamic: true) do
pdf.bounding_box([pdf.bounds.left, pdf.bounds.top], width: pdf.bounds.width) do
render_header(pdf, report_date, organisation_name)
end
pdf.bounding_box([pdf.bounds.left, pdf.bounds.bottom + 150 ], width: pdf.bounds.width) do
render_footer(pdf)
end
end
render_body(pdf, report_date , booking_items)
end
def render_header(pdf, report_date, organisation_name)
pdf.image open("https://s3.amazonaws.com/www-inside-design/uploads/2019/05/woolmarkimagelogo-1024x576.png"), width: 80, height: 80, position: :center
pdf.text "HEY #{report_date}"
pdf.table(
[
["#{"Sumanth Samala PVT LTD"} - #{format_report_date(report_date)} \n Attendance Register", "Customer to complete all sections below \n Generated on #{Time.now.strftime("%d/%m/%Y %H:%M")}"]
],
width: pdf.bounds.width,
row_colors: ["808080"],
cell_style: header_cell_style
) do |table|
table.column(0).width = 464
end
end
```
Я не вижу в этом коде ничего, что указывало бы на то, что дата должна измениться? Он показывает repeat(:all)
, что означает делать одно и то же на каждой странице? Ваш выполняется с использованием report_date
, переданного render_page
. Может быть, этот повторитель должен находиться где-то еще в вашем коде?
Кстати, помощник repeat
должен вызываться один раз для всего документа. Вызов его при каждом вызове render_page
кажется неправильным и может привести к неожиданным результатам.
Извините, я обновил вопрос, добавив больше контекста и некоторой значимости.
В этом сценарии переменная rows представляет собой массивы массивов, полученные из внешнего SQL-запроса, наряду с так называемой report_date. В функции render_pages я пытаюсь сгруппировать данные на основе report_date следующим образом: rows.group_by { |item| элемент[0] }.
Работает ли это, когда вы удаляете обертку repeat
и вызываете render_header
и render_footer
напрямую?
Я попробовал @Stefan, но это не помогло, я просто вижу тело, обернутое верхним и нижним колонтитулом, но не повторяющиеся верхние и нижние колонтитулы, если вы понимаете, о чем я.
Давайте продолжим обсуждение в чате.
Если каждый «отчет» занимает всего 1 страницу, то repeat
не нужен. Если каждый «отчет» может занимать более 1 страницы, вы можете передать диапазон или массив страниц repeat
, например. repeat((1..3))
это, скорее всего, потребует от вас выполнения некоторых вычислений в цикле
спасибо, @engineersmnky, но как мне узнать, занимает ли страница более 1 страницы? вот это просто просмотр pdf.page_number? :думаю:
Вот удар в темноту, но слишком длинный для комментариев.
Мы можем визуализировать все страницы, отслеживая при этом начальную и конечную страницы для каждой даты отчета.
Затем мы можем использовать повтор с этими диапазонами для создания заголовка.
def render_pages(pdf)
grouped_items = rows.group_by(&:first)
page_breaks = grouped_items.map.with_index(1) do |(report_date, booking_items), index|
start_page = pdf.page_number
render_page(pdf, report_date, booking_items)
end_page = pdf.page_number
pdf.start_new_page unless index == grouped_items.size
{pages: (start_page..end_page), report_date: report_date}
end
render_header_footer(pdf,page_breaks)
end
def render_page(pdf, report_date, booking_items)
render_body(pdf, report_date , booking_items)
end
def render_header_footer(pdf,pages_headers)
pages_headers.each do |page_data|
pdf.repeat(page_data[:pages], dynamic: true) do
pdf.bounding_box([pdf.bounds.left, pdf.bounds.top], width: pdf.bounds.width) do
render_header(pdf, page_data[:report_date], organisation_name)
end
pdf.bounding_box([pdf.bounds.left, pdf.bounds.bottom + 150 ], width: pdf.bounds.width) do
render_footer(pdf)
end
end
end
end
def render_header(pdf, report_date, organisation_name)
pdf.image open("https://s3.amazonaws.com/www-inside-design/uploads/2019/05/woolmarkimagelogo-1024x576.png"), width: 80, height: 80, position: :center
pdf.text "HEY #{report_date}"
pdf.table(
[
["#{"Sumanth Samala PVT LTD"} - #{format_report_date(report_date)} \n Attendance Register", "Customer to complete all sections below \n Generated on #{Time.now.strftime("%d/%m/%Y %H:%M")}"]
],
width: pdf.bounds.width,
row_colors: ["808080"],
cell_style: header_cell_style
) do |table|
table.column(0).width = 464
end
end
Ух ты, это сработало, приятель. @engineersmnky спас мой день. Огромное спасибо. ценить это.
«к сожалению, я вижу одну и ту же дату на всех страницах» — я не совсем понимаю, что в этом плохого. Дата должна меняться от страницы к странице?