Как редактировать или писать на существующих PDF с Ruby?

У меня есть несколько файлов шаблонов PDF со сложным содержимым и несколько пустых областей / областей в них. Мне нужно иметь возможность писать текст в этих пустых областях и сохранять полученные PDF-файлы в папке.

Я довольно интенсивно гуглил ответы на этот вопрос, но не нашел определенных ответов. Одним из лучших решений является PDF:: Toolkit, но для добавления заменяемых атрибутов в существующие документы PDF потребуется приобрести Adobe Acrobat.

Мир PHP наделен FPDI, который можно использовать, чтобы просто открыть файл PDF и писать / рисовать на нем поверх существующего контента. В этой библиотеке есть порт Ruby, но последний коммит произошел в начале 2009 года. Также этот проект не выглядит широко используемым и поддерживаемым.

Вопрос в том, как лучше Ruby редактировать, писать или рисовать в существующих PDF-файлах.

Этот вопрос также, кажется, не получил ответа здесь. Эти вопросы связаны, но не совсем так:

8 ответов

Решение

Вы должны обязательно проверить камень креветок, с помощью которого вы можете создавать любые пользовательские PDF-файлы. На самом деле вы можете использовать prawn для записи текста в существующие PDF-файлы, рассматривая существующий PDF-файл как шаблон для вашего нового документа Prawn.

Например:

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

Поскольку Prawn удалил функцию шаблона (она была полна ошибок), самый простой способ, который я нашел, заключается в следующем:

  1. Используйте Prawn для создания PDF-файла, содержащего ТОЛЬКО динамические части, которые вы хотите добавить.
  2. Используйте PDF:: Toolkit (который упаковывает PDFtk), чтобы объединить Prawn 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)

Я рекомендую использовать prawn для создания PDF-файлов, а затем с помощью комбинировать_pdf для объединения двух сгенерированных PDF-файлов в один. Я использую это так, и это работает просто отлично.

Краткий пример (из README) о том, как объединить два 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"

Вам не нужно использовать комбинацию драгоценных камней, вы можете использовать только один камень!

Работать с PDF-файлами в Ruby/Rails действительно сложно (так я и понял!)

Таким образом я смог динамически добавлять текст в PDF-файл на рельсах.

добавьте этот драгоценный камень в свой гем-файл gem 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"

Вы можете найти подробную информацию о методе текстового поля здесь: https://www.rubydoc.info/gems/combine_pdf/0.2.5/CombinePDF/Page_Methods

Я потратил на это несколько дней, работая над множеством разных драгоценных камней: prawn wicked_pdf pdfkit fillable_pdf

Но по состоянию на 2019 год для меня это было самое удобное решение.

Я надеюсь, что это сэкономит кому-то много времени, поэтому им не придется проходить все испытания и ошибки, которые мне приходилось делать с PDF-файлами!!

PDFLib, кажется, делает то, что вы хотите, и имеет рубиновые привязки.

Лучшее, что я могу придумать, это Rails-latex, он не позволяет редактировать существующие PDF-файлы, но позволяет настроить шаблон *.tex.erb, который вы можете динамически изменять и компилировать в формат PDF (наряду с DVI и ряд других).

Вы можете использовать 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

Согласно моим исследованиям, креветка - один из самых бесплатных и лучших драгоценных камней, которые я нашел. Функциональность шаблона не работает в более поздней версии. Последняя версия, которую я смог найти для работы с шаблонами: 1.0.0.rc2 - 1 марта 2013 г. Не удалось найти более позднюю версию, которая работает с шаблонами. Так что будьте внимательны, если вы используете более поздние версии, чем эта. Проверьте ниже тему для получения дополнительной информации.

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

PDFtk - еще один способный инструмент для работы с PDF и работы с шаблонами. Но упоминаются следующие моменты,

  • Эта библиотека бесплатна для личного использования, но требует лицензии, если используется в производстве
  • Это не-ruby инструмент командной строки

Для получения дополнительной информации, пожалуйста, обратитесь по ссылке ниже http://adamalbrecht.com/2014/01/31/pre-filling-pdf-form-templates-in-ruby-on-rails-with-pdftk/

Другие вопросы по тегам