【问题标题】:Prawnto and Prawn: Reusing cells created with pdf.make_cell()Prawnto 和 Prawn:重用使用 pdf.make_cell() 创建的单元格
【发布时间】:2014-01-28 23:15:45
【问题描述】:

我已经在我的 Rails 4 应用程序中使用 Prawn 成功实现了 Prawnto_2。但是,我在无法找到答案的表格单元格中遇到了一些奇怪的行为。

在我的实现中,我的应用程序可以创建一个多页 PDF,每页包含一个大表格。每个表格都具有相同的设计并包含相似的数据,因此具有相同的表格标题。

为了加快速度并保持干燥,我将创建一个标题行:

header = []
(0..6).each do |index|
    header << pdf.make_cell(:content => "Heading #{index}", :width => 140, :borders => [])]
end

然后,通过多次调用pdf.table(),我可以为我希望出现标题行的每个表重新使用该标题行:

4.times do |i|
    pdf.table([header] + more_rows)
    # the more_rows variable is an array containing additional rows to be shows beneath the header
end

使用上面的循环,我希望有四个表,每个表都有相同的顶行。这是真的,但是,表格尺寸是错误的。即,在后续表格中将忽略列宽,并且不考虑表格宽度。第一张桌子是完美的,但第二张及以后就遇到了这个问题。

我能够解决此问题的唯一方法是在每次创建表时创建标题行,这意味着大量代码重复。效果很好,但一点也不干。

那么,在上面的示例中,为什么重用 header 会导致列和表的宽度发生变化?有没有更合适的方法来重用 Prawn::Table::Cell 对象?

【问题讨论】:

    标签: ruby-on-rails prawn prawnto


    【解决方案1】:

    我怀疑重用Cell 对象是个坏主意。它可能不是一个不可变的对象,并且在渲染过程中会根据正在发生的事情进行自我修改。查看Cell 类的实现,它们有一个内部属性@pdf,它们对moveand a few others 执行操作。因此,通过在文档的不同区域重用这些内容,您会得到奇怪的结果,因为 move 的次数比应有的次数多。

    将您的标头逻辑放入一个函数中,以便为每次调用它创建新的单元格,并且您仍然可以保持您的代码看起来相当干净。

    【讨论】:

    • 我在辅助模块中创建了一个函数,该函数接受 pdf 对象作为参数,现在我的代码再次 DRY。
    猜你喜欢
    • 2010-11-18
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 2018-05-27
    • 1970-01-01
    • 2011-06-16
    相关资源
    最近更新 更多