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