3

如何在 Rails 中创建代表一个数据表的多页 PDF(包括每个新页面上的列标题)?我查看了许多带有 wicked-pdf、pdfkit 和 prawn 的示例,但没有看到任何专门解决溢出到后续页面以及需要在每个新页面中重复标题的内容。谢谢您的帮助。

4

3 回答 3

4

我使用 Prawn 生成我的 pdf,并且可以得到你想要的效果,如下所示:

def render_photo_table(pdf)
  ps = self.photos.map do |photo|
    [photo.filename, photo.image_height, photo.image_width]
  end
  ps.insert(0, ['Filename', 'Height', 'Width'])
  pdf.table(ps) do |table|
    table.header = true
  end
end

这会在每一页的顶部产生一个标题(设置在数组位置 0 中)。

于 2012-06-15T04:00:28.643 回答
3

对此也有麻烦,但找到了一种相当简单的方法(经过很多头痛)来做到这一点。

在项目上方放置一个浮动的地标 div,这样您就可以获得起始坐标(我称之为 ID item_top)。

然后使用顶级数据 div 渲染页面,使用类“ unbreakable”。

还包括一个强制分页符的类:

.page-breaker {
  display: block;
  clear: both;
  page-break-after: always;
}

然后渲染后

<script>
// Very top of items
var current_top = $('#item_top').offset().top;
// Check distance from top of page to bottom of item
// If greater than page size put page break and headers before
// Reset top of page to top of item.
$('.unbreakable_section').each(function(index) {
  var item_bottom = $(this).offset().top + $(this).outerHeight(true);
  if ((item_bottom - current_top) > 1250) {
    $(this).before("<div class='page-breaker'></div>");
    $(this).before("Headings Div here");
    current_top = $(this).offset().top - 48; // item - header height
  }
});

</script>

如果空间超过页面高度,这将测量自上次分页后的垂直空间并开始一个新页面并在其上方放置一个标题。(1250 是近似值,对我来说已经足够接近了 - 我在页面上也有一个页脚,因此高度可能会因您的设置而异)。

在 100 页的文档上进行测试可以按预期工作。

于 2012-11-15T09:19:26.907 回答
1

我们为此编写了内部 jquery 代码。

如果您有以下页面:

<div class="mypage">
  <div class="mypage_footer"></div>
</div>

在外面你有:

<div class="mybox">
  <table><tbody><tr><td>omg</td></tr></tbody></table>
</div>
<div class="mybox">
  <table><tbody><tr><td>lol</td></tr></tbody></table>
</div>

假设您有一个固定的页面高度(最好是 A4 大小),您可以使用 jquery 来:

  • 通过从 mypage 的高度中减去页面子项的 $(element).height() 来计算 mypage 内的剩余空间
  • 当有剩余空间时,从页面外部选择一个 mybox 并将其放在页面内
  • 如果没有更多空间,请创建第一页的副本并重复。
于 2012-05-25T15:22:25.190 回答