Как иметь динамический заголовок в wicked_pdf в Rails?

В настоящее время у меня есть следующий код, чтобы попытаться разместить определенный текст в начале каждой из моих страниц. Конкретный текст title, который передается в этот фрагмент, который я показываю.

documents/clubs/advances/player_evaluation_groups.html.erb

<h2><%= title %></h2>
<% players.each do player %>
  <% if player.position_group != current_position_group %>
    <div class="page-break"></div>
    <h2><%= title %></h2>
  <% end %>
  <%= render partial: "documents/clubs/advances/player_evaluation", locals: { player: player, game: advance.pro_game } %>
<% end %>

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

Я собирался сделать это, предоставив html для заголовка, так как он у меня уже есть, но я не уверен, как обновить заголовок, если я сделаю это таким образом. В настоящее время я просто показываю статическую строку для своего документа в html-заголовке, который я предоставляю для своего документа.


person daveomcd    schedule 31.07.2018    source источник


Ответы (1)


ИЗМЕНИТЬ:

Итак, как я это вижу, есть два варианта.

Способ №1

Не используйте заголовок, предоставленный wicked_pdf, и не имитируйте его содержимым тела. Вам нужно будет предоставить свою собственную логику повторения заголовка на странице, плюс вам нужно будет вручную рассчитать, когда следует разрыв страницы. Разрыв страницы произойдет, если:

а) player.position_group изменяется или...

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

Сказав это, я бы сгруппировал записи игроков по position_group с помощью #group_by, а затем, зная заранее, сколько записей игроков помещается на страницу, используйте each_slice для подходящего количества игроков, поэтому на каждой итерации метода each_slice вы выводите страницу разбить и отобразить заголовок. Если вы не знаете заранее, сколько записей игроков помещается на страницу, вы используете другую стратегию и разрываете страницу + заголовок, когда порог превышен. Наконец, на каждой итерации для метода #group_by вы также выводите разрыв страницы + заголовок.

Способ №2

Я просто использовал этот метод, так как мне также нужно было иметь разные нижние колонтитулы или заголовки в одном и том же документе PDF, поэтому я знаю, что он работает. Сгруппируйте коллекцию по position_group и для каждой группы... создайте временный pdf-файл с расширенным методом wicked_pdf gem WickedPdf.new.pdf_from_string, используя стандартные шаблоны верхнего и нижнего колонтитула. Когда вы сгенерируете все свои временные PDF-файлы, объедините их в один PDF-файл с гемом: combine_pdf

person tommyalvarez    schedule 01.08.2018
comment
спасибо, что нашли время, чтобы помочь. Возможно, я что-то упускаю со своей стороны, но если я хочу, чтобы текст заголовка изменил определенную точку в моем документе - как мне это сделать, если я предварительно загружаю заголовок во время создания файла? Пример: если я хочу изменить текст заголовка после того, как все записи A были написаны. А записей A может быть от 0 до 300 записей. Как это возможно сделать так, как вы упомянули? Спасибо еще раз - person daveomcd; 01.08.2018
comment
@daveomcd Жесткий. Я думаю, что заголовок не предназначен для такой работы. Это статичный, всегда присутствующий набор информации, который не меняется в зависимости от содержимого тела или, по крайней мере, так не задумывалось. Вам лучше не включать заголовок и имитировать динамический раздел с телом. Таким образом, у вас есть доступ ко всему во время генерации. Хотя вам придется делать повторяющуюся логику самостоятельно. Возможно, с применением к коллекции чего-то вроде each_slice - person tommyalvarez; 07.08.2018
comment
Я думаю, вы правы. Я думаю, проблема в том, что я не знаю, как определить, когда была запущена новая страница. Как, по-вашему, each_slice способствует этому? - person daveomcd; 07.08.2018
comment
@daveomcd Вы можете вручную управлять разрывами страниц с помощью тега html и класса CSS: github.com/mileszs /wicked_pdf#разрывы страниц. Я не знаю, насколько переменным является содержимое вашего тела на запись, но, возможно, вы можете предварительно рассчитать вручную количество записей, которые помещаются на страницу, и вручную разрыв страницы в конце каждого each_slice. Если содержимое каждой записи слишком изменчиво, вы можете накапливать размер содержимого для каждой записи во время итерации и разрыва страницы при достижении определенного порога. - person tommyalvarez; 07.08.2018
comment
@daveomcd я только что написал окончательный ответ и предоставил вам альтернативное решение (метод 2), я только что попробовал свой проект, который работает, и я думаю, что он более простой. - person tommyalvarez; 10.08.2018
comment
Спасибо! Мне нравится решение №2. Я только сейчас пытаюсь выяснить, могу ли я объединить две переменные WickedPDF, чтобы каким-то образом объединить их, прежде чем я запишу каждый файл на сервер, а затем присоединюсь к ним. Как только я узнаю, возможно ли это, я сообщу о своих выводах. Хотел бы я хотя бы просто использовать глобальную переменную для установки заголовка документа, ну да ладно - person daveomcd; 11.08.2018
comment
@daveomcd рад, что помог вам. Я предполагаю, что глобальная переменная или любая реализация динамического заголовка на странице в wickedpdf не была сделана из-за того, как структурирован pdf. Вероятно, вы записываете заголовок в pdf-файл только один раз, а затем программы для чтения pdf (adobe, okular и т. д.) повторяют его на каждой странице. - person tommyalvarez; 13.08.2018