Class: HexaPDF::Type::FontSimple

Inherits:
Font show all
Defined in:
lib/hexapdf/type/font_simple.rb

Overview

Represents a simple PDF font.

A simple font has only single-byte character codes and only supports horizontal metrics.

See: PDF1.7 s9.6

Direct Known Subclasses

FontTrueType, FontType1

Constant Summary

Constants included from DictionaryFields

DictionaryFields::Boolean, DictionaryFields::PDFByteString, DictionaryFields::PDFDate

Constants inherited from Object

Object::NOT_DUPLICATABLE_CLASSES

Instance Attribute Summary

Attributes inherited from Object

#data, #document, #must_be_indirect

Instance Method Summary collapse

Methods inherited from Font

#bounding_box, #embedded?, #font_file, #must_be_indirect?

Methods inherited from Dictionary

#[], #[]=, define_field, #delete, #each, each_field, #empty?, field, #key?, #to_hash, #type

Methods inherited from Object

#<=>, #==, deep_copy, #deep_copy, #document?, #eql?, #gen, #gen=, #hash, #indirect?, #initialize, #inspect, #must_be_indirect?, #null?, #oid, #oid=, #type, #validate, #value, #value=

Constructor Details

This class inherits a constructor from HexaPDF::Object

Instance Method Details

#decode(string) ⇒ Object

Decodes the given string into an array of character codes.



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

def decode(string)
  string.bytes
end

#encodingObject

Returns the encoding object used for this font.

Note that the encoding is cached internally when accessed the first time.



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/hexapdf/type/font_simple.rb', line 56

def encoding
  document.cache(@data, :encoding) do
    case (val = self[:Encoding])
    when Symbol
      encoding = HexaPDF::Font::Encoding.for_name(val)
      encoding = encoding_from_font if encoding.nil?
      encoding
    when HexaPDF::Dictionary, Hash
      encoding = val[:BaseEncoding]
      encoding = HexaPDF::Font::Encoding.for_name(encoding) if encoding
      unless encoding
        if embedded? || symbolic?
          encoding = encoding_from_font
        else
          encoding = HexaPDF::Font::Encoding.for_name(:StandardEncoding)
        end
      end
      encoding = difference_encoding(encoding, val[:Differences]) if val.key?(:Differences)
      encoding
    when nil
      encoding_from_font
    else
      raise HexaPDF::Error, "Unknown value for font's encoding: #{self[:Encoding]}"
    end
  end
end

#symbolic?Boolean

Returns true if the font is a symbolic font, false if it is not, and nil if it is not known.



118
119
120
# File 'lib/hexapdf/type/font_simple.rb', line 118

def symbolic?
  self[:FontDescriptor] && self[:FontDescriptor].flagged?(:symbolic) || nil
end

#to_utf8(code) ⇒ Object

Returns the UTF-8 string for the given character code, or calls the configuration option ‘font.on_missing_unicode_mapping’ if no mapping was found.



90
91
92
93
# File 'lib/hexapdf/type/font_simple.rb', line 90

def to_utf8(code)
  (to_unicode_cmap && to_unicode_cmap.to_unicode(code)) ||
    encoding.unicode(code) || missing_unicode_mapping(code)
end

#width(code) ⇒ Object

Returns the unscaled width of the given code point in glyph units, or 0 if the width for the code point is missing.



97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/hexapdf/type/font_simple.rb', line 97

def width(code)
  widths = self[:Widths]
  first_char = self[:FirstChar] || -1
  last_char = self[:LastChar] || -1

  if widths && code >= first_char && code <= last_char
    widths[code - first_char]
  elsif widths && key?(:FontDescriptor)
    self[:FontDescriptor][:MissingWidth]
  else
    0
  end
end

#word_spacing_applicable?Boolean

Returns whether word spacing is applicable when using this font.

Always returns true for simple fonts.

See: PDF1.7 s9.3.3



127
128
129
# File 'lib/hexapdf/type/font_simple.rb', line 127

def word_spacing_applicable?
  true
end

#writing_modeObject

Returns the writing mode which is always :horizontal for simple fonts like Type1.



112
113
114
# File 'lib/hexapdf/type/font_simple.rb', line 112

def writing_mode
  :horizontal
end