将外部 PDF 插入 Prawn 生成的文档
Posted
技术标签:
【中文标题】将外部 PDF 插入 Prawn 生成的文档【英文标题】:Inserting external PDF into Prawn generated document 【发布时间】:2015-05-25 18:42:18 【问题描述】:如何将现有的 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 是账单的集合,我需要他们遵守他们所附的法案)
【问题讨论】:
【参考方案1】:你说得对,缺乏这方面的现有文档 - 我发现只有 this issue from 2010 使用了你描述的过时方法。我还发现 this 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 视图,这意味着我认为我没有得到那种后期处理
你会的!如果您查看documentation for combine_pdf,您会发现从内存中加载是使用 gem 的最快方式——文档甚至明确指出 Prawn 可以用作输入。
我不只是将 PDF 附加到最后:账单附件必须直接跟在生成的账单页面之后
combine_pdf
宝石isn't just for adding pages on the end。如文档所示,您可以根据需要循环浏览 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"
【讨论】:
我确实在不同的 *** 响应中看到了 combine_pdf,但我不知道如何在这种情况下使用它。看起来这只对静态的已知 PDF 有用;那是对的吗?我正在使用 Prawn 在 Rails 中呈现 pdf 视图,这意味着我认为我没有得到那种后处理。此外,即使我错了,我也不只是将 PDF 粘贴到最后:账单附件必须直接跟在生成的账单页面之后,并且 PDF 包含任意数量的账单。我认为此解决方案不适用于呈现 Rails 视图是错误的吗? @Lee 抱歉耽搁了!你可以做这两件事,combine_pdf
是适用的,如我编辑的答案所示。以上是关于将外部 PDF 插入 Prawn 生成的文档的主要内容,如果未能解决你的问题,请参考以下文章
ruby 使用Prawn创建PDF / X-1a:2003文档的示例
ruby 使用带有页眉,页脚和页码的Prawn Library创建PDF文档。