【问题标题】:Fill up and update an uploaded PDF form online and save it back to the server - Ruby on Rails在线填写并更新上传的 PDF 表单并将其保存回服务器 - Ruby on Rails
【发布时间】:2015-04-13 10:47:37
【问题描述】:

这是要求:

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

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

【问题讨论】:

  • 模板是否已有字段?如果是这样,我会使用pdftk 和未发布的active_pdftk gem 来毫无问题地处理这些事情。
  • 是的,已经有文件了!你能和它分享你的经验吗?我的意思是代码..

标签: ruby-on-rails ruby pdf


【解决方案1】:

正如我对已嵌入表单字段的预构建 PDF 所述,我使用 pdtk Available Hereactive_pdftk gem 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。然后它读取所有字段并构建Hashfield_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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 2010-10-01
    • 2018-05-04
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 2011-02-19
    相关资源
    最近更新 更多