Reputation: 8954
I have an rails application that is joining any count of pdf files. Now I need to add a numbering to the joined pdf using ruby.
Is there a state of the art way to add text or other content to an existing pdf file using ruby?
Upvotes: 5
Views: 2777
Reputation: 841
Working with PDF's is really challenging in Ruby/Rails (so I have found out!)
This is the way I was able to add text dynamically to a PDF in rails.
add this gem to your gem file gem "combine_pdf"
and then you can use code like this:
# 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"
You can find details of the textbox method here: https://www.rubydoc.info/gems/combine_pdf/0.2.5/CombinePDF/Page_Methods#textbox-instance_method
I spent days on this working through a number of different gems:
prawn
wicked_pdf
pdfkit
fillable_pdf
But this was by far the most smooth solution for me as of 2019.
I hope this saves someone a lot of time so they don't have to go through all the trial and error I had to with PDF's!!
Upvotes: 2
Reputation: 19221
You can use CombinePDF for that.
I wrote it because Prawn dropped their template support and I needed a native replacement.
Your code might look something like this:
pdf = CombinePDF.new
pdf << CombinePDF.new("file1.pdf")
pdf << CombinePDF.new("file2.pdf")
pdf.number_pages
pdf.save "output.pdf"
look at the documentation for the different formatting options - I love to surround the numbering with a rounded box (it's in the features, should be easy to play with).
Upvotes: 1
Reputation: 8954
This solution worked well for me...
Prawn::Document.generate("output.pdf", :template => "/path/to/template.pdf") do
text "This is a text in a copied pdf.", :align => :center
end
Upvotes: 1