2012-02-07 80 views
24

我有一对夫妇的PDF模板文件复杂的内容,并在他们的几个盲点区域/地区。我需要能够在这些空白区域写入文本并将生成的PDF保存到文件夹中。如何使用Ruby编辑或编写现有PDF?

我用Google搜索了关于这个问题的答案很密集,但我没有找到明确的答案。更好的解决方案之一是PDF::Toolkit,但它需要购买Adobe Acrobat来为现有PDF文档添加可替换的属性。

PHP的世界是幸运的FPDI可以用来简单地打开一个PDF文件,并写入/在现有的内容就可以了借鉴。有一个Ruby port of this library,但最后一次提交发生在2009年初。此外,该项目看起来并不像它被广泛使用和支持。

现在的问题是:什么是更好的编辑,写作或绘图现有PDF的Ruby方式?

这个问题也似乎没有在这里得到解答的。这些问题是相关的,但不是真的一样:

回答

27

你必须明确检查出Prawn创业板,通过它可以生成任何自定义PDF文件。您可以通过将现有的PDF视为您的新Prawn文档的模板,实际上使用虾将文本写入现有的pdf。

例如:

filename = "#{Prawn::DATADIR}/pdfs/multipage_template.pdf" 
Prawn::Document.generate("full_template.pdf", :template => filename) do 
    text "THis content is written on the first page of the template", :align => :center 
end 

这将写入文本到旧PDF的第一页。

更多,请参阅: http://prawn.majesticseacreature.com/manual.pdf

+0

是的,我已经考虑过它(甚至列在我的问题中),但编辑现有的PDF是我的项目的要求。谢谢你的答案。 – 2012-02-09 15:03:50

+0

我有这个问题,有什么想法吗? http://stackoverflow.com/questions/12076299/my-text-is-written-in-a-bad-direction-when-i-use-a-template – Sebastien 2012-08-23 07:10:46

+2

我正是使用这种方法广泛地添加文本到现有的PDF文件。为什么这个答案不适合你? – 2012-11-04 23:49:49

1

我能想到的是Rails-latex最好的,它不允许您可以编辑现有的PDF文件,但它可以让您设置模板* .tex.erb,您可以动态修改它们并将它们编译为PDF垫(以及dvi和其他许多)。

+0

谢谢你的回答,但编辑现有的PDF是我的要求。对于创建新的PDF文件,像对虾这样的工作对我来说... – 2012-02-09 14:58:18

1

PDFLib似乎做你想要的东西,有红宝石绑定。

+0

这确实看起来像一个很棒的工具,但由于它不是开源的(不是免费的) - 我们必须考虑价格。我们可以使用的版本大约是2100美元 - 这是我们很多低预算的小型项目。此外,这可能不能被视为“Rails方式”,因为它太昂贵了:) 我可能会继续使用PDF :: Toolkit,并使用它来填充PDF属性值,而不是使用PDF进行绘制。 但是,谢谢你的答案 - 我真的很感激它! – 2012-02-09 15:02:53

+0

是的,一开始就很难啃掉一大笔开销。购买了Prince XML用于制作PDF,而且当时似乎是很多钱,但它已经收到了回报。 – 2012-02-09 15:26:24

+0

我也使用Prince XML作为我的其他项目之一 - 它的工作原理,但不是为了这种情况,我试图解决不幸的问题。 – 2012-02-09 20:58:41

14

由于Prawn去掉了模板功能(这是完全错误的),我发现最简单的方法是:

  1. 使用Prawn生成PDF只与您要添加的动态部分。
  2. 使用PDF::Toolkit(它包装PDFtk)的虾PDF与原来相结合。

粗糙实施例:

require 'prawn' 
require 'pdf/toolkit' 

template_file = 'some/dir/Awesome-Graphics.pdf' 
prawn_file = 'temp.pdf' 
output_file = 'output.pdf' 

Prawn::Document.generate(prawn_file) do 
    # Generate whatever you want here. 
    text_box "This is some new text!", :at => [100, 300] 
end 

PDF::Toolkit.pdftk(prawn_file, "background", template_file, "output", output_file) 
12

我推荐prawn用于生成PDF文件,然后使用combine_pdf到两个生成的PDF一起组合成一个。我像这样使用它,它工作得很好。

简短的例子(自述)的如何将两个PDF文件合并:

company_logo = CombinePDF.load("company_logo.pdf").pages[0] 
pdf = CombinePDF.load "content_file.pdf" 
pdf.pages.each { |page| page << company_logo } # notice the << operator is on a page and not a PDF object. 
pdf.save "content_with_logo.pdf" 
+0

感谢您分享此内容,对我们的使用案例非常有用。 – 2015-07-08 17:34:53

+0

我发现这对我来说效果不好,因为“徽标”文件(对我来说,这是一个总体模板,我只是添加了一点文字)会掩盖我添加的任何内容(使用Prawn :: PDF,类似于其他一些答案)。我发现这为我解决了这个问题,尽管(在这个答案中替换了第3行中的块):'page.replace(company_logo.copy << page)' – lindes 2017-11-12 20:40:49

1

根据我的研究,虾是免费的,最好的宝石,我发现之一。模板功能在更高版本中不起作用。我能找到的用于模板的最新版本是1.0.0.rc2 - 2013年3月1日。无法找到任何适用于模板的更高版本。因此,如果您使用的是以后版本,请注意。检查下面的线程获取更多信息。

https://groups.google.com/forum/#!searchin/prawn-ruby/prawn $ 20templates /虾 - 红宝石/ RYGPImNcR0I/7mxtnrEDHeQJ

PDFTK是PDF操纵另一个能够工具,并使用模板的工作。但它提到以下几点,

  • 这个库是免费供个人使用,但需要一个许可证,如果在生产中使用
  • 这是一个非红宝石命令行工具

欲了解更多信息请参考下面的链接 http://adamalbrecht.com/2014/01/31/pre-filling-pdf-form-templates-in-ruby-on-rails-with-pdftk/