11

如何将现有的 PDF 插入到 Prawn 生成的文档中?我正在为账单生成 pdf(作为视图),并且该账单可以有许多附件(png、jpg 或 pdf)。如何在生成的文档中插入/嵌入/包含那些外部 pdf 附件?我已经阅读了手册,查看了源代码,并在网上搜索,但到目前为止没有运气。

我发现的最接近的提示是使用 ImageMagick 或类似的东西将 pdf 转换为另一种格式,但由于我不需要调整文档的大小/操作,这似乎很浪费。旧的方法似乎是通过模板,但我的理解是模板的代码是不稳定的。

有谁知道如何在 Prawn 生成的 PDF 中包含 PDF 页面?如果大虾不会这样做,你知道有什么补充宝石会这样做吗?如果有人可以将我指向类似虾模板但更可靠的东西,那就太棒了。

编辑:我使用 prawnto 和 prawn 在带有 Ruby 2.2.0 的 Rails 4.2.0 中呈现 PDF 视图。


我发现但似乎不适用/太混乱的策略:

  • 在上传时创建 PDF 的 jpg 预览,将其包含在生成的文档中(缺点:没有文本选择/搜索,昂贵)。这是目前我最喜欢的选项,但我不喜欢它。

  • prawn-templates(缺点:不稳定、未维护的代码库;这是一个关键业务应用程序)

  • 通过“combine-pdf”之类的 gem 合并 PDF——我不知道如何通过在特定位置插入外部 PDF 来渲染视图(生成的 pdf 是账单的集合,我需要它们按照他们所附的法案)

4

1 回答 1

12

您对缺乏现有文档的看法是正确的 - 我发现只有2010 年的这个问题使用了您描述的过时方法。我还发现这个 SO answer现在不起作用,因为 Prawn 放弃了对模板的支持。

然而,好消息是有一种方法可以用 Ruby 做你想做的事!您将要做的是将 PDF合并在一起,而不是将 PDF “插入”到原始 PDF 中。

我会推荐这个库combine_pdf来这样做。文档很好,所以做你想做的很简单:

my_prawn_pdf = CombinePDF.new
my_prawn_pdf << CombinePDF.new("my_bill_pdf.pdf")
my_prawn_pdf << CombinePDF.new("attachment.pdf")
my_prawn_pdf.save "combined.pdf"

编辑

针对您的问题:

我正在使用 Prawn 在 Rails 中渲染 pdf 视图,这意味着我认为我没有得到那种后处理

你做!如果您查看combine_pdf 的文档,您会发现从内存加载是使用 gem 的最快方式——文档甚至明确指出 Prawn 可以用作输入。

我不只是将 PDF 粘贴到最后:账单附件必须直接跟在生成的账单页面之后

combine_pdfgem不仅仅用于在末尾添加页面。如文档所示,您可以根据需要循环浏览 PDF 添加页面,例如:

my_pdf # previously defined
new_pdf = CombinePDF.new
my_pdf.pages.each.do |page| 
  i += 1
  new_pdf << my_pdf if i == bill_number # or however you want to handle this logic
end
new_pdf.save "new_pdf.pdf"
于 2015-03-24T23:04:26.800 回答