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:



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

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
100
# File 'lib/hexapdf/type/font_simple.rb', line 97

def to_utf8(code)
  to_unicode_cmap&.to_unicode(code) || (encoding.unicode(code) rescue nil) ||
    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.



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

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:



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

def word_spacing_applicable?
  true
end

#writing_modeObject

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



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

def writing_mode
  :horizontal
end