Class: Origami::XRef

Inherits:
Object
  • Object
show all
Defined in:
lib/origami/xreftable.rb

Overview

Class representing a Cross-reference information.

Defined Under Namespace

Classes: InvalidXRefSectionError, InvalidXRefSubsectionError, Section, Subsection

Constant Summary collapse

FREE =
"f"
USED =
"n"
FIRSTFREE =
65535
@@regexp =
/(?<offset>\d{10}) (?<gen>\d{5}) (?<state>n|f)(\r\n| \r| \n)/

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(offset, generation, state) ⇒ XRef

Creates a new XRef.

offset

The file offset of the referenced Object.

generation

The generation number of the referenced Object.

state

The state of the referenced Object (FREE or USED).

[View source]

66
67
68
# File 'lib/origami/xreftable.rb', line 66

def initialize(offset, generation, state)
    @offset, @generation, @state = offset, generation, state
end

Instance Attribute Details

#generationObject

Returns the value of attribute generation.


58
59
60
# File 'lib/origami/xreftable.rb', line 58

def generation
  @generation
end

#offsetObject

Returns the value of attribute offset.


58
59
60
# File 'lib/origami/xreftable.rb', line 58

def offset
  @offset
end

#stateObject

Returns the value of attribute state.


58
59
60
# File 'lib/origami/xreftable.rb', line 58

def state
  @state
end

Class Method Details

.parse(stream) ⇒ Object

:nodoc:

[View source]

70
71
72
73
74
75
76
77
78
79
80
# File 'lib/origami/xreftable.rb', line 70

def self.parse(stream) #:nodoc:
    if stream.scan(@@regexp).nil?
        raise InvalidXRefError, "Invalid XRef format"
    end

    offset = stream['offset'].to_i
    generation = stream['gen'].to_i
    state = stream['state']

    XRef.new(offset, generation, state)
end

Instance Method Details

#free?Boolean

Returns true if the associated object is freed.

Returns:

[View source]

92
93
94
# File 'lib/origami/xreftable.rb', line 92

def free?
    @state == FREE
end

#to_sObject

Outputs self into PDF code.

[View source]

99
100
101
102
103
104
# File 'lib/origami/xreftable.rb', line 99

def to_s
    off = @offset.to_s.rjust(10, '0')
    gen = @generation.to_s.rjust(5, '0')

    "#{off} #{gen} #{@state}" + EOL
end

#to_xrefstm_data(type_w, field1_w, field2_w) ⇒ Object

[View source]

106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/origami/xreftable.rb', line 106

def to_xrefstm_data(type_w, field1_w, field2_w)
    type_w <<= 3
    field1_w <<= 3
    field2_w <<= 3

    type = ((@state == FREE) ? "\000" : "\001").unpack("B#{type_w}")[0]

    offset = @offset.to_s(2).rjust(field1_w, '0')
    generation = @generation.to_s(2).rjust(field2_w, '0')

    [ type , offset, generation ].pack("B#{type_w}B#{field1_w}B#{field2_w}")
end

#used?Boolean

Returns true if the associated object is used.

Returns:

[View source]

85
86
87
# File 'lib/origami/xreftable.rb', line 85

def used?
    @state == USED
end