【问题标题】:Ruby gem to extract form data from fillable PDFRuby gem 从可填写的 PDF 中提取表单数据
【发布时间】:2013-11-07 16:52:51
【问题描述】:

我们遇到的 PDF 文件是可填写的 PDF 表单,其中包含用户提供的数据。我们想提取用户填写到表单中的数据,但不知道有任何具有此功能的 gem。因此,例如,PDF 表单中有一个“名字”字段,用户用“大卫”完成了该字段——我们希望获得诸如“名字=>大卫”之类的数据

查看示例文件的属性告诉我:

  • PDF 生成器:Adobe LiveCycle Designer ES 8.2
  • PDF 版本:1.7,Adobe Extension Level 3 (Acrobat 9.x)

感谢您的建议和想法!

谢谢

【问题讨论】:

  • 我使用active_pdftk 填写表单,它也具有转储字段的功能,虽然我没有尝试过,但您当前必须通过 github 安装,就像 gem 'active_pdftk', git: "https://github.com/tcocca/active_pdftk.git"
  • @engineersmnky 谢谢——在命令行上使用 PDFtk 是我的后备选择——我希望 Ruby 有一种“原生”方式来获取数据......
  • 您可以在 ruby​​ 中使用此 gem,然后解析输出文件并将其删除。这是我的建议,但如果您找到其他方法,请告诉我,因为我将来可能需要实施此方法。

标签: ruby pdf


【解决方案1】:

由于dump_data_fields 方法具有非常标准化的结构,因此该方法应该可以满足您的需要,它将输出一个数组,其中每个字段都是一个哈希对象。

def parse_pdf_dump(file)
  file = open(file,&:read)
  fields = file.split("---").delete_if{|f| f.empty?}
  #Create an Array of the fields 
  fields.map do |field|
    #Create a have of attribute => value for each field attribute
    Hash[
       field.split("\n").map do |line|
            split_line = line.split(":")
            #grab the name of the attribute
            name = split_line.shift
            #grab the value of the attribute
            #join is used in the case that the data originally had a : in it
            val = split_line.join(":")
            unless f_name.nil?
             [name.downcase, val.strip]
            end
       end
    ]
  end
end

使用active_pdftk如下调用

require 'active_pdftk'
output_path = '/data_fields.txt'
pdftk = ActivePdftk::Wrapper.new(:path => [YOUR PATH TO PDFTK BINARY OR EXE])
pdftk.dump_data_fields([YOUR PDF], :output => output_path)
fields_array = parse_pdf_dump(output_path)
%x( rm output_path)

因此,您将使用 pdftk 将数据字段转储到数组 fields_array 中,然后删除文本文件。

【讨论】:

    猜你喜欢
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 2021-08-07
    • 1970-01-01
    • 2020-11-05
    • 2017-05-28
    • 2014-12-13
    相关资源
    最近更新 更多