如何在Rails中的wicked_pdf中有一个动态的header?

How to have a dynamic header in wicked_pdf in Rails?

我目前有以下代码来尝试在我的每个页面的开头放置特定文本。特定文本是 title 传递给我正在显示的这个部分。

documents/clubs/advances/player_evaluation_groups.html.erb

<h2><%= title %></h2>
<% players.each do player %>
  <% if player.position_group != current_position_group %>
    <div class="page-break"></div>
    <h2><%= title %></h2>
  <% end %>
  <%= render partial: "documents/clubs/advances/player_evaluation", locals: { player: player, game: advance.pro_game } %>
<% end %>

我希望 title 出现在每一页上。目前,只要玩家评价保持在一页内,此代码就可以工作。否则,它们只会在每次新 player.position_group 更改其值时出现在页面顶部。我如何检测 wicked_pdf 何时开始新页面,以便我可以为每个新页面打印它?

我打算通过为 header 提供 html 来做到这一点,因为我已经有了它,但我不确定如果这样做的话如何更新标题方法。目前,我只是在我为文档提供的 header html 中显示文档的静态字符串。

编辑:

所以,在我看来,有两种可能性。

方法一

不要使用wicked_pdf提供的header,用body内容模拟。您必须为每页提供自己的 header 重复逻辑,此外您还需要手动计算分页时间。分页将在以下情况发生:

a) player.position_group 改变或...

b) 选手记录数超过一定数量,每条选手记录评价内容长度固定(所有记录取相同space)。如果播放器记录评估的长度可变,那么您将需要 pre-calculate 它并对其进行累加,以便在超过某个阈值时输出分页符并将累加器重置为 0。

话虽如此,我会按 position_group 和 #group_by 对玩家记录进行分组,然后如果提前知道每页适合多少玩家记录,则使用 each_slice适合的播放器,因此在 each_slice 方法的每次迭代中,您输出一个分页符并呈现一个 header。如果您事先不知道每页有多少播放器记录,您可以使用其他策略并在超过阈值时中断页面 + header。 最后,在 #group_by 方法的每次迭代中,您还输出一个分页符 + header。

方法二

我只是使用了这个方法,因为我还需要在同一个 pdf 文档中有不同的页脚或 header,所以我知道它有效。按 position_group 对 collection 进行分组,并为每个组...使用 wicked_pdf gem WickedPdf.new.pdf_from_string 的高级方法创建一个临时 pdf 文件,使用标准 header 和页脚模板。生成所有临时 pdf 文件后,将它们合并到一个带有 gem 的 pdf 文件中:combine_pdf