Class: Origami::ContentStream
- Defined in:
- lib/origami/page.rb,
lib/origami/graphics/xobject.rb
Overview
A class representing a Stream containing the contents of a Page.
Direct Known Subclasses
Constant Summary collapse
- DEFAULT_SIZE =
12
- DEFAULT_FONT =
:F1
- DEFAULT_LEADING =
20
- DEFAULT_STROKE_COLOR =
Graphics::Color::GrayScale.new(0.0)
- DEFAULT_FILL_COLOR =
Graphics::Color::GrayScale.new(1.0)
- DEFAULT_LINECAP =
Graphics::LineCapStyle::BUTT_CAP
- DEFAULT_LINEJOIN =
Graphics::LineJoinStyle::MITER_JOIN
- DEFAULT_DASHPATTERN =
Graphics::DashPattern.new([], 0)
- DEFAULT_LINEWIDTH =
1.0
Constants inherited from Stream
Constants included from StandardObject
StandardObject::DEFAULT_ATTRIBUTES
Constants included from Object
Instance Attribute Summary collapse
-
#canvas ⇒ Object
Returns the value of attribute canvas.
-
#instructions ⇒ Object
readonly
Returns the value of attribute instructions.
Attributes inherited from Stream
Attributes included from Object
#file_offset, #generation, #no, #objstm_offset, #parent
Instance Method Summary collapse
- #draw_image(name, attr = {}) ⇒ Object
-
#draw_line(from, to, attr = {}) ⇒ Object
Draw a straight line from the point at coord from, to the point at coord to.
-
#draw_polygon(coords = [], attr = {}) ⇒ Object
Draw a polygon from a array of coordinates.
-
#draw_rectangle(x, y, width, height, attr = {}) ⇒ Object
Draw a rectangle at position (x,y) with defined width and height.
-
#initialize(rawdata = "", dictionary = {}) ⇒ ContentStream
constructor
A new instance of ContentStream.
- #paint_shading(shade) ⇒ Object
-
#pre_build ⇒ Object
:nodoc:.
- #render(engine) ⇒ Object
- #set_dash_pattern(pattern) ⇒ Object
- #set_fill_color(color) ⇒ Object
- #set_line_cap(cap) ⇒ Object
- #set_line_join(join) ⇒ Object
- #set_line_width(width) ⇒ Object
- #set_stroke_color(color) ⇒ Object
- #set_text_char_spacing(char_spacing) ⇒ Object
- #set_text_font(fontname, size) ⇒ Object
- #set_text_leading(leading) ⇒ Object
- #set_text_pos(tx, ty) ⇒ Object
- #set_text_rendering(rendering) ⇒ Object
- #set_text_rise(rise) ⇒ Object
- #set_text_scale(scaling) ⇒ Object
- #set_text_word_spacing(word_spacing) ⇒ Object
-
#write(text, attr = {}) ⇒ Object
Adds text to the content stream with custom formatting attributes.
Methods inherited from Stream
#[], #[]=, add_type_info, #cast_to, #data, #data=, #decode!, #each_key, #encode!, guess_type, #method_missing, native_type, parse, #post_build, #rawdata, #rawdata=, #set_predictor, #to_obfuscated_str, #to_s, #value
Methods included from StandardObject
#do_type_check, #has_field?, included, #pdf_version_required, #set_default_value, #set_default_values
Methods included from Object
#<=>, #cast_to, #copy, #export, #indirect_parent, #is_indirect?, #logicalize, #logicalize!, native_type, #native_type, parse, #pdf, #pdf_version_required, #post_build, #reference, #resolve_all_references, #set_indirect, #set_pdf, #size, skip_until_next_obj, #solve, #to_o, #to_s, #type, typeof, #xrefs
Constructor Details
#initialize(rawdata = "", dictionary = {}) ⇒ ContentStream
Returns a new instance of ContentStream.
46 47 48 49 50 51 52 |
# File 'lib/origami/graphics/xobject.rb', line 46 def initialize(rawdata = "", dictionary = {}) @instructions = nil @canvas = Graphics::DummyCanvas.new super(rawdata, dictionary) end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method in the class Origami::Stream
Instance Attribute Details
#canvas ⇒ Object
Returns the value of attribute canvas.
44 45 46 |
# File 'lib/origami/graphics/xobject.rb', line 44 def canvas @canvas end |
#instructions ⇒ Object (readonly)
Returns the value of attribute instructions.
43 44 45 |
# File 'lib/origami/graphics/xobject.rb', line 43 def instructions @instructions end |
Instance Method Details
#draw_image(name, attr = {}) ⇒ Object
81 82 83 84 85 86 87 88 89 90 |
# File 'lib/origami/graphics/xobject.rb', line 81 def draw_image(name, attr = {}) load! if @instructions.nil? x, y = attr[:x], attr[:y] @instructions << PDF::Instruction.new('q') @instructions << PDF::Instruction.new('cm', 300, 0, 0, 300, x, y) @instructions << PDF::Instruction.new('Do', name) @instructions << PDF::Instruction.new('Q') end |
#draw_line(from, to, attr = {}) ⇒ Object
Draw a straight line from the point at coord from, to the point at coord to.
95 96 97 |
# File 'lib/origami/graphics/xobject.rb', line 95 def draw_line(from, to, attr = {}) draw_polygon([from, to], attr) end |
#draw_polygon(coords = [], attr = {}) ⇒ Object
Draw a polygon from a array of coordinates.
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
# File 'lib/origami/graphics/xobject.rb', line 102 def draw_polygon(coords = [], attr = {}) load! if @instructions.nil? stroke_color = attr[:stroke_color] || DEFAULT_STROKE_COLOR fill_color = attr[:fill_color] || DEFAULT_FILL_COLOR line_cap = attr[:line_cap] || DEFAULT_LINECAP line_join = attr[:line_join] || DEFAULT_LINEJOIN line_width = attr[:line_width] || DEFAULT_LINEWIDTH dash_pattern = attr[:dash] || DEFAULT_DASHPATTERN stroke = attr[:stroke].nil? ? true : attr[:stroke] fill = attr[:fill].nil? ? false : attr[:fill] stroke = true if fill == false and stroke == false set_fill_color(fill_color) if fill set_stroke_color(stroke_color) if stroke set_line_width(line_width) set_line_cap(line_cap) set_line_join(line_join) set_dash_pattern(dash_pattern) if @canvas.gs.text_state.is_in_text_object? @instructions << PDF::Instruction.new('ET').render(@canvas) end unless coords.size < 1 x,y = coords.slice!(0) @instructions << PDF::Instruction.new('m',x,y).render(@canvas) coords.each do |px,py| @instructions << PDF::Instruction.new('l',px,py).render(@canvas) end @instructions << (i = if stroke and not fill PDF::Instruction.new('s') elsif fill and not stroke PDF::Instruction.new('f') elsif fill and stroke PDF::Instruction.new('b') end ) i.render(@canvas) end self end |
#draw_rectangle(x, y, width, height, attr = {}) ⇒ Object
Draw a rectangle at position (x,y) with defined width and height.
155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 |
# File 'lib/origami/graphics/xobject.rb', line 155 def draw_rectangle(x, y, width, height, attr = {}) load! if @instructions.nil? stroke_color = attr[:stroke_color] || DEFAULT_STROKE_COLOR fill_color = attr[:fill_color] || DEFAULT_FILL_COLOR line_cap = attr[:line_cap] || DEFAULT_LINECAP line_join = attr[:line_join] || DEFAULT_LINEJOIN line_width = attr[:line_width] || DEFAULT_LINEWIDTH dash_pattern = attr[:dash] || DEFAULT_DASHPATTERN stroke = attr[:stroke].nil? ? true : attr[:stroke] fill = attr[:fill].nil? ? false : attr[:fill] stroke = true if fill == false and stroke == false set_fill_color(fill_color) if fill set_stroke_color(stroke_color) if stroke set_line_width(line_width) set_line_cap(line_cap) set_line_join(line_join) set_dash_pattern(dash_pattern) if @canvas.gs.text_state.is_in_text_object? @instructions << PDF::Instruction.new('ET').render(@canvas) end @instructions << PDF::Instruction.new('re', x,y,width,height).render(@canvas) @instructions << (i = if stroke and not fill PDF::Instruction.new('S') elsif fill and not stroke PDF::Instruction.new('f') elsif fill and stroke PDF::Instruction.new('B') end ) i.render(@canvas) self end |
#paint_shading(shade) ⇒ Object
242 243 244 245 246 247 |
# File 'lib/origami/graphics/xobject.rb', line 242 def paint_shading(shade) load! if @instructions.nil? @instructions << PDF::Instruction.new('sh', shade).render(@canvas) self end |
#pre_build ⇒ Object
:nodoc:
64 65 66 67 68 69 70 71 72 73 |
# File 'lib/origami/graphics/xobject.rb', line 64 def pre_build #:nodoc: load! if @instructions.nil? if @canvas.gs.text_state.is_in_text_object? @instructions << PDF::Instruction.new('ET').render(@canvas) end @data = @instructions.join super end |
#render(engine) ⇒ Object
54 55 56 57 58 59 60 61 62 |
# File 'lib/origami/graphics/xobject.rb', line 54 def render(engine) load! if @instructions.nil? @instructions.each do |instruction| instruction.render(engine) end nil end |
#set_dash_pattern(pattern) ⇒ Object
379 380 381 382 383 384 385 386 |
# File 'lib/origami/graphics/xobject.rb', line 379 def set_dash_pattern(pattern) load! if @instructions.nil? unless @canvas.gs.dash_pattern.eql? pattern @instructions << PDF::Instruction.new('d', pattern.array, pattern.phase).render(@canvas) end self end |
#set_fill_color(color) ⇒ Object
319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 |
# File 'lib/origami/graphics/xobject.rb', line 319 def set_fill_color(color) load! if @instructions.nil? @instructions << ( i = if (color.respond_to? :r and color.respond_to? :g and color.respond_to? :b) or (color.is_a?(::Array) and color.size == 3) r = (color.respond_to?(:r) ? color.r : color[0]).to_f / 255 g = (color.respond_to?(:g) ? color.g : color[1]).to_f / 255 b = (color.respond_to?(:b) ? color.b : color[2]).to_f / 255 PDF::Instruction.new('rg', r, g, b) if @canvas.gs.nonstroking_color != [r,g,b] elsif (color.respond_to? :c and color.respond_to? :m and color.respond_to? :y and color.respond_to? :k) or (color.is_a?(::Array) and color.size == 4) c = (color.respond_to?(:c) ? color.c : color[0]).to_f m = (color.respond_to?(:m) ? color.m : color[1]).to_f y = (color.respond_to?(:y) ? color.y : color[2]).to_f k = (color.respond_to?(:k) ? color.k : color[3]).to_f PDF::Instruction.new('k', c, m, y, k) if @canvas.gs.nonstroking_color != [c,m,y,k] elsif color.respond_to?:g or (0.0..1.0) === color g = color.respond_to?(:g) ? color.g : color PDF::Instruction.new('g', g) if @canvas.gs.nonstroking_color != [ g ] else raise TypeError, "Invalid color : #{color}" end ) i.render(@canvas) if i self end |
#set_line_cap(cap) ⇒ Object
397 398 399 400 401 402 403 404 |
# File 'lib/origami/graphics/xobject.rb', line 397 def set_line_cap(cap) load! if @instructions.nil? if @canvas.gs.line_cap != cap @instructions << PDF::Instruction.new('J', cap).render(@canvas) end self end |
#set_line_join(join) ⇒ Object
406 407 408 409 410 411 412 413 |
# File 'lib/origami/graphics/xobject.rb', line 406 def set_line_join(join) load! if @instructions.nil? if @canvas.gs.line_join != join @instructions << PDF::Instruction.new('j', join).render(@canvas) end self end |
#set_line_width(width) ⇒ Object
388 389 390 391 392 393 394 395 |
# File 'lib/origami/graphics/xobject.rb', line 388 def set_line_width(width) load! if @instructions.nil? if @canvas.gs.line_width != width @instructions << PDF::Instruction.new('w', width).render(@canvas) end self end |
#set_stroke_color(color) ⇒ Object
349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 |
# File 'lib/origami/graphics/xobject.rb', line 349 def set_stroke_color(color) load! if @instructions.nil? @instructions << ( i = if (color.respond_to? :r and color.respond_to? :g and color.respond_to? :b) or (color.is_a?(::Array) and color.size == 3) r = (color.respond_to?(:r) ? color.r : color[0]).to_f / 255 g = (color.respond_to?(:g) ? color.g : color[1]).to_f / 255 b = (color.respond_to?(:b) ? color.b : color[2]).to_f / 255 PDF::Instruction.new('RG', r, g, b) if @canvas.gs.stroking_color != [r,g,b] elsif (color.respond_to? :c and color.respond_to? :m and color.respond_to? :y and color.respond_to? :k) or (color.is_a?(::Array) and color.size == 4) c = (color.respond_to?(:c) ? color.c : color[0]).to_f m = (color.respond_to?(:m) ? color.m : color[1]).to_f y = (color.respond_to?(:y) ? color.y : color[2]).to_f k = (color.respond_to?(:k) ? color.k : color[3]).to_f PDF::Instruction.new('K', c, m, y, k) if @canvas.gs.stroking_color != [c,m,y,k] elsif color.respond_to?:g or (0.0..1.0) === color g = color.respond_to?(:g) ? color.g : color PDF::Instruction.new('G', g) if @canvas.gs.stroking_color != [ g ] else raise TypeError, "Invalid color : #{color}" end ) i.render(@canvas) if i self end |
#set_text_char_spacing(char_spacing) ⇒ Object
310 311 312 313 314 315 316 317 |
# File 'lib/origami/graphics/xobject.rb', line 310 def set_text_char_spacing(char_spacing) load! if @instructions.nil? if char_spacing != @canvas.gs.text_state.char_spacing @instructions << PDF::Instruction.new('Tc', char_spacing).render(@canvas) end self end |
#set_text_font(fontname, size) ⇒ Object
249 250 251 252 253 254 255 256 |
# File 'lib/origami/graphics/xobject.rb', line 249 def set_text_font(fontname, size) load! if @instructions.nil? if fontname != @canvas.gs.text_state.font or size != @canvas.gs.text_state.font_size @instructions << PDF::Instruction.new('Tf', fontname, size).render(@canvas) end self end |
#set_text_leading(leading) ⇒ Object
265 266 267 268 269 270 271 272 |
# File 'lib/origami/graphics/xobject.rb', line 265 def set_text_leading(leading) load! if @instructions.nil? if leading != @canvas.gs.text_state.leading @instructions << PDF::Instruction.new('TL', leading).render(@canvas) end self end |
#set_text_pos(tx, ty) ⇒ Object
258 259 260 261 262 263 |
# File 'lib/origami/graphics/xobject.rb', line 258 def set_text_pos(tx,ty) load! if @instructions.nil? @instructions << PDF::Instruction.new('Td', tx, ty).render(@canvas) self end |
#set_text_rendering(rendering) ⇒ Object
274 275 276 277 278 279 280 281 |
# File 'lib/origami/graphics/xobject.rb', line 274 def set_text_rendering(rendering) load! if @instructions.nil? if rendering != @canvas.gs.text_state.rendering_mode @instructions << PDF::Instruction.new('Tr', rendering).render(@canvas) end self end |
#set_text_rise(rise) ⇒ Object
283 284 285 286 287 288 289 290 |
# File 'lib/origami/graphics/xobject.rb', line 283 def set_text_rise(rise) load! if @instructions.nil? if rise != @canvas.gs.text_state.text_rise @instructions << PDF::Instruction.new('Ts', rise).render(@canvas) end self end |
#set_text_scale(scaling) ⇒ Object
292 293 294 295 296 297 298 299 |
# File 'lib/origami/graphics/xobject.rb', line 292 def set_text_scale(scaling) load! if @instructions.nil? if scale != @canvas.gs.text_state.scaling @instructions << PDF::Instruction.new('Tz', scaling).render(@canvas) end self end |
#set_text_word_spacing(word_spacing) ⇒ Object
301 302 303 304 305 306 307 308 |
# File 'lib/origami/graphics/xobject.rb', line 301 def set_text_word_spacing(word_spacing) load! if @instructions.nil? if word_spacing != @canvas.gs.text_state.word_spacing @instructions << PDF::Instruction.new('Tw', word_spacing).render(@canvas) end self end |
#write(text, attr = {}) ⇒ Object
Adds text to the content stream with custom formatting attributes.
- text
-
Text to write.
- attr
-
Formatting attributes.
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 |
# File 'lib/origami/graphics/xobject.rb', line 203 def write(text, attr = {}) load! if @instructions.nil? x,y = attr[:x], attr[:y] font = attr[:font] || DEFAULT_FONT size = attr[:size] || DEFAULT_SIZE leading = attr[:leading] || DEFAULT_LEADING color = attr[:color] || attr[:fill_color] || DEFAULT_STROKE_COLOR stroke_color = attr[:stroke_color] || DEFAULT_STROKE_COLOR line_width = attr[:line_width] || DEFAULT_LINEWIDTH word_spacing = attr[:word_spacing] char_spacing = attr[:char_spacing] scale = attr[:scale] rise = attr[:rise] rendering = attr[:rendering] @instructions << PDF::Instruction.new('ET').render(@canvas) if (x or y) and @canvas.gs.text_state.is_in_text_object? unless @canvas.gs.text_state.is_in_text_object? @instructions << PDF::Instruction.new('BT').render(@canvas) end set_text_font(font, size) set_text_pos(x, y) if x or y set_text_leading(leading) if leading set_text_rendering(rendering) if rendering set_text_rise(rise) if rise set_text_scale(scale) if scale set_text_word_spacing(word_spacing) if word_spacing set_text_char_spacing(char_spacing) if char_spacing set_fill_color(color) set_stroke_color(stroke_color) set_line_width(line_width) write_text_block(text) self end |