Class: PDF::Reader::PageTextReceiver

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

Defined Under Namespace

Classes: Point

Constant Summary

DEFAULT_GRAPHICS_STATE =
{
  :ctm          => Matrix.identity(3),
  :char_spacing => 0,
  :word_spacing => 0,
  :h_scaling    => 100,
  :text_leading => 0,
  :text_font    => nil,
  :text_font_size => nil,
  :text_mode    => 0,
  :text_rise    => 0,
  :text_knockout => 0
}

Instance Method Summary (collapse)

Instance Method Details

- (Object) begin_text_object

Text Object Operators



85
86
87
88
# File 'lib/pdf/reader/page_text_receiver.rb', line 85

def begin_text_object
  @text_matrix      = Matrix.identity(3)
  @text_line_matrix = Matrix.identity(3)
end

- (Object) concatenate_matrix(a, b, c, d, e, f)

update the current transformation matrix.

If the CTM is currently undefined, just store the new values.

If there's an existing CTM, then multiply the existing matrix with the new matrix to form the updated matrix.



68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/pdf/reader/page_text_receiver.rb', line 68

def concatenate_matrix(a, b, c, d, e, f)
  transform = Matrix[
    [a, b, 0],
    [c, d, 0],
    [e, f, 1]
  ]
  if state[:ctm]
    state[:ctm] = transform * state[:ctm]
  else
    state[:ctm] = transform
  end
end

- (Object) content



38
39
40
41
42
43
# File 'lib/pdf/reader/page_text_receiver.rb', line 38

def content
  keys = @content.keys.sort.reverse
  keys.map { |key|
    @content[key]
  }.join("\n")
end

- (Object) end_text_object



90
91
92
93
# File 'lib/pdf/reader/page_text_receiver.rb', line 90

def end_text_object
  @text_matrix      = Matrix.identity(3)
  @text_line_matrix = Matrix.identity(3)
end

- (Object) font_size



112
113
114
# File 'lib/pdf/reader/page_text_receiver.rb', line 112

def font_size
  state[:text_font_size] * @text_matrix[0,0]
end

- (Object) invoke_xobject(label)

XObjects

Raises:



199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
# File 'lib/pdf/reader/page_text_receiver.rb', line 199

def invoke_xobject(label)
  save_graphics_state
  dict = @xobject_stack.detect { |xobjects|
    xobjects.has_key?(label)
  }
  xobject = dict ? dict[label] : nil

  raise MalformedPDFError, "XObject #{label} not found" if xobject.nil?
  matrix = xobject.hash[:Matrix]
  concatenate_matrix(*matrix) if matrix

  if xobject.hash[:Subtype] == :Form
    form = PDF::Reader::FormXObject.new(@page, xobject)
    @font_stack.unshift(form.font_objects)
    @xobject_stack.unshift(form.xobjects)
    form.walk(self)
    @font_stack.shift
    @xobject_stack.shift
  end

  restore_graphics_state
end

- (Object) move_text_position(x, y)

Text Positioning Operators



136
137
138
139
140
141
142
143
# File 'lib/pdf/reader/page_text_receiver.rb', line 136

def move_text_position(x, y) # Td
  temp_matrix = Matrix[
    [1, 0, 0],
    [0, 1, 0],
    [x, y, 1]
  ]
  @text_matrix = @text_line_matrix = temp_matrix * @text_line_matrix
end

- (Object) move_text_position_and_set_leading(x, y)

TD



145
146
147
148
# File 'lib/pdf/reader/page_text_receiver.rb', line 145

def move_text_position_and_set_leading(x, y) # TD
  set_text_leading(-1 * y)
  move_text_position(x, y)
end

- (Object) move_to_next_line_and_show_text(str)

'



185
186
187
188
# File 'lib/pdf/reader/page_text_receiver.rb', line 185

def move_to_next_line_and_show_text(str) # '
  move_to_start_of_next_line
  show_text(str)
end

- (Object) move_to_start_of_next_line

T*



158
159
160
# File 'lib/pdf/reader/page_text_receiver.rb', line 158

def move_to_start_of_next_line # T*
  move_text_position(0, -state[:text_leading])
end

- (Object) page=(page)

starting a new page



29
30
31
32
33
34
35
36
# File 'lib/pdf/reader/page_text_receiver.rb', line 29

def page=(page)
  @page    = page
  @objects = page.objects
  @font_stack    = [build_fonts(page.fonts)]
  @xobject_stack = [page.xobjects]
  @content = {}
  @stack   = [DEFAULT_GRAPHICS_STATE]
end

- (Object) restore_graphics_state



53
54
55
# File 'lib/pdf/reader/page_text_receiver.rb', line 53

def restore_graphics_state
  @stack.pop
end

- (Object) save_graphics_state

Graphics State Operators



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

def save_graphics_state
  @stack.push clone_state
end

- (Object) set_character_spacing(char_spacing)

Text State Operators



99
100
101
# File 'lib/pdf/reader/page_text_receiver.rb', line 99

def set_character_spacing(char_spacing)
  state[:char_spacing] = char_spacing
end

- (Object) set_horizontal_text_scaling(h_scaling)



103
104
105
# File 'lib/pdf/reader/page_text_receiver.rb', line 103

def set_horizontal_text_scaling(h_scaling)
  state[:h_scaling] = h_scaling
end

- (Object) set_spacing_next_line_show_text(aw, ac, string)

"



190
191
192
193
194
# File 'lib/pdf/reader/page_text_receiver.rb', line 190

def set_spacing_next_line_show_text(aw, ac, string) # "
  set_word_spacing(aw)
  set_character_spacing(ac)
  move_to_next_line_and_show_text(string)
end

- (Object) set_text_font_and_size(label, size)



107
108
109
110
# File 'lib/pdf/reader/page_text_receiver.rb', line 107

def set_text_font_and_size(label, size)
  state[:text_font]      = label
  state[:text_font_size] = size
end

- (Object) set_text_leading(leading)



116
117
118
# File 'lib/pdf/reader/page_text_receiver.rb', line 116

def set_text_leading(leading)
  state[:text_leading] = leading
end

- (Object) set_text_matrix_and_text_line_matrix(a, b, c, d, e, f)

Tm



150
151
152
153
154
155
156
# File 'lib/pdf/reader/page_text_receiver.rb', line 150

def set_text_matrix_and_text_line_matrix(a, b, c, d, e, f) # Tm
  @text_matrix = @text_line_matrix = Matrix[
    [a, b, 0],
    [c, d, 0],
    [e, f, 1]
  ]
end

- (Object) set_text_rendering_mode(mode)



120
121
122
# File 'lib/pdf/reader/page_text_receiver.rb', line 120

def set_text_rendering_mode(mode)
  state[:text_mode] = mode
end

- (Object) set_text_rise(rise)



124
125
126
# File 'lib/pdf/reader/page_text_receiver.rb', line 124

def set_text_rise(rise)
  state[:text_rise] = rise
end

- (Object) set_word_spacing(word_spacing)



128
129
130
# File 'lib/pdf/reader/page_text_receiver.rb', line 128

def set_word_spacing(word_spacing)
  state[:word_spacing] = word_spacing
end

- (Object) show_text(string)

record text that is drawn on the page



167
168
169
170
171
172
# File 'lib/pdf/reader/page_text_receiver.rb', line 167

def show_text(string) # Tj
  raise PDF::Reader::MalformedPDFError, "current font is invalid" if current_font.nil?
  at = transform(Point.new(0,0))
  @content[at.y] ||= ""
  @content[at.y] << current_font.to_utf8(string)
end

- (Object) show_text_with_positioning(params)

TJ



174
175
176
177
178
179
180
181
182
183
# File 'lib/pdf/reader/page_text_receiver.rb', line 174

def show_text_with_positioning(params) # TJ
  params.each { |arg|
    case arg
    when String
      show_text(arg)
    when Fixnum, Float
      show_text(" ") if arg > 1000
    end
  }
end