prawnto отображает таблицы, которые не ломаются при новой странице

У меня есть переменное число таблиц с переменным количеством строк, и я хочу, чтобы они отображались одна за другой, но если таблица не помещается на текущей странице, поместите ее на следующую, а затем продолжайте. Я поместил таблицу в транзакцию, чтобы я мог откатиться назад, а затем распечатать ее, если высота будет соответствовать текущей странице, но как мне получить высоту таблицы?

У меня есть этот код на данный момент

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 года спустя...:)

Как писал @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

надеюсь, это поможет

@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

Я надеюсь, что это работает для вас, как и для меня:-)

Я новичок в креветках, так что это может быть не лучшим решением, но оно должно работать.

Вы можете получить высоту таблицы, если учесть размер шрифта и вертикальное заполнение, а также количество записей в @data и вы можете получить текущую позицию курсора, вызвав Prawn::Document.cursor метод.

Имея эти два числа, вы сможете проверить, подходит ли таблица на этой странице или нет. Если нет, просто начните новый (позвонив по Prawn::Document.start_new_page метод).

В противном случае таблица будет разбита автоматически и продолжится на следующей странице.

Спасибо Игорь

Я в настоящее время устанавливаю текущую страницу и затем в транзакции после того, как новая таблица была отрисована и перед откатом установил переменную new_page. Затем я могу откатиться назад и проверить, есть ли новая страница var> текущая страница var, и если это начало новой страницы и распечатать таблицу. Смотрите код ниже.

Проблема теперь в том, что 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'
Другие вопросы по тегам