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: PDF2.0 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=, #glyph_scaling_factor, #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?, field, #gen, #gen=, #hash, #indirect?, #initialize, #inspect, make_direct, #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.



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

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.



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/hexapdf/type/font_simple.rb', line 66

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

#font_descriptorObject

Returns the font descriptor. May be nil for a standard 14 font.

The font descriptor is required except for the standard 14 fonts in PDF version up to 1.7.



59
60
61
# File 'lib/hexapdf/type/font_simple.rb', line 59

def font_descriptor
  self[:FontDescriptor]
end

#symbolic?Boolean

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

Returns:



124
125
126
# File 'lib/hexapdf/type/font_simple.rb', line 124

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.



97
98
99
# File 'lib/hexapdf/type/font_simple.rb', line 97

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.



103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/hexapdf/type/font_simple.rb', line 103

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: PDF2.0 s9.3.3

Returns:



133
134
135
# File 'lib/hexapdf/type/font_simple.rb', line 133

def word_spacing_applicable?
  true
end

#writing_modeObject

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



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

def writing_mode
  :horizontal
end