2015-04-13 1 views
0

Вот требование:Заполнение и обновление загруженную форму PDF онлайн и сохранить его обратно на сервер - Рубин на Rails

В моем веб-приложение, разработанный в Ruby On Rails, мы требуем, чтобы иметь возможность для загрузите PDF form template в систему, верните его в браузере и пользователь сможет заполнить форму PDF онлайн и, наконец, сохранить его обратно на сервер.

Затем пользователь придет и загрузит обновленную форму PDF из приложения. Я много искал, но не смог найти правильное решение. Пожалуйста, предложите.

+0

Имеет ли шаблон уже поля? Если это так, я использую 'pdftk' и неизданный' active_pdftk' камень для обработки этих вещей без проблем. – engineersmnky

+0

Да, у него уже есть филе! не могли бы вы поделиться своим опытом с ним? Я имею в виду код .. –

ответ

1

Как я уже говорил для скомпилированных PDF с полями формы уже внедренный я использую pdtkAvailable 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. Если вам просто нужно сохранить его обратно в базу данных, я уверен, что вы можете понять это, используя какой-либо загрузчик.

Смежные вопросы