prawnto отображает таблицы, которые не ломаются при новой странице - PullRequest
5 голосов
/ 17 января 2010

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

Любая помощь в этом была бы великолепна.Или любой другой способ сделать это?

С наилучшими пожеланиями Рик

Ответы [ 4 ]

6 голосов
/ 29 июня 2016

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

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

5 голосов
/ 12 февраля 2010

@ 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

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

0 голосов
/ 17 января 2010

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

В настоящее время я устанавливаю текущую страницу и затем в транзакции после отображения новой таблицы и перед изменением отката, устанавливающим переменную 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'
0 голосов
/ 17 января 2010

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

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

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

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

...