How to edit or write on existing PDF with Ruby?

2019-01-14 11:16发布

I have a couple of PDF template files with complex content and several blank regions/areas in them. I need to be able to write text in those blank regions and save the resulting PDFs in a folder.

I googled for answers on this question quite intensively, but I didn't find definite answers. One of the better solutions is PDF::Toolkit, but it would require the purchase of Adobe Acrobat to add replaceable attributes to existing PDF documents.

The PHP world is blessed with FPDI that can be used to simply open a PDF file and write/draw on it over the existing content. There is a Ruby port of this library, but the last commit for it happened at the beginning of 2009. Also that project doesn't look like it is widely used and supported.

The question is: What is the better Ruby way of editing, writing or drawing on existing PDFs?

This question also doesn't seem to be answered on here. These questions are related, but not really the same:

6条回答
爷、活的狠高调
2楼-- · 2019-01-14 11:26

According to my research, Prawn is one of the free and best gems I found. The template functionality isn't working in later version. The latest version I could find to work with templates is 1.0.0.rc2 - March 1, 2013. Couldn't find any later version which works with templates. So be mindful if you are using later versions than this. Check below thread for more info.

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

PDFtk is another capable tool for PDF manipulation and to work with templates. But it mentions following points,

  • This library is free for personal use, but requires a license if used in production
  • This is a non-ruby command line tool

For more information please refer the below link http://adamalbrecht.com/2014/01/31/pre-filling-pdf-form-templates-in-ruby-on-rails-with-pdftk/

查看更多
做自己的国王
3楼-- · 2019-01-14 11:28

PDFLib seems to do the thing you want and has ruby bindings.

查看更多
干净又极端
4楼-- · 2019-01-14 11:30

you have to definitely check out Prawn gem, by which you can generate any custom pdf files. You can actually use prawn to write in text into existing pdfs by treating the existing PDF as a template for your new Prawn document.

For example:

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

This will write text onto the first page of the old pdf.

See more here: http://prawn.majesticseacreature.com/manual.pdf

查看更多
爷的心禁止访问
5楼-- · 2019-01-14 11:31

I recommend prawn for generating PDFs and then using combine_pdf to combine two generated PDFs together into one. I use it like this and it works just fine.

Short example (from the README) of how to combine two PDFs:

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"
查看更多
趁早两清
6楼-- · 2019-01-14 11:35

Since Prawn has removed the template feature (it was full of bugs) the easiest way I've found is the following:

  1. Use Prawn to generate a PDF with ONLY the dynamic parts you want to add.
  2. Use PDF::Toolkit (which wraps PDFtk) to combine the Prawn PDF with the original.

Rough Example:

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)
查看更多
爷、活的狠高调
7楼-- · 2019-01-14 11:45

The best I can think of is Rails-latex, it doesn't allow you to edit existing PDF files but it would allow you to set up template *.tex.erb which you may dynamically modify and compile them into PDF format (along with dvi and a number of others).

查看更多
登录 后发表回答