class Nguyen::Fdf

Map keys and values to Adobe's FDF format.

Straight port of Perl's PDF::FDF::Simple by Steffen Schwigon. Parsing FDF files is not supported (yet).

Constants

Attributes

options[R]

Public Class Methods

new(data = {}, options = {}) click to toggle source
# File lib/nguyen/fdf.rb, line 11
def initialize(data = {}, options = {})
  @data = data
  @options = {
    file: nil,
    ufile: nil,
    id: nil
  }.merge(options)
end

Public Instance Methods

save_to(path) click to toggle source

write fdf content to path

# File lib/nguyen/fdf.rb, line 39
def save_to(path)
  File.write(path, to_fdf)
end
to_fdf() click to toggle source

generate FDF content

# File lib/nguyen/fdf.rb, line 21
def to_fdf
  fdf = header
  
  @data.each do |key, value|
    if Hash === value
      value.each do |sub_key, sub_value|
        fdf << field("#{key}_#{sub_key}", sub_value)
      end
    else
      fdf << field(key, value)
    end
  end

  fdf << footer
  return fdf
end

Protected Instance Methods

field(key, value) click to toggle source
# File lib/nguyen/fdf.rb, line 59
def field(key, value)
  "<</T(#{key})/V" +
    (Array === value ? "[#{value.map{ |v|"(#{quote(v)})" }.join}]" : "(#{quote(value)})") +
    ">>\n"
end
header() click to toggle source
# File lib/nguyen/fdf.rb, line 45
def header
  header = "%FDF-1.2\n\n1 0 obj\n<<\n/FDF << /Fields 2 0 R"
  
  # /F
  header << "/F (#{options[:file]})" if options[:file]
  # /UF
  header << "/UF (#{options[:ufile]})" if options[:ufile]
  # /ID
  header << "/ID[" << options[:id].join << "]" if options[:id]
  
  header << ">>\n>>\nendobj\n2 0 obj\n["
  return header
end
quote(value) click to toggle source
# File lib/nguyen/fdf.rb, line 65
def quote(value)
  value.to_s.strip.
    gsub( /\\/, '\\' ).
    gsub( /\(/, '\(' ).
    gsub( /\)/, '\)' ).
    gsub( /\n/, '\r' )
end