Class Origami::ContentStream
In: sources/parser/graphics/xobject.rb
Parent: Stream

A class representing a Stream containing the contents of a Page.

Methods

Constants

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

Public Class methods

[Source]

    # File sources/parser/graphics/xobject.rb, line 44
44:     def initialize(rawdata = "", dictionary = {})
45:     
46:       @instructions = []
47:       @gs = Graphics::State.new
48: 
49:       super(rawdata, dictionary)
50:     end

Public Instance methods

Draw a straight line from the point at coord from, to the point at coord to.

[Source]

    # File sources/parser/graphics/xobject.rb, line 55
55:     def draw_line(from, to, attr = {})
56:       draw_polygon([from, to], attr)
57:     end

Draw a polygon from a array of coordinates.

[Source]

     # File sources/parser/graphics/xobject.rb, line 62
 62:     def draw_polygon(coords = [], attr = {})
 63: 
 64:       stroke_color  = attr[:stroke_color] || DEFAULT_STROKE_COLOR
 65:       fill_color    = attr[:fill_color] || DEFAULT_FILL_COLOR
 66:       line_cap      = attr[:line_cap] || DEFAULT_LINECAP
 67:       line_join     = attr[:line_join] || DEFAULT_LINEJOIN
 68:       line_width    = attr[:line_width] || DEFAULT_LINEWIDTH
 69:       dash_pattern  = attr[:dash] || DEFAULT_DASHPATTERN
 70: 
 71:       stroke        = attr[:stroke].nil? ? true : attr[:stroke]
 72:       fill          = attr[:fill].nil? ? false : attr[:fill]
 73: 
 74:       stroke = true if fill == false and stroke == false 
 75: 
 76:       set_fill_color(fill_color) if fill
 77:       set_stroke_color(stroke_color) if stroke
 78:       set_line_width(line_width)
 79:       set_line_cap(line_cap)
 80:       set_line_join(line_join)
 81:       set_dash_pattern(dash_pattern)
 82:    
 83:       if @gs.text_state.is_in_text_object?
 84:         @instructions << Text::Instruction::ET.new.update_state(@gs)
 85:       end
 86: 
 87:       unless coords.size < 1
 88:         x,y = coords.slice!(0)
 89:         @instructions << Graphics::Instruction::M.new(x,y).update_state(@gs)
 90: 
 91:         coords.each do |px,py|
 92:           @instructions << Graphics::Instruction::L.new(px,py).update_state(@gs)
 93:         end
 94: 
 95:         @instructions << (i =
 96:           if stroke and not fill
 97:             Graphics::Instruction::CloseS.new
 98:           elsif fill and not stroke
 99:             Graphics::Instruction::F.new
100:           elsif fill and stroke
101:             Graphics::Instruction::CloseB.new
102:           end
103:         )
104: 
105:         i.update_state(@gs)
106:       end
107: 
108:       self
109:     end

Draw a rectangle at position (x,y) with defined width and height.

[Source]

     # File sources/parser/graphics/xobject.rb, line 114
114:     def draw_rectangle(x, y, width, height, attr = {})
115: 
116:       stroke_color  = attr[:stroke_color] || DEFAULT_STROKE_COLOR
117:       fill_color    = attr[:fill_color] || DEFAULT_FILL_COLOR
118:       line_cap      = attr[:line_cap] || DEFAULT_LINECAP
119:       line_join     = attr[:line_join] || DEFAULT_LINEJOIN
120:       line_width    = attr[:line_width] || DEFAULT_LINEWIDTH
121:       dash_pattern  = attr[:dash] || DEFAULT_DASHPATTERN
122: 
123:       stroke        = attr[:stroke].nil? ? true : attr[:stroke]
124:       fill          = attr[:fill].nil? ? false : attr[:fill]
125: 
126:       stroke = true if fill == false and stroke == false 
127: 
128:       set_fill_color(fill_color) if fill
129:       set_stroke_color(stroke_color) if stroke
130:       set_line_width(line_width)
131:       set_line_cap(line_cap)
132:       set_line_join(line_join)
133:       set_dash_pattern(dash_pattern)
134: 
135:       if @gs.text_state.is_in_text_object?
136:         @instructions << Text::Instruction::ET.new.update_state(@gs)
137:       end
138: 
139:       @instructions << Graphics::Instruction::RE.new(x,y,width,height).update_state(@gs)
140:   
141:       @instructions << (i =
142:         if stroke and not fill
143:           Graphics::Instruction::S.new
144:         elsif fill and not stroke
145:           Graphics::Instruction::F.new
146:         elsif fill and stroke
147:           Graphics::Instruction::B.new
148:         end
149:       )
150: 
151:       i.update_state(@gs)
152:       
153:       self
154:     end

[Source]

     # File sources/parser/graphics/xobject.rb, line 199
199:     def paint_shading(shade)
200:       @instructions << Graphics::Instruction::SH.new(shade).update_state(@gs)
201: 
202:       self
203:     end

[Source]

     # File sources/parser/graphics/xobject.rb, line 325
325:     def set_dash_pattern(pattern)
326:       unless @gs.dash_pattern.eql? pattern
327:         @instructions << Graphics::Instruction::D.new(pattern.array, pattern.phase).update_state(@gs)
328:       end
329: 
330:       self
331:     end

[Source]

     # File sources/parser/graphics/xobject.rb, line 267
267:     def set_fill_color(color)
268:       
269:       @instructions << ( i =
270:         if (color.respond_to? :r and color.respond_to? :g and color.respond_to? :b) or (color.is_a?(::Array) and color.size == 3)
271:           r = (color.respond_to?(:r) ? color.r : color[0]).to_f / 255
272:           g = (color.respond_to?(:g) ? color.g : color[1]).to_f / 255
273:           b = (color.respond_to?(:b) ? color.b : color[2]).to_f / 255
274:           Graphics::Instruction::RG.new(r, g, b) if @gs.nonstroking_color != [r,g,b]
275: 
276:         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)
277:           c = (color.respond_to?(:c) ? color.c : color[0]).to_f
278:           m = (color.respond_to?(:m) ? color.m : color[1]).to_f
279:           y = (color.respond_to?(:y) ? color.y : color[2]).to_f
280:           k = (color.respond_to?(:k) ? color.k : color[3]).to_f
281:           Graphics::Instruction::K.new(c, m, y, k) if @gs.nonstroking_color != [c,m,y,k]
282:           
283:         elsif color.respond_to?:g or (0.0..1.0) === color 
284:           g = color.respond_to?(:g) ? color.g : color
285:           Graphics::Instruction::G.new(g) if @gs.nonstroking_color != [ g ]
286: 
287:         else
288:           raise TypeError, "Invalid color : #{color}"
289:         end
290:       )
291: 
292:       i.update_state(@gs) if i
293:       self 
294:     end

[Source]

     # File sources/parser/graphics/xobject.rb, line 341
341:     def set_line_cap(cap)
342:       if @gs.line_cap != cap
343:         @instructions << Graphics::Instruction::JCap.new(cap).update_state(@gs)
344:       end
345: 
346:       self
347:     end

[Source]

     # File sources/parser/graphics/xobject.rb, line 349
349:     def set_line_join(join)
350:       if @gs.line_join != join
351:         @instructions << Graphics::Instruction::JJoin.new(join).update_state(@gs)
352:       end
353: 
354:       self
355:     end

[Source]

     # File sources/parser/graphics/xobject.rb, line 333
333:     def set_line_width(width)
334:       if @gs.line_width != width
335:         @instructions << Graphics::Instruction::W.new(width).update_state(@gs)
336:       end
337: 
338:       self
339:     end

[Source]

     # File sources/parser/graphics/xobject.rb, line 296
296:     def set_stroke_color(color)
297:       
298:       @instructions << ( i =
299:         if (color.respond_to? :r and color.respond_to? :g and color.respond_to? :b) or (color.is_a?(::Array) and color.size == 3)
300:           r = (color.respond_to?(:r) ? color.r : color[0]).to_f / 255
301:           g = (color.respond_to?(:g) ? color.g : color[1]).to_f / 255
302:           b = (color.respond_to?(:b) ? color.b : color[2]).to_f / 255
303:           Graphics::Instruction::StrokeRG.new(r, g, b) if @gs.stroking_color != [r,g,b]
304: 
305:         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)
306:           c = (color.respond_to?(:c) ? color.c : color[0]).to_f
307:           m = (color.respond_to?(:m) ? color.m : color[1]).to_f
308:           y = (color.respond_to?(:y) ? color.y : color[2]).to_f
309:           k = (color.respond_to?(:k) ? color.k : color[3]).to_f
310:           Graphics::Instruction::StrokeK.new(c, m, y, k) if @gs.stroking_color != [c,m,y,k]
311:           
312:         elsif color.respond_to?:g or (0.0..1.0) === color 
313:           g = color.respond_to?(:g) ? color.g : color
314:           Graphics::Instruction::StrokeG.new(g) if @gs.stroking_color != [ g ]
315: 
316:         else
317:           raise TypeError, "Invalid color : #{color}"
318:         end
319:       )
320: 
321:       i.update_state(@gs) if i
322:       self 
323:     end

[Source]

     # File sources/parser/graphics/xobject.rb, line 259
259:     def set_text_char_spacing(char_spacing)
260:       if char_spacing != @gs.text_state.char_spacing
261:         @instructions << Text::Instruction::Tc.new(char_spacing).update_state(@gs)
262:       end
263: 
264:       self
265:     end

[Source]

     # File sources/parser/graphics/xobject.rb, line 205
205:     def set_text_font(fontname, size)
206:       if fontname != @gs.text_state.font or size != @gs.text_state.font_size
207:         @instructions << Text::Instruction::Tf.new(fontname, size).update_state(@gs)
208:       end
209: 
210:       self
211:     end

[Source]

     # File sources/parser/graphics/xobject.rb, line 219
219:     def set_text_leading(leading)
220:       if leading != @gs.text_state.leading
221:         @instructions << Text::Instruction::TL.new(leading).update_state(@gs)
222:       end
223: 
224:       self
225:     end

[Source]

     # File sources/parser/graphics/xobject.rb, line 213
213:     def set_text_pos(tx,ty)
214:       @instructions << Text::Instruction::Td.new(tx, ty).update_state(@gs)
215:       
216:       self
217:     end

[Source]

     # File sources/parser/graphics/xobject.rb, line 227
227:     def set_text_rendering(rendering)
228:       if rendering != @gs.text_state.rendering_mode
229:         @instructions << Text::Instruction::Tr.new(rendering).update_state(@gs)
230:       end
231: 
232:       self
233:     end

[Source]

     # File sources/parser/graphics/xobject.rb, line 235
235:     def set_text_rise(rise)
236:       if rise != @gs.text_state.text_rise
237:         @instructions << Text::Instruction::Ts.new(rise).update_state(@gs)
238:       end
239:       
240:       self
241:     end

[Source]

     # File sources/parser/graphics/xobject.rb, line 243
243:     def set_text_scale(scaling)
244:       if scale != @gs.text_state.scaling
245:         @instructions << Text::Instruction::Tz.new(scaling).update_state(@gs)
246:       end
247: 
248:       self
249:     end

[Source]

     # File sources/parser/graphics/xobject.rb, line 251
251:     def set_text_word_spacing(word_spacing)
252:       if word_spacing != @gs.text_state.word_spacing
253:         @instructions << Text::Instruction::Tw.new(word_spacing).update_state(@gs)
254:       end
255:       
256:       self
257:     end

Adds text to the content stream with custom formatting attributes.

text:Text to write.
attr:Formatting attributes.

[Source]

     # File sources/parser/graphics/xobject.rb, line 161
161:     def write(text, attr = {})
162: 
163:       x,y       = attr[:x], attr[:y] 
164:       font      = attr[:font] || DEFAULT_FONT
165:       size      = attr[:size] || DEFAULT_SIZE
166:       leading   = attr[:leading] || DEFAULT_LEADING
167:       color     = attr[:color] || attr[:fill_color] || DEFAULT_STROKE_COLOR
168:       stroke_color = attr[:stroke_color] || DEFAULT_STROKE_COLOR
169:       line_width    = attr[:line_width] || DEFAULT_LINEWIDTH
170:       word_spacing  = attr[:word_spacing]
171:       char_spacing  = attr[:char_spacing]
172:       scale     = attr[:scale]
173:       rise      = attr[:rise]
174:       rendering = attr[:rendering]
175: 
176:       @instructions << Text::Instruction::ET.new.update_state(@gs) if (x or y) and @gs.text_state.is_in_text_object?
177: 
178:       unless @gs.text_state.is_in_text_object? 
179:         @instructions << Text::Instruction::BT.new.update_state(@gs)
180:       end
181: 
182:       set_text_font(font, size)
183:       set_text_pos(x, y) if x or y
184:       set_text_leading(leading) if leading
185:       set_text_rendering(rendering) if rendering
186:       set_text_rise(rise) if rise
187:       set_text_scale(scale) if scale
188:       set_text_word_spacing(word_spacing) if word_spacing
189:       set_text_char_spacing(char_spacing) if char_spacing
190:       set_fill_color(color)
191:       set_stroke_color(stroke_color) 
192:       set_line_width(line_width)
193: 
194:       write_text_block(text)
195:      
196:       self
197:     end

[Validate]