我有几个包含复杂内容的PDF模板文件以及其中的几个空白区域/区域。我需要能够在这些空白区域中写入文本并将生成的PDF保存在文件夹中。
我搜索了这个问题的答案非常密集,但我找不到明确的答案。其中一个更好的解决方案是PDF::Toolkit,但需要购买Adobe Acrobat才能为现有PDF文档添加可替换属性。
PHP世界拥有FPDI,可用于简单地打开PDF文件并在现有内容上书写/绘制。有一个Ruby port of this library,但它的最后一次提交发生在2009年初。此项目看起来并没有得到广泛使用和支持。
问题是:在现有PDF上编辑,编写或绘图的Ruby方式有哪些?
这个问题似乎也没有在这里回答。这些问题是相关的,但并不完全相同:
答案 0 :(得分:28)
你必须检查Prawn gem,你可以通过它生成任何自定义pdf文件。您可以通过将现有PDF视为新Prawn文档的模板,实际使用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的第一页。
答案 1 :(得分:17)
由于Prawn删除了模板功能(它充满了错误),我发现的最简单方法如下:
粗略示例:
require 'prawn'
require 'pdf/toolkit'
template_filename = 'some/dir/Awesome-Graphics.pdf'
prawn_filename = 'temp.pdf'
output_filename = 'output.pdf'
Prawn::Document.generate(prawn_filename) do
# Generate whatever you want here.
text_box "This is some new text!", :at => [100, 300]
end
PDF::Toolkit.pdftk(prawn_filename, "background", template_filename, "output", output_filename)
答案 2 :(得分:16)
我建议prawn生成PDF,然后使用combine_pdf将两个生成的PDF合并为一个。我像这样使用它并且工作得很好。
关于如何组合两个PDF的简短示例(来自README):
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"
答案 3 :(得分:1)
我能想到的最好的是Rails-latex,它不允许您编辑现有的PDF文件,但它允许您设置模板* .tex.erb,您可以动态修改它并将其编译成PDF格式(以及dvi和其他一些)。
答案 4 :(得分:1)
PDFLib似乎做了你想要的东西并且有ruby绑定。
答案 5 :(得分:1)
您不需要使用多种宝石,也可以只使用一种宝石!
在Ruby / Rails中使用PDF确实是一个挑战(所以我发现了!)
这是我能够在Rails中动态添加文本到PDF的方式。
将此宝石添加到您的宝石文件宝石m4(1)
然后您可以使用如下代码:
cpp
您可以在此处找到有关文本框方法的详细信息:https://www.rubydoc.info/gems/combine_pdf/0.2.5/CombinePDF/Page_Methods#textbox-instance_method
我花了几天时间研究了许多不同的宝石:combine_pdf
# get the record from the database to add dynamically to the pdf
user = User.last
# get the existing pdf
pdf = CombinePDF.load "#{Rails.root}/public/pdf/existing_pdf.pdf"
# create a textbox and add it to the existing pdf on page 2
pdf.pages[1].textbox "#{user.first_name} #{user.last_name}", height: 20, width: 70, y: 596, x: 72
# output the new pdf which now contains your dynamic data
pdf.save "#{Rails.root}/public/pdf/output#{Time.now.to_s}.pdf"
prawn
wicked_pdf
但这是截至2019年对我而言最平滑的解决方案。
我希望这可以节省一些人的时间,这样他们就不必经历我对PDF的所有反复试验!
答案 6 :(得分:0)
根据我的研究,Prawn是我发现的免费和最好的宝石之一。模板功能在以后的版本中不起作用。我可以找到使用模板的最新版本是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/
答案 7 :(得分:0)
您可以使用 Origami gem 为现有的 pdf 添加密码或对其进行编辑。
pdf = WickedPdf.new.pdf_from_url(pdf_params[:url])
temp_file = Tempfile.new('temp', encoding: 'ascii-8bit')
temp_file.write(pdf)
# Creates an encrypted document with AES256 and passwords.
pdf = PDF.read(temp_file.path).encrypt(cipher: 'aes', key_size: 256,user_passwd: pdf_params[:user_password], owner_passwd: pdf_params[:owner_password])
save_path = "#{File.basename(__FILE__, ".rb")}.pdf"
pdf.save(save_path)
temp_file.close