Class: PDF::Reader::PageTextReceiver
- Inherits:
-
Object
- Object
- PDF::Reader::PageTextReceiver
- 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)
-
- (Object) begin_text_object
Text Object Operators.
-
- (Object) concatenate_matrix(a, b, c, d, e, f)
update the current transformation matrix.
- - (Object) content
- - (Object) end_text_object
- - (Object) font_size
-
- (Object) invoke_xobject(label)
XObjects.
-
- (Object) move_text_position(x, y)
Text Positioning Operators.
-
- (Object) move_text_position_and_set_leading(x, y)
TD.
-
- (Object) move_to_next_line_and_show_text(str)
'.
-
- (Object) move_to_start_of_next_line
T*.
-
- (Object) page=(page)
starting a new page.
- - (Object) restore_graphics_state
-
- (Object) save_graphics_state
Graphics State Operators.
-
- (Object) set_character_spacing(char_spacing)
Text State Operators.
- - (Object) set_horizontal_text_scaling(h_scaling)
-
- (Object) set_spacing_next_line_show_text(aw, ac, string)
".
- - (Object) set_text_font_and_size(label, size)
- - (Object) set_text_leading(leading)
-
- (Object) set_text_matrix_and_text_line_matrix(a, b, c, d, e, f)
Tm.
- - (Object) set_text_rendering_mode(mode)
- - (Object) set_text_rise(rise)
- - (Object) set_word_spacing(word_spacing)
-
- (Object) show_text(string)
record text that is drawn on the page.
-
- (Object) show_text_with_positioning(params)
TJ.
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
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 |