带有虾宝石的动态标题

问题描述 投票:0回答:1

我在使用传递到 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
    ```
ruby pdf-generation prawn
1个回答
0
投票

这是在黑暗中刺探,但评论太长了。

我们可以渲染所有页面,同时跟踪每个报告日期的起始页面和结束页面。

然后我们可以使用重复这些范围来生成标题。

def render_pages(pdf)
  grouped_items = rows.group_by { |item| item[0] }

  pages_headers = 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,pages_headers)
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
© www.soinside.com 2019 - 2024. All rights reserved.