Как я уже говорил для скомпилированных PDF с полями формы уже внедренный я использую pdtk
Available Here и active_pdftk
камень Available Here. Это стандартный процесс я использую, но ваши могут отличаться:
class Form
def populate(obj)
#Stream the PDF form into a TempFile in the tmp directory
template = stream
#turn the streamed file into a pdftk Form
#pdftk_path should be the path to the executable for pdftk
populated_form = ActivePdftk::Form.new(template,path: pdftk_path)
#This will generate the form_data Hash based on the fields in the form
#each form field is specified as a method with or without arguments
#fields with arguments are specified as method_name*args for splitting purposes
form_data = populated_form.fields.each_with_object({}) do |field,obj|
meth,args = field.name.split("*")
#set the Hash key to the value of the method with or without args
obj[field.name] = args ? obj.send(meth,args) : obj.send(meth)
end
fill(template,form_data)
end
private
def fdf(waiver_data,path)
@fdf ||= ActivePdftk::Fdf.new(waiver_data)
@fdf.save_to path
end
def fill(template,waiver_data)
rand_path = generate_tmp_file('.fdf')
initialize_pdftk.fill_form(template,
fdf(waiver_data,rand_path),
output:"#{rand_path.gsub(/fdf/,'pdf')}",
options:{flatten:true})
end
def initialize_pdftk
@pdftk ||= ActivePdftk::Wrapper.new(:path =>pdftk_path)
end
end
В основном то, что это делает его потоки форму в TempFile. Затем он преобразует его в ActivePdftk::Form
. Затем он считывает все поля и строит Hash
структуры field_name => value
. Из этого он создает файл fdf
и использует его для заполнения фактического файла PDF, а затем выводит его на другой временный файл, сплющенный, чтобы удалить поля из окончательного результата.
Ваш прецедент может отличаться, но мы надеемся, что этот пример поможет вам в достижении вашей цели. Я не включил все используемые методы, поскольку предполагаю, что вы знаете, как делать такие вещи, как чтение файла. Также мои формы требуют немного большей динамики, как методы с аргументами. Очевидно, что если вы просто заполняете необработанные фиксированные данные, эта часть тоже может быть изменена.
Пример использования, заданный вашим классом, называется Form
, и у вас есть другой объект для заполнения формы.
class SomeController < ApplicationController
def download_form
@form = Form.find(params[:form_id])
@object = MyObject.find(params[:my_object_id])
send_file(@form.populate(@object), type: :pdf, layout:false, disposition: 'attachment')
end
end
Этот пример будет принимать @form
и populate
его из @object
затем представить его к конечному пользователю, как заполненный и сплющенные PDF. Если вам просто нужно сохранить его обратно в базу данных, я уверен, что вы можете понять это, используя какой-либо загрузчик.
Имеет ли шаблон уже поля? Если это так, я использую 'pdftk' и неизданный' active_pdftk' камень для обработки этих вещей без проблем. – engineersmnky
Да, у него уже есть филе! не могли бы вы поделиться своим опытом с ним? Я имею в виду код .. –