Parent

Class/Module Index [+]

Quicksearch

Origami::FDF

Class representing an AcroForm Forms Data Format file.

Constants

Size

Attributes

header[RW]
revisions[RW]

Public Instance Methods

<<(object) click to toggle source
# File lib/origami/extensions/fdf.rb, line 132
  def <<(object)
    
    object.set_indirect(true)
    
    if object.no.zero?
    maxno = 1
      while get_object(maxno) do maxno = maxno.succ end
      
      object.generation = 0
      object.no = maxno
    end
    
    @revisions.first.body[object.reference] = object
    
    object.reference
  end
  
  def Catalog
    get_object(@trailer.Root)
  end
  
  def save(filename)
    
    bin = ""
    bin << @header.to_s

    lastno, brange = 0, 0
      
    xrefs = [ XRef.new(0, XRef::LASTFREE, XRef::FREE) ]
    xrefsection = XRef::Section.new

    @revisions.first.body.values.sort.each { |obj|
      if (obj.no - lastno).abs > 1
        xrefsection << XRef::Subsection.new(brange, xrefs)
        brange = obj.no
        xrefs.clear
      end
      
      xrefs << XRef.new(bin.size, obj.generation, XRef::USED)
      lastno = obj.no

      bin << obj.to_s
    }
    
    xrefsection << XRef::Subsection.new(brange, xrefs)
    
    @xreftable = xrefsection
    @trailer ||= Trailer.new
    @trailer.Size = rev.body.size + 1
    @trailer.startxref = bin.size

    bin << @xreftable.to_s
    bin << @trailer.to_s

    fd = File.open(filename, "w").binmode
      fd << bin 
    fd.close
    
    show_entries
  end
  alias saveas save
  
  private
  
  def rebuildxrefs #:nodoc:
    
    startxref = @header.to_s.size
    
    @revisions.first.body.values.each { |object|
      startxref += object.to_s.size
    }
      
    @xreftable = buildxrefs(@revisions.first.body)
    
    @trailer ||= Trailer.new
    @trailer.Size = @revisions.first.body.size + 1
    @trailer.startxref = startxref
    
    self
  end
  
  def buildxrefs(objects) #:nodoc:
    
    lastno = 0
    brange = 0
    
    xrefs = [ XRef.new(0, XRef::LASTFREE, XRef::FREE) ]
    
    xrefsection = XRef::Section.new
    objects.sort.each { |object|
      if (object.no - lastno).abs > 1
        xrefsection << XRef::Subsection.new(brange, xrefs)
        brange = object.no
        xrefs.clear
      end
      
      xrefs << XRef.new(get_object_offset(object.no, object.generation), object.generation, XRef::USED)

      lastno = object.no
    }
    
    xrefsection << XRef::Subsection.new(brange, xrefs)
    
    xrefsection
  end
 
  def get_object_offset(no,generation) #:nodoc:

    bodyoffset = @header.to_s.size
    
    objectoffset = bodyoffset
      
    @revisions.first.body.values.each { |object|
      if object.no == no and object.generation == generation then return objectoffset
      else
        objectoffset += object.to_s.size
      end
    }
    
    nil
  end
  
end
Catalog() click to toggle source
# File lib/origami/extensions/fdf.rb, line 149
def Catalog
  get_object(@trailer.Root)
end
append_subobj(root, objset) click to toggle source
# File lib/origami/extensions/fdf.rb, line 113
def append_subobj(root, objset)
  if objset.find{ |o| o.object_id == root.object_id }.nil?
    objset << root
    if root.is_a?(Array) or root.is_a?(Dictionary)
      root.each { |subobj| append_subobj(subobj, objset) unless subobj.is_a?(Reference) }
    end
  end
end
objects() click to toggle source
# File lib/origami/extensions/fdf.rb, line 112
def objects
  def append_subobj(root, objset)
    if objset.find{ |o| o.object_id == root.object_id }.nil?
      objset << root
      if root.is_a?(Array) or root.is_a?(Dictionary)
        root.each { |subobj| append_subobj(subobj, objset) unless subobj.is_a?(Reference) }
      end
    end
  end
  
  objset = []
  @revisions.first.body.values.each do |object|
    unless object.is_a?(Reference)
      append_subobj(object, objset)
    end
  end
  
  objset
end
save(filename) click to toggle source
# File lib/origami/extensions/fdf.rb, line 153
def save(filename)
  
  bin = ""
  bin << @header.to_s

  lastno, brange = 0, 0
    
  xrefs = [ XRef.new(0, XRef::LASTFREE, XRef::FREE) ]
  xrefsection = XRef::Section.new

  @revisions.first.body.values.sort.each { |obj|
    if (obj.no - lastno).abs > 1
      xrefsection << XRef::Subsection.new(brange, xrefs)
      brange = obj.no
      xrefs.clear
    end
    
    xrefs << XRef.new(bin.size, obj.generation, XRef::USED)
    lastno = obj.no

    bin << obj.to_s
  }
  
  xrefsection << XRef::Subsection.new(brange, xrefs)
  
  @xreftable = xrefsection
  @trailer ||= Trailer.new
  @trailer.Size = rev.body.size + 1
  @trailer.startxref = bin.size

  bin << @xreftable.to_s
  bin << @trailer.to_s

  fd = File.open(filename, "w").binmode
    fd << bin 
  fd.close
  
  show_entries
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.