class Origami::XRefStream

Class representing a XRef Stream.

Constants

Index
Size
W
XREF_COMPRESSED
XREF_FREE
XREF_USED

Public Class Methods

new(data = "", dictionary = {}) click to toggle source
Calls superclass method Origami::Stream::new
# File lib/origami/xreftable.rb, line 387
def initialize(data = "", dictionary = {})
    super(data, dictionary)

    @xrefs = nil
end

Public Instance Methods

<<(xref) click to toggle source

Adds an XRef to this Stream.

# File lib/origami/xreftable.rb, line 416
def <<(xref)
    load! if @xrefs.nil?

    @xrefs << xref
end
clear() click to toggle source
# File lib/origami/xreftable.rb, line 471
def clear
    self.data = ''
    @xrefs = []
    self.Index = []
end
each(&b) click to toggle source

Iterates over each XRef present in the stream.

# File lib/origami/xreftable.rb, line 425
def each(&b)
    load! if @xrefs.nil?

    @xrefs.each(&b)
end
each_with_number() { |next, no| ... } click to toggle source

Iterates over each XRef present in the stream, passing the XRef and its object number.

# File lib/origami/xreftable.rb, line 434
def each_with_number
    return enum_for(__method__) unless block_given?

    load! if @xrefs.nil?

    ranges = object_ranges
    xrefs = @xrefs.to_enum

    ranges.each do |range|
        range.each do |no|
            begin
                yield(xrefs.next, no)
            rescue StopIteration
                raise InvalidXRefStreamObjectError, "Range is bigger than number of entries"
            end
        end
    end
end
entries() click to toggle source
# File lib/origami/xreftable.rb, line 393
def entries
    load! if @xrefs.nil?

    @xrefs
end
find(no) click to toggle source

Returns an XRef matching this object number.

# File lib/origami/xreftable.rb, line 456
def find(no)
    load! if @xrefs.nil?

    ranges = object_ranges

    index = 0
    ranges.each do |range|
        return @xrefs[index + no - range.begin] if range.cover?(no)

        index += range.size
    end

    nil
end

Private Instance Methods

field_widths() click to toggle source

Check and return the internal field widths.

# File lib/origami/xreftable.rb, line 533
def field_widths
    widths = self.W

    unless widths.is_a?(Array) and widths.length == 3 and widths.all? {|w| w.is_a?(Integer) and w >= 0 }
        raise InvalidXRefStreamObjectError, "Invalid W field: #{widths}"
    end

    widths
end
object_ranges() click to toggle source
# File lib/origami/xreftable.rb, line 479
def object_ranges
    load! if @xrefs.nil?

    if self.key?(:Index)
        ranges = self.Index
        unless ranges.is_a?(Array) and ranges.length.even? and ranges.all?{|i| i.is_a?(Integer)}
            raise InvalidXRefStreamObjectError, "Index must be an even Array of integers"
        end

        ranges.each_slice(2).map { |start, length| Range.new(start.to_i, start.to_i + length.to_i - 1) }
    else
        [ 0...@xrefs.size ]
    end
end