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)

为后续用户填写后续模板副本,每当第一页的副本出现在新模板中时,它仍然会放置相同的内容!

4

1 回答 1

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 阅读器打开。

于 2013-05-29T22:23:32.503 回答