エビの宝石が付いたダイナミックヘッダー

概要

render_header メソッドに渡された report_date 引数を使用してヘッダーをレンダリング中に問題が発生しました。毎回異なる report_date 値を渡しても、PDF には常に同じ日付が表示されますが、これは予期しない動作です。

私の期待では、PDF は render_header メソッドに渡される report_date 値を使用してレンダリングされるはずです。ただし、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
    ```

解決策

ここでは暗中模索ですが、コメントするには長すぎます。

各レポート日付の開始ページと終了ページを追跡しながら、すべてのページをレンダリングできます。

次に、それらの範囲で繰り返しを使用してヘッダーを生成できます。

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