5

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

我现在有这个代码

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

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

最好的问候瑞克

4

4 回答 4

7

4年后... :)

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

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

只需使用标题选项

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

希望有帮助

于 2016-06-29T13:42:35.090 回答
5

@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

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

于 2010-02-12T11:31:03.700 回答
0

谢谢伊戈尔

我目前正在设置当前页面,然后在呈现新表之后和回滚设置 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'
于 2010-01-17T17:47:48.823 回答
0

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

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

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

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

于 2010-01-17T17:27:02.340 回答