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

Returns a new instance of FontDescriptor.



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/pdf/reader/font_descriptor.rb', line 15

def initialize(ohash, fd_hash)
  @ascent                = ohash.object(fd_hash[:Ascent])    || 0
  @descent               = ohash.object(fd_hash[:Descent])   || 0
  @missing_width         = ohash.object(fd_hash[:MissingWidth]) || 0
  @font_bounding_box     = ohash.object(fd_hash[:FontBBox])  || [0,0,0,0]
  @avg_width             = ohash.object(fd_hash[:AvgWidth])  || 0
  @cap_height            = ohash.object(fd_hash[:CapHeight]) || 0
  @font_flags            = ohash.object(fd_hash[:Flags])     || 0
  @italic_angle          = ohash.object(fd_hash[:ItalicAngle])
  @font_name             = ohash.object(fd_hash[:FontName]).to_s
  @leading               = ohash.object(fd_hash[:Leading])   || 0
  @max_width             = ohash.object(fd_hash[:MaxWidth])  || 0
  @stem_v                = ohash.object(fd_hash[:StemV])
  @x_height              = ohash.object(fd_hash[:XHeight])
  @font_stretch          = ohash.object(fd_hash[:FontStretch]) || :Normal
  @font_weight           = ohash.object(fd_hash[:FontWeight])  || 400
  @font_family           = ohash.object(fd_hash[:FontFamily])

  # 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.object(fd_hash[:FontFile2])
  #TODO handle FontFile and FontFile3

  @is_ttf = true if @font_program_stream
end

Instance Attribute Details

#ascentObject (readonly)

Returns the value of attribute ascent.



10
11
12
# File 'lib/pdf/reader/font_descriptor.rb', line 10

def ascent
  @ascent
end

#avg_widthObject (readonly)

Returns the value of attribute avg_width.



10
11
12
# File 'lib/pdf/reader/font_descriptor.rb', line 10

def avg_width
  @avg_width
end

#cap_heightObject (readonly)

Returns the value of attribute cap_height.



10
11
12
# File 'lib/pdf/reader/font_descriptor.rb', line 10

def cap_height
  @cap_height
end

#descentObject (readonly)

Returns the value of attribute descent.



10
11
12
# File 'lib/pdf/reader/font_descriptor.rb', line 10

def descent
  @descent
end

#font_bounding_boxObject (readonly)

Returns the value of attribute font_bounding_box.



10
11
12
# File 'lib/pdf/reader/font_descriptor.rb', line 10

def font_bounding_box
  @font_bounding_box
end

#font_familyObject (readonly)

Returns the value of attribute font_family.



10
11
12
# File 'lib/pdf/reader/font_descriptor.rb', line 10

def font_family
  @font_family
end

#font_flagsObject (readonly)

Returns the value of attribute font_flags.



10
11
12
# File 'lib/pdf/reader/font_descriptor.rb', line 10

def font_flags
  @font_flags
end

#font_nameObject (readonly)

Returns the value of attribute font_name.



10
11
12
# File 'lib/pdf/reader/font_descriptor.rb', line 10

def font_name
  @font_name
end

#font_stretchObject (readonly)

Returns the value of attribute font_stretch.



10
11
12
# File 'lib/pdf/reader/font_descriptor.rb', line 10

def font_stretch
  @font_stretch
end

#font_weightObject (readonly)

Returns the value of attribute font_weight.



10
11
12
# File 'lib/pdf/reader/font_descriptor.rb', line 10

def font_weight
  @font_weight
end

#italic_angleObject (readonly)

Returns the value of attribute italic_angle.



10
11
12
# File 'lib/pdf/reader/font_descriptor.rb', line 10

def italic_angle
  @italic_angle
end

#leadingObject (readonly)

Returns the value of attribute leading.



10
11
12
# File 'lib/pdf/reader/font_descriptor.rb', line 10

def leading
  @leading
end

#max_widthObject (readonly)

Returns the value of attribute max_width.



10
11
12
# File 'lib/pdf/reader/font_descriptor.rb', line 10

def max_width
  @max_width
end

#missing_widthObject (readonly)

Returns the value of attribute missing_width.



10
11
12
# File 'lib/pdf/reader/font_descriptor.rb', line 10

def missing_width
  @missing_width
end

#stem_vObject (readonly)

Returns the value of attribute stem_v.



10
11
12
# File 'lib/pdf/reader/font_descriptor.rb', line 10

def stem_v
  @stem_v
end

#x_heightObject (readonly)

Returns the value of attribute x_height.



10
11
12
# File 'lib/pdf/reader/font_descriptor.rb', line 10

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)



64
65
66
67
68
69
70
71
# File 'lib/pdf/reader/font_descriptor.rb', line 64

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



47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/pdf/reader/font_descriptor.rb', line 47

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
      puts "Char Code: #{char_code} -- Advance Width: #{char_metric.advance_width}" > 0
      return char_metric.advance_width
    end
  end
end