2013-05-22 1 views
3

У меня есть 4-страничный шаблон для моего PDF-файла, который я хотел бы сгенерировать с помощью prawn. Я должен повторять этот шаблон в своем pdf-формате несколько раз, каждый раз заполняя его другим контентом.шаблон крестцового повтора, заполняющий его различным содержанием

Если я использую:

Prawn::Document.generate('output.pdf', template: "a_template.pdf") 

я получаю шаблон один раз в output.pdf, последующие страницы пусты.

Если я использую

["John", "Jane"].each do |user| 
    start_new_page template: 'a_template.pdf', page: 1 
    text "Content filled on page 1 for user #{user}" 
    3.times { |i| start_new_page template: 'a_template.pdf', template_page: i+2 } 
    end 

Я получаю текст «Содержимое заполненного на странице 1 для пользователя ...» повторил и перезаписывать друг друга, на каждой странице, которая является первой страницы из шаблона. Поэтому для каждой четвертой страницы у меня есть контент для всех пользователей, которые отображаются в одном месте на странице.

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

Даже если я первый сцепить вместе шаблон нужное количество раз, для каждого пользователя, используя код ниже:

tmp_template = Tempfile.new ['template', '.pdf'], tmpdir 

Prawn::Document.generate(tmp_template.path, skip_page_creation: true) do 
    users.each do |u| 
    4.times { |i| start_new_page template: card_tmpl, template_page: i+1 } 
    end 
end 

А потом делать:

Prawn::Document.generate('output.pdf', template: tmp_template.path) 

заполнить последующие копии шаблона для последующих пользователей, он по-прежнему ставит один и тот же контент, когда копия первой страницы появится в новом шаблоне!

ответ

2

Ничего другого не появилось, поэтому я сделал следующее.

Сначала нужно создать новый объект PDF без каких-либо страниц:

pdf = Prawn::Document.new skip_page_creation: true 

Тогда для каждого пользователя:

  1. Создать новый, полный PDF заправочной нужный шаблон и сохранить его во временный файл tempfile (с использованием Tempfile).
  2. Включите этот временный файл в формате PDF, созданного в начале (pdf объекта), как это (при условии, что шаблон имеет две страницы):
 2.times { |i| pdf.start_new_page template: tempfile, template_page: i+1 } 

Наконец, вынести окончательный PDF:

pdf.render 'output.pdf' 

Производительность ужасная. Но он работает, и PDF, сгенерированный таким образом, открывается читателем acrobat.

+1

Замечания сторонников креветок к [этой проблеме] (https://github.com/prawnpdf/prawn/issues/494) показывают, что мы должны найти другую библиотеку PDF. Креветка решила отказаться от поддержки шаблонов. – wrzasa