2012-05-23 2 views
3

Как создать многостраничный PDF-файл в Rails, представляющий одну таблицу данных (включая заголовки столбцов на каждой новой странице)? Я рассмотрел множество примеров с wicked-pdf, pdfkit и креветкой, но не видел ничего, что конкретно касается переполнения на последующие страницы и необходимости повторять заголовки с каждой новой страницы. Спасибо за помощь.Как создать многостраничный PDF-файл в Rails, представляющий одну таблицу данных (включая заголовки столбцов на каждой новой странице)?

+1

Что делать с созданием функции заголовка (например, частичной или что-то еще) .. затем после того, как n записей выписали, перерыв страницы ... http://stackoverflow.com/questions/5806943/rails-wickedpdf-page-breaks, я сделал что-то вроде этого один раз, но в классическом asp .... btw это глупый подход и использовать его в качестве последнего ресурса. – Orlando

+0

Это может быть не плохой подход, если содержание каждой строки является предположительно одной строкой на запись. – ob1

+0

Да, это сработало, когда я это сделал, потому что я знал точный размер каждой строки (не знаю, если это ваш случай) .. так ..после 40 записей перерыв страницы, если не больше записей, поставьте «нижний колонтитул» документа .. .. это было просто, но я уверен, что есть более эффективный способ сделать это – Orlando

ответ

1

Для этого мы написали наш внутренний код jquery.

Если у вас есть страницы, как:

<div class="mypage"> 
    <div class="mypage_footer"></div> 
</div> 

И снаружи у вас есть:

<div class="mybox"> 
    <table><tbody><tr><td>omg</td></tr></tbody></table> 
</div> 
<div class="mybox"> 
    <table><tbody><tr><td>lol</td></tr></tbody></table> 
</div> 

Если у вас есть фиксированная высота страницы (желательно формата А4), вы можете использовать JQuery для:

  • Вычислить оставшееся пространство внутри mypage, вычитая $ (element) .height() детей страницы с высоты моей страницы
  • В то время как осталось место, выберите мой бокс вне страницы и поместите его на страницу
  • Если места больше нет, создайте копию первой страницы и повторите.
+0

Интересный подход. Вы видели ограничение на количество страниц, с которыми вы могли бы справиться? Можете ли вы поделиться фактической функцией? – ob1

+0

Да, на самом деле после 50 или около того страниц параметр wkhtmltopdf zoom теряет свою точность и начинается миллиметровое скольжение. Я спрошу, могу ли я поделиться кодом. – nurettin

+0

Кроме того, с этим методом мы не можем получить более 96 точек на дюйм. – nurettin

3

Я использую Креветка для создания моих файлов PDF, и может получить эффект вы хотите, как это:

def render_photo_table(pdf) 
    ps = self.photos.map do |photo| 
    [photo.filename, photo.image_height, photo.image_width] 
    end 
    ps.insert(0, ['Filename', 'Height', 'Width']) 
    pdf.table(ps) do |table| 
    table.header = true 
    end 
end 

Это дает заголовок (набор в позиции массива 0) в верхней части каждой страницы.

2

Если бы это было так, но было довольно легко (после многих головных болей), чтобы сделать это.

Поместите плавающий метку div над элементами, чтобы вы могли получить начальные координаты (я называю это ID item_top).

Затем визуализируйте страницу с верхними делителями данных, с классом 'unbreakable'.

включает также класс, чтобы заставить разрыв страницы:

.page-breaker { 
    display: block; 
    clear: both; 
    page-break-after: always; 
} 

Затем после рендеринга

<script> 
// Very top of items 
var current_top = $('#item_top').offset().top; 
// Check distance from top of page to bottom of item 
// If greater than page size put page break and headers before 
// Reset top of page to top of item. 
$('.unbreakable_section').each(function(index) { 
    var item_bottom = $(this).offset().top + $(this).outerHeight(true); 
    if ((item_bottom - current_top) > 1250) { 
    $(this).before("<div class='page-breaker'></div>"); 
    $(this).before("Headings Div here"); 
    current_top = $(this).offset().top - 48; // item - header height 
    } 
}); 

</script> 

Это будет измерять вертикальное пространство после последнего разрыва страницы и начать новую страницу и поместить заголовок над ним, если пространство превышает высоту страницы. (1250 приблизительный, что было достаточно близко для меня - у меня есть нижний колонтитул на странице, так что высота может варьироваться в зависимости от вашей настройки).

Протестировано на 100-страничном документе работает как ожидалось.

 Смежные вопросы

  • Нет связанных вопросов^_^