pdf-wrapper 0.1.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +27 -0
- data/Rakefile +1 -1
- data/TODO +3 -1
- data/examples/cell.rb +2 -2
- data/examples/image.rb +4 -2
- data/examples/markup.rb +2 -2
- data/examples/repeating.rb +2 -2
- data/examples/scaled_image.rb +2 -2
- data/examples/shapes.rb +2 -2
- data/examples/table.rb +4 -6
- data/examples/table_fixed_col_width.rb +26 -0
- data/examples/translate.rb +2 -2
- data/examples/utf8-long.rb +3 -3
- data/examples/utf8.rb +2 -2
- data/examples/varied_page_size.rb +15 -0
- data/lib/pdf/wrapper.rb +158 -49
- data/lib/pdf/wrapper/table.rb +96 -21
- data/lib/pdf/wrapper/text.rb +52 -21
- data/specs/graphics_spec.rb +29 -26
- data/specs/image_spec.rb +21 -22
- data/specs/load_spec.rb +7 -6
- data/specs/spec_helper.rb +5 -0
- data/specs/tables_spec.rb +26 -25
- data/specs/text_spec.rb +72 -61
- data/specs/wrapper_spec.rb +162 -175
- metadata +4 -3
- data/examples/text.rb +0 -14
data/lib/pdf/wrapper/table.rb
CHANGED
@@ -19,7 +19,6 @@ module PDF
|
|
19
19
|
# TODO: add support for a table footer
|
20
20
|
# - repeating each page, or just at the bottom?
|
21
21
|
# - if it repeats, should it be different on each page? ie. a sum of that pages rows, etc.
|
22
|
-
# TODO: add support for manually specifying 1 or more column widths
|
23
22
|
# TODO: maybe support for multiple data sets with group headers/footers. useful for subtotals, etc
|
24
23
|
|
25
24
|
x, y = current_point
|
@@ -85,6 +84,9 @@ module PDF
|
|
85
84
|
# TODO: when calculating the min cell width, we basically want the width of the widest character. At the
|
86
85
|
# moment I'm stripping all pango markup tags from the string, which means if any character is made
|
87
86
|
# intentioanlly large, we'll miss it and it might not fit into our table cell.
|
87
|
+
# TODO: allow column widths to be set manually
|
88
|
+
|
89
|
+
# calculate the min and max width of every cell in the table
|
88
90
|
t.cells.each_with_index do |row, row_idx|
|
89
91
|
row.each_with_index do |cell, col_idx|
|
90
92
|
opts = t.options_for(col_idx, row_idx).only(default_text_options.keys)
|
@@ -93,6 +95,8 @@ module PDF
|
|
93
95
|
cell.max_width = text_width(cell.data, opts) + (padding * 4)
|
94
96
|
end
|
95
97
|
end
|
98
|
+
|
99
|
+
# calculate the min and max width of every cell in the headers row
|
96
100
|
if t.headers
|
97
101
|
t.headers.each_with_index do |cell, col_idx|
|
98
102
|
opts = t.options_for(col_idx, :headers).only(default_text_options.keys)
|
@@ -101,7 +105,12 @@ module PDF
|
|
101
105
|
cell.max_width = text_width(cell.data, opts) + (padding * 4)
|
102
106
|
end
|
103
107
|
end
|
108
|
+
|
109
|
+
# let the table decide on the actual widths it will use for each col
|
104
110
|
t.calc_col_widths!
|
111
|
+
|
112
|
+
# now that we know how wide each column will be, we can calculate the
|
113
|
+
# height of every cell in the table
|
105
114
|
t.cells.each_with_index do |row, row_idx|
|
106
115
|
row.each_with_index do |cell, col_idx|
|
107
116
|
opts = t.options_for(col_idx, row_idx).only(default_text_options.keys)
|
@@ -109,7 +118,11 @@ module PDF
|
|
109
118
|
cell.height = text_height(cell.data, t.col_width(col_idx) - (padding * 2), opts) + (padding * 2)
|
110
119
|
end
|
111
120
|
end
|
121
|
+
|
122
|
+
# let the table calculate how high each row is going to be
|
112
123
|
t.calc_row_heights!
|
124
|
+
|
125
|
+
# perform the same height calcs for the header row if necesary
|
113
126
|
if t.headers
|
114
127
|
t.headers.each_with_index do |cell, col_idx|
|
115
128
|
opts = t.options_for(col_idx, :headers).only(default_text_options.keys)
|
@@ -147,7 +160,7 @@ module PDF
|
|
147
160
|
# with optional headings, then pass the object to Wrapper#table
|
148
161
|
#
|
149
162
|
# table = Table.new do |t|
|
150
|
-
# t.
|
163
|
+
# t.headers = ["Words", "Numbers"]
|
151
164
|
# t.data = [['one', 1],
|
152
165
|
# ['two', 2],
|
153
166
|
# ['three',3]]
|
@@ -167,16 +180,16 @@ module PDF
|
|
167
180
|
#
|
168
181
|
# For example:
|
169
182
|
#
|
170
|
-
# table = Table.new do |t|
|
183
|
+
# table = Table.new(:font_size => 10) do |t|
|
171
184
|
# t.headers = ["Words", "Numbers"]
|
172
185
|
# t.data = [['one', 1],
|
173
186
|
# ['two', 2],
|
174
187
|
# ['three',3]]
|
175
|
-
# t.table_options :font_size => 10
|
176
188
|
# t.row_options 0, :color => :green
|
177
189
|
# t.row_options 2, :color => :red
|
178
190
|
# t.col_options 0, :color => :blue
|
179
191
|
# t.cell_options 2, 2, :font_size => 18
|
192
|
+
# t.manual_column_width 2, 40
|
180
193
|
# end
|
181
194
|
# pdf.table(table)
|
182
195
|
#
|
@@ -188,19 +201,17 @@ module PDF
|
|
188
201
|
# top of the table, and :page for the default.
|
189
202
|
#
|
190
203
|
class Table
|
191
|
-
attr_reader :cells
|
204
|
+
attr_reader :cells#, :headers
|
192
205
|
attr_accessor :width, :show_headers
|
193
206
|
|
194
207
|
#
|
195
|
-
|
196
|
-
#
|
197
|
-
# ["first", "second"]
|
198
|
-
def initialize
|
208
|
+
def initialize(opts = {})
|
199
209
|
|
200
210
|
# default table options
|
201
|
-
@table_options =
|
211
|
+
@table_options = opts
|
202
212
|
@col_options = Hash.new({})
|
203
213
|
@row_options = Hash.new({})
|
214
|
+
@manual_col_widths = {}
|
204
215
|
@header_options = {}
|
205
216
|
@show_headers = :page
|
206
217
|
|
@@ -224,18 +235,40 @@ module PDF
|
|
224
235
|
end
|
225
236
|
end
|
226
237
|
|
227
|
-
#
|
238
|
+
# Retrieve or set the table's optional column headers.
|
228
239
|
#
|
229
|
-
#
|
240
|
+
# With no arguments, the currents headers will be returned
|
230
241
|
#
|
231
|
-
#
|
232
|
-
|
242
|
+
# t.headers
|
243
|
+
# => ["col one", "col two"]
|
244
|
+
#
|
245
|
+
# The first argument is an array of text to use as column headers
|
246
|
+
#
|
247
|
+
# t.headers ["col one", "col two]
|
248
|
+
#
|
249
|
+
# The optional second argument sets the cell options for the header
|
250
|
+
# cells. See PDF::Wrapper#cell for a list of possible options.
|
251
|
+
#
|
252
|
+
# t.headers ["col one", "col two], :color => :block, :fill_color => :black
|
253
|
+
#
|
254
|
+
# If the options hash is left unspecified, the default table options will
|
255
|
+
# be used.
|
256
|
+
#
|
257
|
+
def headers(h = nil, opts = {})
|
233
258
|
# TODO: raise an exception of the size of the array does not match the size
|
234
259
|
# of the data row arrays
|
235
260
|
# TODO: ensure h is array-like
|
261
|
+
return @headers if h.nil?
|
236
262
|
@headers = h.collect do |str|
|
237
263
|
Wrapper::Cell.new(str)
|
238
264
|
end
|
265
|
+
@header_options = opts
|
266
|
+
end
|
267
|
+
|
268
|
+
def headers=(h)
|
269
|
+
# TODO: remove this method at some point. Deprecation started on 10th August 2008.
|
270
|
+
warn "WARNING: Table#headers=() is deprecated, headers should now be set along with header options using Table#headers()"
|
271
|
+
headers h
|
239
272
|
end
|
240
273
|
|
241
274
|
# access a particular cell at location x, y
|
@@ -245,14 +278,24 @@ module PDF
|
|
245
278
|
|
246
279
|
# Set or retrieve options that apply to every cell in the table.
|
247
280
|
# For a list of valid options, see Wrapper#cell.
|
281
|
+
#
|
282
|
+
# WARNING. This method is deprecated. Table options should be passed to the
|
283
|
+
# PDF::Wrapper::Table constructor instead
|
248
284
|
def table_options(opts = nil)
|
285
|
+
# TODO: remove this method at some point. Deprecation started on 10th August 2008.
|
286
|
+
warn "WARNING: Table#table_options() is deprecated, please see the documentation for PDF::Wrapper::Table"
|
249
287
|
@table_options = @table_options.merge(opts) if opts
|
250
288
|
@table_options
|
251
289
|
end
|
252
290
|
|
253
291
|
# set or retrieve options that apply to header cells
|
254
292
|
# For a list of valid options, see Wrapper#cell.
|
293
|
+
#
|
294
|
+
# WARNING. This method is deprecated. Header options should be passed to the
|
295
|
+
# PDF::Wrapper::Table#headers method instead
|
255
296
|
def header_options(opts = nil)
|
297
|
+
# TODO: remove this method at some point. Deprecation started on 10th August 2008.
|
298
|
+
warn "WARNING: Table#header_options() is deprecated, please see the documentation for PDF::Wrapper::Table"
|
256
299
|
@header_options = @header_options.merge(opts) if opts
|
257
300
|
@header_options
|
258
301
|
end
|
@@ -282,6 +325,25 @@ module PDF
|
|
282
325
|
self
|
283
326
|
end
|
284
327
|
|
328
|
+
# Manually set the width for 1 or more columns
|
329
|
+
#
|
330
|
+
# <tt>spec</tt>:: Which columns to set the width for. :odd, :even, a range, an Array of numbers or a number
|
331
|
+
#
|
332
|
+
def manual_col_width(spec, width)
|
333
|
+
width = width.to_f
|
334
|
+
each_column do |col_idx|
|
335
|
+
if (spec == :even && (col_idx % 2) == 0) ||
|
336
|
+
(spec == :odd && (col_idx % 2) == 1) ||
|
337
|
+
(spec.class == Range && spec.include?(col_idx)) ||
|
338
|
+
(spec.class == Array && spec.include?(col_idx)) ||
|
339
|
+
(spec.respond_to?(:to_i) && spec.to_i == col_idx)
|
340
|
+
|
341
|
+
@manual_col_widths[col_idx] = width
|
342
|
+
end
|
343
|
+
end
|
344
|
+
self
|
345
|
+
end
|
346
|
+
|
285
347
|
# set options that apply to 1 or more rows
|
286
348
|
# For a list of valid options, see Wrapper#cell.
|
287
349
|
# <tt>spec</tt>:: Which columns to add the options to. :odd, :even, a range, an Array of numbers or a number
|
@@ -301,7 +363,7 @@ module PDF
|
|
301
363
|
|
302
364
|
# calculate the combined options for a particular cell
|
303
365
|
#
|
304
|
-
# To get the options for a regular cell, use numbers to
|
366
|
+
# To get the options for a regular cell, use numbers to reference the exact cell:
|
305
367
|
#
|
306
368
|
# options_for(3, 3)
|
307
369
|
#
|
@@ -374,7 +436,7 @@ module PDF
|
|
374
436
|
|
375
437
|
private
|
376
438
|
|
377
|
-
# the main smarts behind deciding on the width of each column. If possible,
|
439
|
+
# the main smarts behind deciding on the width of each column. If possible,
|
378
440
|
# each cell will get the maximum amount of space it wants. If not, some
|
379
441
|
# negotiation happens to find the best possible set of widths.
|
380
442
|
def calc_column_widths
|
@@ -395,6 +457,13 @@ module PDF
|
|
395
457
|
end
|
396
458
|
end
|
397
459
|
|
460
|
+
# override the min and max col widths with manual ones where appropriate
|
461
|
+
# freeze the values so that the algorithm that adjusts the widths
|
462
|
+
# leaves them untouched
|
463
|
+
@manual_col_widths.each { |key, val| val.freeze }
|
464
|
+
max_col_widths.merge! @manual_col_widths
|
465
|
+
min_col_widths.merge! @manual_col_widths
|
466
|
+
|
398
467
|
if min_col_widths.values.sum > self.width
|
399
468
|
raise RuntimeError, "table content cannot fit into a table width of #{self.width}"
|
400
469
|
end
|
@@ -414,18 +483,24 @@ module PDF
|
|
414
483
|
col_widths
|
415
484
|
end
|
416
485
|
|
417
|
-
#
|
486
|
+
# check to ensure every cell has a minimum and maximum cell width defined
|
418
487
|
def check_cell_widths
|
419
488
|
@cells.each do |row|
|
420
|
-
row.
|
489
|
+
row.each_with_index do |cell, col_idx|
|
421
490
|
raise "Every cell must have a min_width defined before being rendered to a document" if cell.min_width.nil?
|
422
491
|
raise "Every cell must have a max_width defined before being rendered to a document" if cell.max_width.nil?
|
492
|
+
if @manual_col_widths[col_idx] && cell.min_width > @manual_col_widths[col_idx]
|
493
|
+
raise "Manual width for col #{col_idx} is too low"
|
494
|
+
end
|
423
495
|
end
|
424
496
|
end
|
425
497
|
if @headers
|
426
|
-
@headers.
|
498
|
+
@headers.each_with_index do |cell, col_idx|
|
427
499
|
raise "Every header cell must have a min_width defined before being rendered to a document" if cell.min_width.nil?
|
428
500
|
raise "Every header cell must have a max_width defined before being rendered to a document" if cell.max_width.nil?
|
501
|
+
if @manual_col_widths[col_idx] && cell.min_width > @manual_col_widths[col_idx]
|
502
|
+
raise "Manual width for col #{col_idx} is too low"
|
503
|
+
end
|
429
504
|
end
|
430
505
|
end
|
431
506
|
end
|
@@ -457,9 +532,9 @@ module PDF
|
|
457
532
|
# if the widths of every column are less than the total width
|
458
533
|
# of the table, grow them to make use of it.
|
459
534
|
#
|
460
|
-
# col_widths - the
|
535
|
+
# col_widths - the current hash of widths for each column index
|
461
536
|
# max_col_widths - the maximum width each column desires
|
462
|
-
#
|
537
|
+
# past_max - can the width of a colum grow beyond its maximum desired
|
463
538
|
def grow_col_widths(col_widths, max_col_widths, past_max = false)
|
464
539
|
loop do
|
465
540
|
each_column do |idx|
|
data/lib/pdf/wrapper/text.rb
CHANGED
@@ -1,9 +1,36 @@
|
|
1
1
|
module PDF
|
2
2
|
class Wrapper
|
3
3
|
|
4
|
-
#
|
4
|
+
# Change the default font size
|
5
|
+
#
|
6
|
+
# If no block is provided, the change is permanent. If a block
|
7
|
+
# is provided, the change will revert at the end of the block
|
8
|
+
#
|
9
|
+
# Permanant change:
|
10
|
+
#
|
11
|
+
# pdf.font_size 10
|
12
|
+
#
|
13
|
+
# Temporary change:
|
14
|
+
#
|
15
|
+
# pdf.font_size 20
|
16
|
+
# pdf.text "This text is size 20"
|
17
|
+
# pdf.font_size(10) do
|
18
|
+
# pdf.text "This text is size 20"
|
19
|
+
# end
|
20
|
+
# pdf.text "This text is size 20"
|
21
|
+
#
|
5
22
|
def font_size(size)
|
6
|
-
|
23
|
+
new_size = size.to_i
|
24
|
+
raise ArgumentError, 'font size must be > 0' if new_size <= 0
|
25
|
+
|
26
|
+
if block_given?
|
27
|
+
orig_size = @default_font_size
|
28
|
+
@default_font_size = new_size
|
29
|
+
yield
|
30
|
+
@default_font_size = orig_size
|
31
|
+
else
|
32
|
+
@default_font_size = new_size
|
33
|
+
end
|
7
34
|
end
|
8
35
|
alias font_size= font_size
|
9
36
|
|
@@ -65,7 +92,7 @@ module PDF
|
|
65
92
|
color(options[:color]) if options[:color]
|
66
93
|
|
67
94
|
# draw the context on our cairo layout
|
68
|
-
render_layout(layout, options[:padding], options[:padding], texth
|
95
|
+
render_layout(layout, options[:padding], options[:padding], texth)
|
69
96
|
end
|
70
97
|
|
71
98
|
end
|
@@ -74,7 +101,7 @@ module PDF
|
|
74
101
|
# Write text to the page
|
75
102
|
#
|
76
103
|
# By default the text will be rendered using all the space within the margins and using
|
77
|
-
# the default font styling set by
|
104
|
+
# the default font styling set by font(), font_size, etc
|
78
105
|
#
|
79
106
|
# There is no way to place a bottom bound (or height) onto the text. Text will wrap as
|
80
107
|
# necessary and take all the room it needs. For finer grained control of text boxes, see the
|
@@ -110,7 +137,7 @@ module PDF
|
|
110
137
|
# The format is vaguely XML-like.
|
111
138
|
#
|
112
139
|
# Bold: "Some of this text is <b>bold</b>."
|
113
|
-
# Italics: "Some of this text is in <
|
140
|
+
# Italics: "Some of this text is in <i>italics</i>."
|
114
141
|
# Strikethrough: "My name is <s>Bob</s>James."
|
115
142
|
# Monospace Font: "Code:\n<tt>puts 1</tt>."
|
116
143
|
#
|
@@ -118,6 +145,7 @@ module PDF
|
|
118
145
|
#
|
119
146
|
# Big and Bold: Some of this text is <span weight="bold" font_desc="20">bold</span>.
|
120
147
|
# Stretched: Some of this text is <span stretch="extraexpanded">funny looking</span>.
|
148
|
+
#
|
121
149
|
def text(str, opts={})
|
122
150
|
# TODO: add converters from various markup languages to pango markup. (markdown, textile, etc)
|
123
151
|
# TODO: add a wrap option so wrapping can be disabled
|
@@ -141,7 +169,7 @@ module PDF
|
|
141
169
|
color(options[:color]) if options[:color]
|
142
170
|
|
143
171
|
# draw the context on our cairo layout
|
144
|
-
y = render_layout(layout, options[:left], options[:top]
|
172
|
+
y = render_layout(layout, options[:left], options[:top])
|
145
173
|
|
146
174
|
move_to(options[:left], y)
|
147
175
|
end
|
@@ -175,7 +203,7 @@ module PDF
|
|
175
203
|
private
|
176
204
|
|
177
205
|
# takes a string and a range of options and creates a pango layout for us. Pango
|
178
|
-
# does all the hard work of calculating text layout, wrapping, fonts, sizes,
|
206
|
+
# does all the hard work of calculating text layout, wrapping, fonts, sizes,
|
179
207
|
# direction and more. Thank $diety.
|
180
208
|
#
|
181
209
|
# The string should be encoded using utf-8. If you get unexpected characters in the
|
@@ -287,13 +315,18 @@ module PDF
|
|
287
315
|
# based on a function of the same name found in the text2.rb sample file
|
288
316
|
# distributed with rcairo - it's still black magic to me and has a few edge
|
289
317
|
# cases where it doesn't work too well. Needs to be improved.
|
290
|
-
|
318
|
+
#
|
319
|
+
# If h is specified, lines of text will be rendered up to that height, and
|
320
|
+
# the rest will be ignored.
|
321
|
+
#
|
322
|
+
# If h is nil, lines will be rendered until the bottom margin is hit, then
|
323
|
+
# a new page will be started and lines will continue being rendered at the
|
324
|
+
# top of the new page.
|
325
|
+
def render_layout(layout, x, y, h = nil)
|
291
326
|
# we can't use context.show_pango_layout, as that won't start
|
292
327
|
# a new page if the layout hits the bottom margin. Instead,
|
293
328
|
# we iterate over each line of text in the layout and add it to
|
294
329
|
# the canvas, page breaking as necessary
|
295
|
-
options = {:auto_new_page => true }
|
296
|
-
options.merge!(opts)
|
297
330
|
|
298
331
|
offset = 0
|
299
332
|
baseline = 0
|
@@ -308,17 +341,15 @@ module PDF
|
|
308
341
|
baseline = iter.baseline / Pango::SCALE
|
309
342
|
linex = logical_rect.x / Pango::SCALE
|
310
343
|
|
311
|
-
if baseline - offset >= h
|
312
|
-
#
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
break
|
321
|
-
end
|
344
|
+
if h && baseline - offset >= h
|
345
|
+
# the user doesn't want us to continue on the next page, so
|
346
|
+
# stop adding lines to the canvas
|
347
|
+
break
|
348
|
+
elsif h.nil? && (y + baseline - offset + spacing) >= self.absolute_bottom_margin
|
349
|
+
# create a new page and we can continue adding text
|
350
|
+
offset = baseline
|
351
|
+
start_new_page
|
352
|
+
y = self.y
|
322
353
|
end
|
323
354
|
|
324
355
|
# move to the start of this line
|
data/specs/graphics_spec.rb
CHANGED
@@ -3,14 +3,17 @@
|
|
3
3
|
require File.dirname(__FILE__) + '/spec_helper'
|
4
4
|
|
5
5
|
context "The PDF::Wrapper class" do
|
6
|
+
|
7
|
+
before(:each) { create_pdf }
|
8
|
+
|
6
9
|
specify "should be able to draw a single line onto the canvas" do
|
7
10
|
x0 = y0 = 100
|
8
11
|
x1 = y1 = 200
|
9
|
-
pdf
|
10
|
-
pdf.
|
12
|
+
@pdf.line(x0,y0,x1,y1)
|
13
|
+
@pdf.finish
|
11
14
|
|
12
15
|
receiver = PDF::Reader::RegisterReceiver.new
|
13
|
-
reader = PDF::Reader.string(
|
16
|
+
reader = PDF::Reader.string(@output.string, receiver)
|
14
17
|
|
15
18
|
# the begin_new_subpath command specifies the start of the line, append line specifies the end
|
16
19
|
receiver.count(:begin_new_subpath).should eql(1)
|
@@ -23,11 +26,11 @@ context "The PDF::Wrapper class" do
|
|
23
26
|
x0 = y0 = 100
|
24
27
|
x1 = y1 = 200
|
25
28
|
width = 5
|
26
|
-
pdf
|
27
|
-
pdf.
|
29
|
+
@pdf.line(x0,y0,x1,y1, :line_width => width)
|
30
|
+
@pdf.finish
|
28
31
|
|
29
32
|
receiver = PDF::Reader::RegisterReceiver.new
|
30
|
-
reader = PDF::Reader.string(
|
33
|
+
reader = PDF::Reader.string(@output.string, receiver)
|
31
34
|
|
32
35
|
# the begin_new_subpath command specifies the start of the line, append line specifies the end
|
33
36
|
receiver.count(:set_line_width).should eql(1)
|
@@ -43,11 +46,11 @@ context "The PDF::Wrapper class" do
|
|
43
46
|
specify "should be able to draw an empty rectangle onto the canvas" do
|
44
47
|
x = y = 100
|
45
48
|
w = h = 200
|
46
|
-
pdf
|
47
|
-
pdf.
|
49
|
+
@pdf.rectangle(x,y,w,h)
|
50
|
+
@pdf.finish
|
48
51
|
|
49
52
|
receiver = PDF::Reader::RegisterReceiver.new
|
50
|
-
reader = PDF::Reader.string(
|
53
|
+
reader = PDF::Reader.string(@output.string, receiver)
|
51
54
|
|
52
55
|
# the begin_new_subpath command specifies the start of the line, append line specifies the end
|
53
56
|
callbacks = receiver.all(:append_rectangle)
|
@@ -61,11 +64,11 @@ context "The PDF::Wrapper class" do
|
|
61
64
|
x = y = 100
|
62
65
|
w = h = 200
|
63
66
|
width = 5
|
64
|
-
pdf
|
65
|
-
pdf.
|
67
|
+
@pdf.rectangle(x,y,w,h, :line_width => width)
|
68
|
+
@pdf.finish
|
66
69
|
|
67
70
|
receiver = PDF::Reader::RegisterReceiver.new
|
68
|
-
reader = PDF::Reader.string(
|
71
|
+
reader = PDF::Reader.string(@output.string, receiver)
|
69
72
|
|
70
73
|
# ensure the line width was set correctly
|
71
74
|
receiver.count(:set_line_width).should eql(1)
|
@@ -85,10 +88,10 @@ context "The PDF::Wrapper class" do
|
|
85
88
|
x = y = 100
|
86
89
|
w = h = 200
|
87
90
|
pdf = PDF::Wrapper.new
|
88
|
-
pdf.rectangle(x,y,w,h, :fill_color => :red)
|
91
|
+
@pdf.rectangle(x,y,w,h, :fill_color => :red)
|
89
92
|
|
90
93
|
receiver = PDF::Reader::RegisterReceiver.new
|
91
|
-
reader = PDF::Reader.string(pdf.render, receiver)
|
94
|
+
reader = PDF::Reader.string(@pdf.render, receiver)
|
92
95
|
|
93
96
|
# TODO: test for the appropriate pattern of callbacks
|
94
97
|
end
|
@@ -101,10 +104,10 @@ context "The PDF::Wrapper class" do
|
|
101
104
|
w = h = 200
|
102
105
|
r = 5
|
103
106
|
pdf = PDF::Wrapper.new
|
104
|
-
pdf.rectangle(x,y,w,h,:radius => r)
|
107
|
+
@pdf.rectangle(x,y,w,h,:radius => r)
|
105
108
|
|
106
109
|
receiver = PDF::Reader::RegisterReceiver.new
|
107
|
-
reader = PDF::Reader.string(pdf.render, receiver)
|
110
|
+
reader = PDF::Reader.string(@pdf.render, receiver)
|
108
111
|
|
109
112
|
# TODO: test for the appropriate pattern of callbacks
|
110
113
|
end
|
@@ -118,10 +121,10 @@ context "The PDF::Wrapper class" do
|
|
118
121
|
r = 5
|
119
122
|
w = 5
|
120
123
|
pdf = PDF::Wrapper.new
|
121
|
-
pdf.rounded_rectangle(x,y,w,h, :radius => r, :line_width => w)
|
124
|
+
@pdf.rounded_rectangle(x,y,w,h, :radius => r, :line_width => w)
|
122
125
|
|
123
126
|
receiver = PDF::Reader::RegisterReceiver.new
|
124
|
-
reader = PDF::Reader.string(pdf.render, receiver)
|
127
|
+
reader = PDF::Reader.string(@pdf.render, receiver)
|
125
128
|
|
126
129
|
# TODO: test for the appropriate pattern of callbacks
|
127
130
|
end
|
@@ -134,10 +137,10 @@ context "The PDF::Wrapper class" do
|
|
134
137
|
w = h = 200
|
135
138
|
r = 5
|
136
139
|
pdf = PDF::Wrapper.new
|
137
|
-
pdf.rounded_rectangle(x,y,w,h, :radius => r, :fill_color => :red)
|
140
|
+
@pdf.rounded_rectangle(x,y,w,h, :radius => r, :fill_color => :red)
|
138
141
|
|
139
142
|
receiver = PDF::Reader::RegisterReceiver.new
|
140
|
-
reader = PDF::Reader.string(pdf.render, receiver)
|
143
|
+
reader = PDF::Reader.string(@pdf.render, receiver)
|
141
144
|
|
142
145
|
# TODO: test for the appropriate pattern of callbacks
|
143
146
|
end
|
@@ -150,10 +153,10 @@ context "The PDF::Wrapper class" do
|
|
150
153
|
y = 200
|
151
154
|
r = 5
|
152
155
|
pdf = PDF::Wrapper.new
|
153
|
-
pdf.circle(x,y,r)
|
156
|
+
@pdf.circle(x,y,r)
|
154
157
|
|
155
158
|
receiver = PDF::Reader::RegisterReceiver.new
|
156
|
-
reader = PDF::Reader.string(pdf.render, receiver)
|
159
|
+
reader = PDF::Reader.string(@pdf.render, receiver)
|
157
160
|
|
158
161
|
# TODO: test for the appropriate pattern of callbacks
|
159
162
|
end
|
@@ -167,10 +170,10 @@ context "The PDF::Wrapper class" do
|
|
167
170
|
r = 5
|
168
171
|
w = 5
|
169
172
|
pdf = PDF::Wrapper.new
|
170
|
-
pdf.circle(x,y,r, :line_width => w)
|
173
|
+
@pdf.circle(x,y,r, :line_width => w)
|
171
174
|
|
172
175
|
receiver = PDF::Reader::RegisterReceiver.new
|
173
|
-
reader = PDF::Reader.string(pdf.render, receiver)
|
176
|
+
reader = PDF::Reader.string(@pdf.render, receiver)
|
174
177
|
|
175
178
|
# TODO: test for the appropriate pattern of callbacks
|
176
179
|
end
|
@@ -183,10 +186,10 @@ context "The PDF::Wrapper class" do
|
|
183
186
|
y = 200
|
184
187
|
r = 5
|
185
188
|
pdf = PDF::Wrapper.new
|
186
|
-
pdf.circle(x,y,r, :fill_color => :red)
|
189
|
+
@pdf.circle(x,y,r, :fill_color => :red)
|
187
190
|
|
188
191
|
receiver = PDF::Reader::RegisterReceiver.new
|
189
|
-
reader = PDF::Reader.string(pdf.render, receiver)
|
192
|
+
reader = PDF::Reader.string(@pdf.render, receiver)
|
190
193
|
|
191
194
|
# TODO: test for the appropriate pattern of callbacks
|
192
195
|
end
|