Class: HexaPDF::DictionaryFields::Field

Inherits:
Object
  • Object
show all
Defined in:
lib/hexapdf/dictionary_fields.rb

Overview

A dictionary field contains information about one field of a structured PDF object and this information comes directly from the PDF specification.

By incorporating this field information into HexaPDF it is possible to do many things automatically, like checking for the correct minimum PDF version to use or converting a date from its string representation to a Time object.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(type, required = false, default = nil, indirect = nil, version = nil) ⇒ Field

Create a new Field object. See Dictionary::define_field for information on the arguments.

Depending on the type entry an appropriate field converter object is chosen from the available converters.



108
109
110
111
112
113
# File 'lib/hexapdf/dictionary_fields.rb', line 108

def initialize(type, required = false, default = nil, indirect = nil, version = nil)
  @type = [type].flatten
  @type_mapped = false
  @required, @default, @indirect, @version = required, default, indirect, version
  @converters = @type.map {|t| self.class.converter_for(t) }.compact
end

Instance Attribute Details

#indirectObject (readonly)

Returns true if the value for this field needs to be an indirect object, false if it needs to be a direct object or nil if it can be either.



99
100
101
# File 'lib/hexapdf/dictionary_fields.rb', line 99

def indirect
  @indirect
end

#versionObject (readonly)

Returns the PDF version that is required for this field.



102
103
104
# File 'lib/hexapdf/dictionary_fields.rb', line 102

def version
  @version
end

Class Method Details

.converter_for(type) ⇒ Object

Returns the converter for the given type specification.

The converter list is checked for a suitable converter from the front to the back. So if two converters could potentially be used for the same type, the one that appears earlier is used.



93
94
95
# File 'lib/hexapdf/dictionary_fields.rb', line 93

def self.converter_for(type)
  @converters.find {|converter| converter.usable_for?(type) }
end

.convertersObject

Returns the list of available converter objects.

See ::converter_for for information on how this list is used.



84
85
86
# File 'lib/hexapdf/dictionary_fields.rb', line 84

def self.converters
  @converters ||= []
end

Instance Method Details

#convert(data, document) ⇒ Object

Converts the data into a useful object if possible. Otherwise returns nil.



162
163
164
165
166
167
168
# File 'lib/hexapdf/dictionary_fields.rb', line 162

def convert(data, document)
  @converters.each do |converter|
    result = converter.convert(data, type, document)
    return result unless result.nil?
  end
  nil
end

#defaultObject

Returns a duplicated default value, automatically taking unduplicatable classes into account.



143
144
145
# File 'lib/hexapdf/dictionary_fields.rb', line 143

def default
  duplicatable_default? ? @default.dup : @default
end

#default?Boolean

Returns true if a default value is available.

Returns:



137
138
139
# File 'lib/hexapdf/dictionary_fields.rb', line 137

def default?
  !@default.nil?
end

#required?Boolean

Returns true if this field is required.

Returns:



132
133
134
# File 'lib/hexapdf/dictionary_fields.rb', line 132

def required?
  @required
end

#typeObject

Returns the array with valid types for this field.



116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/hexapdf/dictionary_fields.rb', line 116

def type
  return @type if @type_mapped
  @type_mapped = true
  @type.concat(@converters.map(&:additional_types).compact.flatten)
  @type.map! do |type|
    if type.kind_of?(Symbol)
      HexaPDF::GlobalConfiguration.constantize('object.type_map', type)
    else
      type
    end
  end
  @type.uniq!
  @type
end

#valid_object?(obj) ⇒ Boolean

Returns true if the given object is valid for this field.

Returns:



156
157
158
159
# File 'lib/hexapdf/dictionary_fields.rb', line 156

def valid_object?(obj)
  type.any? {|t| obj.kind_of?(t) } ||
    (obj.kind_of?(HexaPDF::Object) && type.any? {|t| obj.value.kind_of?(t) })
end