在线填写并更新上传的PDF表单,并将其保存回服务器Ruby on Rails



以下是要求:

在我用Ruby on Rails开发的web应用程序中,我们需要有一个选项,可以将PDF form template上传到系统,并将其带回浏览器本身,用户应该能够在线填写PDF表单,最后将其保存回服务器。

然后,用户将从应用程序下载更新后的PDF表格。我搜索了很多,但找不到合适的解决方案。请提出建议。

正如我所说的,对于已经嵌入表单字段的预构建PDF,我使用pdtkAvailable Here和active_pdftkgem 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

基本上,它的作用是将表单流式传输到一个临时文件中。然后它将其转换为ActivePdftk::Form。然后读取所有字段并构建field_name => value结构的Hash。由此生成一个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

此示例将从@object获取@formpopulate,然后将其作为填充和展平的PDF呈现给最终用户。如果你只需要把它保存回数据库,我相信你可以使用某种上传器来解决这个问题。

最新更新