Prawn - удивительно настраиваемый и гибкий инструмент для генерации PDF. Он позволяет создавать скучные PDF-файлы в финансовом стиле, которые могут почти имитировать (статическую) электронную таблицу Excel, а также могут создавать убедительное письмо-приглашение.
Одним из многих инструментов Прауна для обеспечения такой гибкости является повторитель. Это позволяет вам определить раздел вашего PDF и повторно использовать его снова и снова. штамповка На каждой странице (или просто на нечетных страницах, или на первых 10 страницах и т. д.) вы также можете настроить это.
Рассмотрим простой PDF-документ в качестве примера:
app/pdfs/base_pdf.rb:
класс BasePdf << Шон::Документация деф инициализировать супер() Генерировать pdf конец деф Генерировать pdf повторять все делать текст "Тест" конец 3.время { Start new page ? конец конецapp/controllers/application_controller.rb:
деф доклад send data BasePdf.новый.делать, тип: "Приложение/pdf", расположение: "входной" конец
Теперь нужно перейти на localhost:3000/report.pdf (после настройки маршрута) и будет отображаться PDF, который будет содержать 3 страницы с одинаковым текстом «Тест», напечатанным на каждой из них.
Давайте теперь поймем, как это происходит: Когда код звонит repeat :allИ передай блок, он, по сути, говорит Прауну:
- Создать новый
Stamp(подумайте об этом как о настоящей марке). - Повторите этот штамп все Страницы PDF (3 в нашем примере). И не важно, позвонили ли вы
repeatПосле звонкаstart_new_pageПрежде чем это сделает повторитель на каждый Страница. - Внесите все, что находится внутри блока, в этот новый штамп (в нашем случае простой текст), поэтому, когда Праун «штампует» его, он будет штамповать то же самое снова и снова.
Однако эта «штампировка» не происходит сразу, и не происходит, когда начинается новая страница. Праун будет «штамповать» ретранслятор только после того, как весь документ будет определен. render Это называется. Обычно вы хотите позвонить render Если вы хотите отправить PDF пользователю, он всегда будет в конце.
Проблема с динамическими повторителями
Что, если ты хочешь изменить то, что внутри этого? StampДавайте представим новую ситуацию, более похожую на реальный мир, где у меня есть PDF с множеством страниц, и мне нужно распечатать различную информацию в заголовке для разных страниц. Если вы уже знаете точное количество страниц, которые будет иметь PDF, и на какой странице есть какая информация, вы можете сделать что-то вроде этого:
app/pdfs/base_pdf.rb
деф заголовок повторять все, динамический: истинный делать если ()page number << 5.) текст "Одна вещь" другой текст "Другое дело" конец конец конец
Это все прекрасно, пока вы не попадете в такую ситуацию:
app/pdfs/base_pdf.rb
# Я хочу напечатать название страны первого города на текущей странице деф header country повторять все, динамический: истинный делать текст @current country конец конец Мы предположим, что города - это хэш, где каждый ключ - это страна и содержит множество городов для каждой страны. деф Разработчик: Print cities of world()Все города) Все города.каждый делать !страна, города! @current country = страна города.каждый делать !город! текст город конец конец конец
Вот почему существуют динамические повторители. Они позволяют изменять содержимое штампа для каждой страницы.