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, FontType3

Constant Summary

Constants included from DictionaryFields

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

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, #font_wrapper, #font_wrapper=, #must_be_indirect?

Methods inherited from Dictionary

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

Methods inherited from Object

#<=>, #==, #cache, #cached?, #clear_cache, 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.



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 59

def encoding
  cache(: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
      encoding = val[:BaseEncoding] && HexaPDF::Font::Encoding.for_name(val[:BaseEncoding])
      encoding ||= if embedded? || symbolic?
                     encoding_from_font
                   else
                     HexaPDF::Font::Encoding.for_name(:StandardEncoding)
                   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.



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

def symbolic?
  self[:FontDescriptor]&.flagged?(:symbolic)
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
# File 'lib/hexapdf/type/font_simple.rb', line 90

def to_utf8(code)
  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.



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

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

  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



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

def word_spacing_applicable?
  true
end

#writing_modeObject

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



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

def writing_mode
  :horizontal
end