【问题标题】:prawnto displaying tables that don't break when new pageprawnto 显示新页面时不会中断的表格
【发布时间】:2011-01-06 02:25:46
【问题描述】:

我的表格数量可变,行数可变,我想让它们一个接一个地显示,但如果一个表格不适合当前页面,请将其放在下一个页面上,然后继续。我已将表格放入事务中,因此如果高度适合当前页面,我可以回滚然后打印它,但我如何获得表格高度?

我现在有这个代码

pdf.transaction do 

pdf.table @data,
    :font_size  => 12, 
    :border_style => :grid,
    :horizontal_padding => 10,
    :vertical_padding   => 3,
    :border_width       => 2,
    :position           => :left,
    :row_colors => ["FFFFFF","DDDDDD"]

pdf.move_down 20

#pdf.rollback 
end

对此的任何帮助都会很棒。或者任何其他方式来做到这一点?

最好的问候 瑞克

【问题讨论】:

    标签: ruby-on-rails ruby pdf-generation prawn prawnto


    【解决方案1】:

    4 年后... :)

    正如@m-x 所写,出于安全原因,回滚被禁用,例如“组”,并且仍未实现。所以,这里我如何处理表格的断页:

    大而简单的表(每个数据一行)

    只需使用标题选项

    pdf.table @data,
      header: true, # You can use 'header: 2' if your header take two rows
      font_size: 12, 
      border_style: :grid,
      horizontal_padding: 10,
      vertical_padding: 3,
      border_width: 2,
      position: :left,
      row_colors: ["FFFFFF","DDDDDD"]
    

    小表或复表

    • 制作表
    • 检查是否需要分页
    • 绘制表格

    用你的例子:

    t = pdf.make_table @data,
      font_size: 12, 
      border_style: :grid,
      horizontal_padding: 10,
      vertical_padding: 3,
      border_width: 2,
      position: :left,
      row_colors: ["FFFFFF","DDDDDD"]
    
    if cursor - t.height < 0
      start_new_page
    end
    
    t.draw
    

    希望有帮助

    【讨论】:

    • 哦,伙计,这正是我一直在寻找的东西
    【解决方案2】:

    @current_page = pdf.page_count

    @roll = pdf.transaction do 
      pdf.move_down 20
    
      pdf.table @data,
        :font_size  => 12, 
        :border_style => :grid,
        :horizontal_padding => 10,
        :vertical_padding   => 3,
        :border_width       => 2,
        :position           => :left,
        :row_colors => ["FFFFFF","DDDDDD"]
    
      pdf.rollback if pdf.page_count > @current_page
    
    end 
    
    if @roll == false
    
      pdf.start_new_page
    
      pdf.table @data,
        :font_size  => 12, 
        :border_style => :grid,
        :horizontal_padding => 10,
        :vertical_padding   => 3,
        :border_width       => 2,
        :position           => :left,
        :row_colors => ["FFFFFF","DDDDDD"]
    end
    

    我希望这对你和我一样有用:-)

    【讨论】:

    • 警告 不适用于 Prawn 1.3.0 +,因为不再实现事务:Document#transaction has been disabled because its implementation lead to corrupted documents whenever a page boundary was crossed. We will try to work on reimplementing it in a future release
    【解决方案3】:

    感谢伊戈尔

    我目前正在设置当前页面,然后在新表呈现之后和回滚设置 new_page 变量之前在事务中。然后我可以回滚并检查新页面变量>当前页面变量是否开始新页面并打印表格。请参阅下面的代码。

    现在的问题是 pdf.start_new_page 显示错误,但如果我只是取出 pdf.rollback 行,它就可以工作。请参阅下面的错误。

    任何想法,任何一种或更简单的方法,都必须有一个!

    谢谢 瑞克

    @current_page = pdf.page_count
    
    pdf.transaction do 
      pdf.move_down 20
    
      pdf.table @data,
        :font_size  => 12, 
        :border_style => :grid,
        :horizontal_padding => 10,
        :vertical_padding   => 3,
        :border_width       => 2,
        :position           => :left,
        :row_colors => ["FFFFFF","DDDDDD"]
    
      @the_next_page = pdf.page_count
      pdf.rollback
    
    end 
    
    if @the_next_page > @current_page
    
      pdf.start_new_page
    
      pdf.table @data,
        :font_size  => 12, 
        :border_style => :grid,
        :horizontal_padding => 10,
        :vertical_padding   => 3,
        :border_width       => 2,
        :position           => :left,
        :row_colors => ["FFFFFF","DDDDDD"]
    end 
    

    错误

    > You have a nil object when you didn't expect it!
    The error occurred while evaluating nil.identifier
    
    Extracted source (around line #158): 
    
    155: end
    
    
    
    RAILS_ROOT: C:/InstantRails/rails_apps/Macrotec-Application
    
    Application Trace | Framework Trace | Full Trace 
    c:/InstantRails/ruby/lib/ruby/gems/1.8/gems/prawn-core-0.7.1/lib/prawn/document.rb:302:in `go_to_page'
    c:/InstantRails/ruby/lib/ruby/gems/1.8/gems/prawn-core-0.7.1/lib/prawn/document/internals.rb:128:in `finalize_all_page_contents'
    c:/InstantRails/ruby/lib/ruby/gems/1.8/gems/prawn-core-0.7.1/lib/prawn/document/internals.rb:127:in `each'
    c:/InstantRails/ruby/lib/ruby/gems/1.8/gems/prawn-core-0.7.1/lib/prawn/document/internals.rb:127:in `finalize_all_page_contents'
    c:/InstantRails/ruby/lib/ruby/gems/1.8/gems/prawn-core-0.7.1/lib/prawn/document.rb:344:in `render'
    C:/InstantRails/rails_apps/Macrotec-Application/app/views/quotations/show.pdf.prawn:158:in `_run_prawn_app47views47quotations47show46pdf46prawn'
    

    【讨论】:

    • 请编辑您的原始问题以添加新信息,而不是将其作为答案发布。
    【解决方案4】:

    我是 Prawn 初学者,所以这可能不是最好的解决方案,但应该可以。

    如果您考虑字体大小和垂直填充以及您在@data 中的记录数,您可以获得表格高度,您可以通过调用Prawn::Document.cursor 方法获得当前光标位置。

    有了这两个数字,您应该能够检查表格是否适合此页面。如果没有,就开始一个新的(通过调用Prawn::Document.start_new_page 方法)。

    否则表格将自动中断并在下一页继续。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-04
      • 2013-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多