Динамический заголовок с драгоценным камнем из креветок

Я столкнулся с проблемой при отрисовке заголовка с аргументом 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
    ```

«к сожалению, я вижу одну и ту же дату на всех страницах» — я не совсем понимаю, что в этом плохого. Дата должна меняться от страницы к странице?

Stefan 16.04.2024 17:13

Я не вижу в этом коде ничего, что указывало бы на то, что дата должна измениться? Он показывает repeat(:all), что означает делать одно и то же на каждой странице? Ваш выполняется с использованием report_date, переданного render_page. Может быть, этот повторитель должен находиться где-то еще в вашем коде?

engineersmnky 16.04.2024 17:16

Кстати, помощник repeat должен вызываться один раз для всего документа. Вызов его при каждом вызове render_page кажется неправильным и может привести к неожиданным результатам.

Stefan 16.04.2024 17:22

Извините, я обновил вопрос, добавив больше контекста и некоторой значимости.

Samala Sumanth 16.04.2024 17:24

В этом сценарии переменная rows представляет собой массивы массивов, полученные из внешнего SQL-запроса, наряду с так называемой report_date. В функции render_pages я пытаюсь сгруппировать данные на основе report_date следующим образом: rows.group_by { |item| элемент[0] }.

Samala Sumanth 16.04.2024 17:39

Работает ли это, когда вы удаляете обертку repeat и вызываете render_header и render_footer напрямую?

Stefan 16.04.2024 17:59

Я попробовал @Stefan, но это не помогло, я просто вижу тело, обернутое верхним и нижним колонтитулом, но не повторяющиеся верхние и нижние колонтитулы, если вы понимаете, о чем я.

Samala Sumanth 16.04.2024 18:02

Давайте продолжим обсуждение в чате.

Samala Sumanth 16.04.2024 18:21

Если каждый «отчет» занимает всего 1 страницу, то repeat не нужен. Если каждый «отчет» может занимать более 1 страницы, вы можете передать диапазон или массив страниц repeat, например. repeat((1..3)) это, скорее всего, потребует от вас выполнения некоторых вычислений в цикле

engineersmnky 16.04.2024 21:36

спасибо, @engineersmnky, но как мне узнать, занимает ли страница более 1 страницы? вот это просто просмотр pdf.page_number? :думаю:

Samala Sumanth 17.04.2024 12:30
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
1
10
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот удар в темноту, но слишком длинный для комментариев.

Мы можем визуализировать все страницы, отслеживая при этом начальную и конечную страницы для каждой даты отчета.

Затем мы можем использовать повтор с этими диапазонами для создания заголовка.

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 спас мой день. Огромное спасибо. ценить это.

Samala Sumanth 18.04.2024 01:02

Другие вопросы по теме