Class: PDF::Reader::FontDescriptor

Inherits:
Object
  • Object
show all
Defined in:
lib/pdf/reader/font_descriptor.rb

Overview

Font descriptors are outlined in Section 9.8, PDF 32000-1:2008, pp 281-288

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(ohash, fd_hash) ⇒ FontDescriptor

: (PDF::Reader::ObjectHash, Hash[untyped, untyped]) -> void



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/pdf/reader/font_descriptor.rb', line 61

def initialize(ohash, fd_hash)
  # TODO change these to typed derefs
  @ascent                = ohash.deref_number(fd_hash[:Ascent])    || 0 #: Numeric
  @descent               = ohash.deref_number(fd_hash[:Descent])   || 0 #: Numeric
  @missing_width         = ohash.deref_number(fd_hash[:MissingWidth]) || 0 #: Numeric
  @font_bounding_box     = ohash.deref_array_of_numbers(
    fd_hash[:FontBBox]
  ) || [0,0,0,0] #: Array[Numeric]
  @avg_width             = ohash.deref_number(fd_hash[:AvgWidth])  || 0 #: Numeric
  @cap_height            = ohash.deref_number(fd_hash[:CapHeight]) || 0 #: Numeric
  @font_flags            = ohash.deref_integer(fd_hash[:Flags])     || 0 #: Integer
  @italic_angle          = ohash.deref_number(fd_hash[:ItalicAngle]) #: Numeric?
  @font_name             = ohash.deref_name(fd_hash[:FontName]).to_s #: String
  @leading               = ohash.deref_number(fd_hash[:Leading])   || 0 #: Numeric
  @max_width             = ohash.deref_number(fd_hash[:MaxWidth])  || 0 #: Numeric
  @stem_v                = ohash.deref_number(fd_hash[:StemV]) #: Numeric?
  @x_height              = ohash.deref_number(fd_hash[:XHeight]) #: Numeric?
  @font_stretch          = ohash.deref_name(fd_hash[:FontStretch]) || :Normal #: Symbol
  @font_weight           = ohash.deref_number(fd_hash[:FontWeight])  || 400 #: Numeric
  @font_family           = ohash.deref_string(fd_hash[:FontFamily]) #: String?

  # A FontDescriptor may have an embedded font program in FontFile
  # (Type 1 Font Program), FontFile2 (TrueType font program), or
  # FontFile3 (Other font program as defined by Subtype entry)
  # Subtype entries:
  # 1) Type1C:        Type 1 Font Program in Compact Font Format
  # 2) CIDFontType0C: Type 0 Font Program in Compact Font Format
  # 3) OpenType:      OpenType Font Program
  # see Section 9.9, PDF 32000-1:2008, pp 288-292
  @font_program_stream = ohash.deref_stream(fd_hash[:FontFile2]) #: PDF::Reader::Stream?
  #TODO handle FontFile and FontFile3
  @ttf_program_stream = nil #: TTFunk::File?

  @is_ttf = @font_program_stream ? true : false #: bool
  @glyph_to_pdf_sf = nil #: Numeric?
end

Instance Attribute Details

#ascentObject (readonly)

: Numeric



31
32
33
# File 'lib/pdf/reader/font_descriptor.rb', line 31

def ascent
  @ascent
end

#avg_widthObject (readonly)

: Numeric



40
41
42
# File 'lib/pdf/reader/font_descriptor.rb', line 40

def avg_width
  @avg_width
end

#cap_heightObject (readonly)

: Numeric



28
29
30
# File 'lib/pdf/reader/font_descriptor.rb', line 28

def cap_height
  @cap_height
end

#descentObject (readonly)

: Numeric



34
35
36
# File 'lib/pdf/reader/font_descriptor.rb', line 34

def descent
  @descent
end

#font_bounding_boxObject (readonly)

: Array



25
26
27
# File 'lib/pdf/reader/font_descriptor.rb', line 25

def font_bounding_box
  @font_bounding_box
end

#font_familyObject (readonly)

: String?



16
17
18
# File 'lib/pdf/reader/font_descriptor.rb', line 16

def font_family
  @font_family
end

#font_flagsObject (readonly)

: Integer



58
59
60
# File 'lib/pdf/reader/font_descriptor.rb', line 58

def font_flags
  @font_flags
end

#font_nameObject (readonly)

: String



13
14
15
# File 'lib/pdf/reader/font_descriptor.rb', line 13

def font_name
  @font_name
end

#font_stretchObject (readonly)

: Symbol



19
20
21
# File 'lib/pdf/reader/font_descriptor.rb', line 19

def font_stretch
  @font_stretch
end

#font_weightObject (readonly)

: Numeric



22
23
24
# File 'lib/pdf/reader/font_descriptor.rb', line 22

def font_weight
  @font_weight
end

#italic_angleObject (readonly)

: Numeric?



49
50
51
# File 'lib/pdf/reader/font_descriptor.rb', line 49

def italic_angle
  @italic_angle
end

#leadingObject (readonly)

: Numeric



37
38
39
# File 'lib/pdf/reader/font_descriptor.rb', line 37

def leading
  @leading
end

#max_widthObject (readonly)

: Numeric



43
44
45
# File 'lib/pdf/reader/font_descriptor.rb', line 43

def max_width
  @max_width
end

#missing_widthObject (readonly)

: Numeric



46
47
48
# File 'lib/pdf/reader/font_descriptor.rb', line 46

def missing_width
  @missing_width
end

#stem_vObject (readonly)

: Numeric?



52
53
54
# File 'lib/pdf/reader/font_descriptor.rb', line 52

def stem_v
  @stem_v
end

#x_heightObject (readonly)

: Numeric?



55
56
57
# File 'lib/pdf/reader/font_descriptor.rb', line 55

def x_height
  @x_height
end

Instance Method Details

#glyph_to_pdf_scale_factorObject

PDF states that a glyph is 1000 units wide, true type doesn’t enforce any behavior, but uses units/em to define how wide the ‘M’ is (the widest letter) : () -> Numeric



118
119
120
121
122
123
124
125
# File 'lib/pdf/reader/font_descriptor.rb', line 118

def glyph_to_pdf_scale_factor
  if @is_ttf
    @glyph_to_pdf_sf ||= (1.0 / ttf_program_stream.header.units_per_em) * 1000.0
  else
    @glyph_to_pdf_sf ||= 1.0
  end
  @glyph_to_pdf_sf
end

#glyph_width(char_code) ⇒ Object

: (Integer) -> Numeric



99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/pdf/reader/font_descriptor.rb', line 99

def glyph_width(char_code)
  if @is_ttf
    if ttf_program_stream.cmap.unicode.length > 0
      glyph_id = ttf_program_stream.cmap.unicode.first[char_code]
    else
      glyph_id = char_code
    end
    char_metric = ttf_program_stream.horizontal_metrics.metrics[glyph_id]
    if char_metric
      char_metric.advance_width
    else
      0
    end
  end
end