pdf-wrapper 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,12 @@
1
+ v0.0.5 (27th April 2008)
2
+ - Fix crash when inserting multiple images
3
+ - added PDF::Wrapper#pad
4
+ - added PDF::Wrapper#text_width
5
+ - added support for customisable page margins (thanks to Paweł Kondzior)
6
+ - added support for cubic Bezier spline paths (thanks to Paweł Kondzior)
7
+ - added support for specifying the width of a cell border (thanks to Paweł Kondzior)
8
+ - fixed alignment of text (thanks to Paweł Kondzior)
9
+
1
10
  v0.0.4 (12th March 2008)
2
11
  - added support for custom line widths on primitive drawing shapes (circles,
3
12
  lines, etc). Thanks Paweł Kondzior
data/Rakefile CHANGED
@@ -6,7 +6,7 @@ require 'rake/testtask'
6
6
  require "rake/gempackagetask"
7
7
  require 'spec/rake/spectask'
8
8
 
9
- PKG_VERSION = "0.0.4"
9
+ PKG_VERSION = "0.0.5"
10
10
  PKG_NAME = "pdf-wrapper"
11
11
  PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
12
12
 
@@ -16,7 +16,8 @@ task :default => [ :spec ]
16
16
  # run all rspecs
17
17
  desc "Run all rspec files"
18
18
  Spec::Rake::SpecTask.new("spec") do |t|
19
- t.spec_files = FileList['specs/**/*.rb']
19
+ #t.spec_files = FileList['specs/**/*_spec.rb']
20
+ t.spec_files = ['specs/load_spec.rb','specs/image_spec.rb','specs/shapes_spec.rb','specs/text_spec.rb','specs/wrapper_spec.rb']
20
21
  t.rcov = true
21
22
  t.rcov_dir = (ENV['CC_BUILD_ARTIFACTS'] || 'doc') + "/rcov"
22
23
  t.rcov_opts = ["--exclude","spec.*\.rb","--exclude",".*cairo.*","--exclude",".*rcov.*","--exclude",".*rspec.*","--exclude",".*pdf-reader.*"]
data/TODO CHANGED
@@ -1 +1,2 @@
1
1
  All TODO's are currently marked inline in the source code
2
+
data/examples/utf8.rb CHANGED
@@ -8,5 +8,5 @@ require 'pdf/wrapper'
8
8
  pdf = PDF::Wrapper.new(:paper => :A4)
9
9
  pdf.default_font("Sans Serif")
10
10
  pdf.default_color(:black)
11
- pdf.text File.read(File.dirname(__FILE__) + "/../specs/data/utf8.txt"), :font => "Monospace", :font_size => 8
11
+ pdf.text File.read(File.dirname(__FILE__) + "/../specs/data/utf8.txt"), :font => "Monospace", :font_size => 8, :alignment => :center
12
12
  pdf.render_to_file("wrapper.pdf")
data/lib/pdf/wrapper.rb CHANGED
@@ -83,7 +83,15 @@ module PDF
83
83
  # <tt>:paper</tt>:: The paper size to use (default :A4)
84
84
  # <tt>:orientation</tt>:: :portrait (default) or :landscape
85
85
  # <tt>:background_color</tt>:: The background colour to use (default :white)
86
+ # <tt>:margin_top</tt>:: The size of the default top margin (default 5% of page)
87
+ # <tt>:margin_bottom</tt>:: The size of the default bottom margin (default 5% of page)
88
+ # <tt>:margin_left</tt>:: The size of the default left margin (default 5% of page)
89
+ # <tt>:margin_right</tt>:: The size of the default right margin (default 5% of page)
86
90
  def initialize(opts={})
91
+
92
+ # ensure we have recentish cairo bindings
93
+ raise "Ruby Cairo bindings version #{Cairo::BINDINGS_VERSION.join(".")} is too low. At least 1.5 is required" if Cairo::BINDINGS_VERSION.to_s < "150"
94
+
87
95
  options = {:paper => :A4,
88
96
  :orientation => :portrait,
89
97
  :background_color => :white
@@ -91,7 +99,8 @@ module PDF
91
99
  options.merge!(opts)
92
100
 
93
101
  # test for invalid options
94
- options.assert_valid_keys(:paper, :orientation, :background_color)
102
+ options.assert_valid_keys(:paper, :orientation, :background_color, :margin_left, :margin_right, :margin_top, :margin_bottom)
103
+ options[:paper] = options[:paper].to_sym
95
104
  raise ArgumentError, "Invalid paper option" unless PAGE_SIZES.include?(options[:paper])
96
105
 
97
106
  # set page dimensions
@@ -106,11 +115,10 @@ module PDF
106
115
  end
107
116
 
108
117
  # set page margins and dimensions of usable canvas
109
- # TODO: add options for customising the margins. ATM they're always 5% of the page dimensions
110
- @margin_left = (@page_width * 0.05).ceil
111
- @margin_right = (@page_width * 0.05).ceil
112
- @margin_top = (@page_height * 0.05).ceil
113
- @margin_bottom = (@page_height * 0.05).ceil
118
+ @margin_left = options[:margin_left] || (@page_width * 0.05).ceil
119
+ @margin_right = options[:margin_right] || (@page_width * 0.05).ceil
120
+ @margin_top = options[:margin_top] || (@page_height * 0.05).ceil
121
+ @margin_bottom = options[:margin_bottom] || (@page_height * 0.05).ceil
114
122
 
115
123
  # initialize some cairo objects to draw on
116
124
  @output = StringIO.new
@@ -265,7 +273,7 @@ module PDF
265
273
  # <tt>:border</tt>:: Which sides of the cell should have a border? A string with any combination the letters tblr (top, bottom, left, right). Nil for no border, defaults to all sides.
266
274
  # <tt>:border_width</tt>:: How wide should the border be?
267
275
  # <tt>:border_color</tt>:: What color should the border be?
268
- # <tt>:bgcolor</tt>:: A background color for the cell. Defaults to none.
276
+ # <tt>:fill_color</tt>:: A background color for the cell. Defaults to none.
269
277
  # <tt>:padding</tt>:: The number of points to leave between the inside of the border and text. Defaults to 3.
270
278
  def cell(str, x, y, w, h, opts={})
271
279
  # TODO: add support for pango markup (see http://ruby-gnome2.sourceforge.jp/hiki.cgi?pango-markup)
@@ -274,12 +282,12 @@ module PDF
274
282
  # TODO: add an option to draw a border with rounded corners
275
283
 
276
284
  options = default_text_options
277
- options.merge!({:border => "tblr", :border_width => 1, :border_color => :black, :bgcolor => nil, :padding => 3})
285
+ options.merge!({:border => "tblr", :border_width => @default_line_width, :border_color => :black, :fill_color => nil, :padding => 3})
278
286
  options.merge!(opts)
279
- options.assert_valid_keys(default_text_options.keys + [:width, :border, :border_width, :border_color, :bgcolor, :padding])
287
+ options.assert_valid_keys(default_text_options.keys + [:width, :border, :border_width, :border_color, :fill_color, :padding])
280
288
 
281
289
  # apply padding
282
- textw = x - (options[:padding] * 2)
290
+ textw = w - (options[:padding] * 2)
283
291
  texth = h - (options[:padding] * 2)
284
292
  textx = x + options[:padding]
285
293
  texty = y + options[:padding]
@@ -291,7 +299,7 @@ module PDF
291
299
  origx, origy = current_point
292
300
 
293
301
  # TODO: raise an exception if the box coords or dimensions will place it off the canvas
294
- rectangle(x,y,w,h, :color => options[:bgcolor], :fill_color => options[:bgcolor]) if options[:bgcolor]
302
+ rectangle(x,y,w,h, :color => options[:fill_color], :fill_color => options[:fill_color]) if options[:fill_color]
295
303
 
296
304
  layout = build_pango_layout(str.to_s, textw, options)
297
305
 
@@ -301,11 +309,10 @@ module PDF
301
309
  render_layout(layout, textx, texty, texth, :auto_new_page => false)
302
310
 
303
311
  # draw a border around the cell
304
- # TODO: obey options[:border_width]
305
- line(x,y,x+w,y, :color => options[:border_color]) if options[:border].include?("t")
306
- line(x,y+h,x+w,y+h, :color => options[:border_color]) if options[:border].include?("b")
307
- line(x,y,x,y+h, :color => options[:border_color]) if options[:border].include?("l")
308
- line(x+w,y,x+w,y+h, :color => options[:border_color]) if options[:border].include?("r")
312
+ line(x,y,x+w,y, :color => options[:border_color], :line_width => options[:border_width]) if options[:border].include?("t")
313
+ line(x,y+h,x+w,y+h, :color => options[:border_color], :line_width => options[:border_width]) if options[:border].include?("b")
314
+ line(x,y,x,y+h, :color => options[:border_color], :line_width => options[:border_width]) if options[:border].include?("l")
315
+ line(x+w,y,x+w,y+h, :color => options[:border_color], :line_width => options[:border_width]) if options[:border].include?("r")
309
316
 
310
317
  # restore the cursor position
311
318
  move_to(origx, origy)
@@ -421,6 +428,19 @@ module PDF
421
428
  return height / Pango::SCALE
422
429
  end
423
430
 
431
+ # Returns the amount of horizontal space needed to display the supplied text with the requested options
432
+ # opts is an options hash that specifies various attributes of the text. See the text function for more information.
433
+ # The text is assumed to not wrap.
434
+ def text_width(str, opts = {})
435
+ options = default_text_options.merge!(opts)
436
+ options.assert_valid_keys(default_text_options.keys)
437
+
438
+ layout = build_pango_layout(str.to_s, -1, options)
439
+ width, height = layout.size
440
+
441
+ return width / Pango::SCALE
442
+ end
443
+
424
444
  #####################################################
425
445
  # Functions relating to working with graphics
426
446
  #####################################################
@@ -484,6 +504,27 @@ module PDF
484
504
  move_to(origx, origy)
485
505
  end
486
506
 
507
+ # Adds a cubic Bezier spline to the path from the (x0, y0) to position (x3, y3)
508
+ # in user-space coordinates, using (x1, y1) and (x2, y2) as the control points.
509
+ # Options:
510
+ # <tt>:color</tt>:: The colour of the line
511
+ # <tt>:line_width</tt>:: The width of line. Defaults to 2.0
512
+ def curve(x0, y0, x1, y1, x2, y2, x3, y3, opts = {})
513
+ options = {:color => @default_color, :line_width => @default_line_width }
514
+ options.merge!(opts)
515
+ options.assert_valid_keys(:color, :line_width)
516
+ origx, origy = current_point
517
+
518
+ set_color(options[:color])
519
+ @context.set_line_width(options[:line_width])
520
+ move_to(x0,y0)
521
+ @context.curve_to(x1, y1, x2, y2, x3, y3).stroke
522
+
523
+ # restore the cursor position
524
+ move_to(origx, origy)
525
+ end
526
+
527
+
487
528
  # draw a rectangle starting at x,y with w,h dimensions.
488
529
  # Parameters:
489
530
  # <tt>:x</tt>:: The x co-ordinate of the top left of the rectangle.
@@ -630,6 +671,12 @@ module PDF
630
671
  # Misc Functions
631
672
  #####################################################
632
673
 
674
+ def pad(n)
675
+ x, y = current_point
676
+ move_to(x, y + n)
677
+ y + n
678
+ end
679
+
633
680
  # move the cursor to an arbitary position on the current page
634
681
  def move_to(x,y)
635
682
  raise ArgumentError, 'x cannot be larger than the width of the page' if x > page_width
@@ -715,7 +762,11 @@ module PDF
715
762
  # create a new Pango layout that our text will be added to
716
763
  layout = @context.create_pango_layout
717
764
  layout.text = str.to_s
718
- layout.width = w * Pango::SCALE
765
+ if w == -1
766
+ layout.width = -1
767
+ else
768
+ layout.width = w * Pango::SCALE
769
+ end
719
770
  layout.spacing = options[:spacing] * Pango::SCALE
720
771
 
721
772
  # set the alignment of the text in the layout
@@ -830,7 +881,7 @@ module PDF
830
881
  @context.scale(width / w, height / h)
831
882
  @context.render_poppler_page(page)
832
883
  end
833
- move_to(x, y + height)
884
+ move_to(opts[:left] || x, (opts[:top] || y) + height)
834
885
  end
835
886
 
836
887
  def draw_pixbuf(filename, opts = {})
@@ -845,7 +896,7 @@ module PDF
845
896
  @context.set_source_pixbuf(pixbuf, 0, 0)
846
897
  @context.paint
847
898
  end
848
- move_to(x, y + height)
899
+ move_to(opts[:left] || x, (opts[:top] || y) + height)
849
900
  end
850
901
 
851
902
  def draw_png(filename, opts = {})
@@ -859,7 +910,7 @@ module PDF
859
910
  @context.set_source(img_surface, 0, 0)
860
911
  @context.paint
861
912
  end
862
- move_to(x, y + height)
913
+ move_to(opts[:left] || x, (opts[:top] || y) + height)
863
914
  end
864
915
 
865
916
  def draw_svg(filename, opts = {})
@@ -874,7 +925,7 @@ module PDF
874
925
  @context.render_rsvg_handle(handle)
875
926
  #@context.paint
876
927
  end
877
- move_to(x, y + height)
928
+ move_to(opts[:left] || x, (opts[:top] || y) + height)
878
929
  end
879
930
 
880
931
  # adds a single table row to the canvas. Top left of the row will be at the current x,y
@@ -990,11 +1041,35 @@ module PDF
990
1041
  # adding text at the same co-ords
991
1042
  orig_x = x
992
1043
  orig_y = y
993
-
994
1044
  # for each line in the layout
995
- layout.lines.each do |line|
996
- #calculate where the next line starts
997
- ink_rect, logical_rect = line.extents
1045
+ # layout.alignment = Pango::Layout::ALIGN_RIGHT
1046
+ # layout.lines.each do |line|
1047
+ # #calculate where the next line starts
1048
+ # ink_rect, logical_rect = line.extents
1049
+ # y = y + (logical_rect.height / Pango::SCALE * (3.0/4.0)) + 1
1050
+ # if y >= (orig_y + h)
1051
+ # # our text is using the maximum amount of vertical space we want it to
1052
+ # if options[:auto_new_page]
1053
+ # # create a new page and we can continue adding text
1054
+ # start_new_page
1055
+ # x = orig_x
1056
+ # y = orig_y
1057
+ # else
1058
+ # # the user doesn't want us to continue on the next page, so
1059
+ # # stop adding lines to the canvas
1060
+ # break
1061
+ # end
1062
+ # end
1063
+ #
1064
+ # # move to the start of the next line
1065
+ # move_to(x, y)
1066
+ # # draw the line on the canvas
1067
+ # @context.show_pango_layout_line(line)
1068
+ # end
1069
+ iter = layout.iter
1070
+ loop do
1071
+ line = iter.line
1072
+ ink_rect, logical_rect = iter.line_extents
998
1073
  y = y + (logical_rect.height / Pango::SCALE * (3.0/4.0)) + 1
999
1074
  if y >= (orig_y + h)
1000
1075
  # our text is using the maximum amount of vertical space we want it to
@@ -1011,10 +1086,15 @@ module PDF
1011
1086
  end
1012
1087
 
1013
1088
  # move to the start of the next line
1014
- move_to(x, y)
1089
+ #move_to(x, y)
1090
+ baseline = iter.baseline / Pango::SCALE
1091
+ @context.move_to(x + logical_rect.x / Pango::SCALE, y + baseline)
1092
+
1015
1093
  # draw the line on the canvas
1016
1094
  @context.show_pango_layout_line(line)
1017
- end
1095
+
1096
+ break unless iter.next_line!
1097
+ end
1018
1098
 
1019
1099
  # return the y co-ord we finished on
1020
1100
  return y
@@ -0,0 +1,22 @@
1
+ # coding: utf-8
2
+
3
+ require File.dirname(__FILE__) + '/spec_helper'
4
+
5
+ context "The PDF::Wrapper class" do
6
+ specify "should be able to detect the filetype of an image" do
7
+ pdf = PDF::Wrapper.new
8
+ pdf.detect_image_type(File.dirname(__FILE__) + "/data/google.png").should eql(:png)
9
+ pdf.detect_image_type(File.dirname(__FILE__) + "/data/zits.gif").should eql(:gif)
10
+ pdf.detect_image_type(File.dirname(__FILE__) + "/data/orc.svg").should eql(:svg)
11
+ pdf.detect_image_type(File.dirname(__FILE__) + "/data/utf8-long.pdf").should eql(:pdf)
12
+ pdf.detect_image_type(File.dirname(__FILE__) + "/data/shipsail.jpg").should eql(:jpg)
13
+ end
14
+
15
+ specify "should be able to calculate image dimensions correctly" do
16
+ pdf = PDF::Wrapper.new
17
+ pdf.calc_image_dimensions(100, 100, 200, 200).should eql([100.0,100.0])
18
+ pdf.calc_image_dimensions(nil, nil, 200, 200).should eql([200.0,200.0])
19
+ pdf.calc_image_dimensions(150, 200, 200, 200, true).should eql([150.0,150.0])
20
+ pdf.calc_image_dimensions(300, 250, 200, 200, true).should eql([250.0,250.0])
21
+ end
22
+ end
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+
3
+ require File.dirname(__FILE__) + '/spec_helper'
4
+
5
+ context "The PDF::Wrapper class" do
6
+ specify "should load external libs correctly" do
7
+ pdf = PDF::Wrapper.new
8
+
9
+ # lib gdkpixbuf
10
+ ::Object.const_defined?(:Gdk).should eql(false)
11
+ pdf.load_libpixbuf
12
+ ::Object.const_defined?(:Gdk).should eql(true)
13
+ ::Gdk.const_defined?(:Pixbuf).should eql(true)
14
+
15
+ # pango
16
+ ::Object.const_defined?(:Pango).should eql(false)
17
+ pdf.load_libpango
18
+ ::Object.const_defined?(:Pango).should eql(true)
19
+
20
+ # libpoppler
21
+ ::Object.const_defined?(:Poppler).should eql(false)
22
+ pdf.load_libpoppler
23
+ ::Object.const_defined?(:Poppler).should eql(true)
24
+
25
+ # librsvg
26
+ ::Object.const_defined?(:RSVG).should eql(false)
27
+ pdf.load_librsvg
28
+ ::Object.const_defined?(:RSVG).should eql(true)
29
+
30
+ end
31
+ end
@@ -0,0 +1,194 @@
1
+ # coding: utf-8
2
+
3
+ require File.dirname(__FILE__) + '/spec_helper'
4
+
5
+ context "The PDF::Wrapper class" do
6
+ specify "should be able to draw a single line onto the canvas" do
7
+ x0 = y0 = 100
8
+ x1 = y1 = 200
9
+ pdf = PDF::Wrapper.new
10
+ pdf.line(x0,y0,x1,y1)
11
+
12
+ receiver = PDF::Reader::RegisterReceiver.new
13
+ reader = PDF::Reader.string(pdf.render, receiver)
14
+
15
+ # the begin_new_subpath command specifies the start of the line, append line specifies the end
16
+ receiver.count(:begin_new_subpath).should eql(1)
17
+ receiver.count(:append_line).should eql(1)
18
+ receiver.first_occurance_of(:begin_new_subpath)[:args].should eql([x0.to_f, 741.89])
19
+ receiver.first_occurance_of(:append_line)[:args].should eql([x1.to_f, 641.89])
20
+ end
21
+
22
+ specify "should be able to draw a single line onto the canvas with a width of 5" do
23
+ x0 = y0 = 100
24
+ x1 = y1 = 200
25
+ width = 5
26
+ pdf = PDF::Wrapper.new
27
+ pdf.line(x0,y0,x1,y1, :line_width => width)
28
+
29
+ receiver = PDF::Reader::RegisterReceiver.new
30
+ reader = PDF::Reader.string(pdf.render, receiver)
31
+
32
+ # the begin_new_subpath command specifies the start of the line, append line specifies the end
33
+ receiver.count(:set_line_width).should eql(1)
34
+ receiver.count(:begin_new_subpath).should eql(1)
35
+ receiver.count(:append_line).should eql(1)
36
+ receiver.first_occurance_of(:set_line_width)[:args].should eql([width.to_f])
37
+ receiver.first_occurance_of(:begin_new_subpath)[:args].should eql([x0.to_f, 741.89])
38
+ receiver.first_occurance_of(:append_line)[:args].should eql([x1.to_f, 641.89])
39
+ end
40
+
41
+ specify "should be able to draw a cubic bezier spline onto the canvas"
42
+
43
+ specify "should be able to draw an empty rectangle onto the canvas" do
44
+ x = y = 100
45
+ w = h = 200
46
+ pdf = PDF::Wrapper.new
47
+ pdf.rectangle(x,y,w,h)
48
+
49
+ receiver = PDF::Reader::RegisterReceiver.new
50
+ reader = PDF::Reader.string(pdf.render, receiver)
51
+
52
+ # the begin_new_subpath command specifies the start of the line, append line specifies the end
53
+ callbacks = receiver.all(:append_rectangle)
54
+ callbacks.size.should eql(2)
55
+ # don't care about the first rectangel, it just goes around the outside of the page
56
+ callbacks.shift
57
+ callbacks.shift[:args].should eql([100.0, 741.89, 200.0, -200.0])
58
+ end
59
+
60
+ specify "should be able to draw an empty rectangle onto the canvas with a line width of 5" do
61
+ x = y = 100
62
+ w = h = 200
63
+ width = 5
64
+ pdf = PDF::Wrapper.new
65
+ pdf.rectangle(x,y,w,h, :line_width => width)
66
+
67
+ receiver = PDF::Reader::RegisterReceiver.new
68
+ reader = PDF::Reader.string(pdf.render, receiver)
69
+
70
+ # ensure the line width was set correctly
71
+ receiver.count(:set_line_width).should eql(1)
72
+ receiver.first_occurance_of(:set_line_width)[:args].should eql([width.to_f])
73
+
74
+ # the begin_new_subpath command specifies the start of the line, append line specifies the end
75
+ callbacks = receiver.all(:append_rectangle)
76
+ callbacks.size.should eql(2)
77
+ # don't care about the first rectangel, it just goes around the outside of the page
78
+ callbacks.shift
79
+ callbacks.shift[:args].should eql([100.0, 741.89, 200.0, -200.0])
80
+ end
81
+
82
+ specify "should be able to draw a filled rectangle onto the canvas"
83
+ =begin
84
+ do
85
+ x = y = 100
86
+ w = h = 200
87
+ pdf = PDF::Wrapper.new
88
+ pdf.rectangle(x,y,w,h, :fill_color => :red)
89
+
90
+ receiver = PDF::Reader::RegisterReceiver.new
91
+ reader = PDF::Reader.string(pdf.render, receiver)
92
+
93
+ # TODO: test for the appropriate pattern of callbacks
94
+ end
95
+ =end
96
+
97
+ specify "should be able to draw an empty rounded rectangle onto the canvas"
98
+ =begin
99
+ do
100
+ x = y = 100
101
+ w = h = 200
102
+ r = 5
103
+ pdf = PDF::Wrapper.new
104
+ pdf.rounded_rectangle(x,y,w,h,r)
105
+
106
+ receiver = PDF::Reader::RegisterReceiver.new
107
+ reader = PDF::Reader.string(pdf.render, receiver)
108
+
109
+ # TODO: test for the appropriate pattern of callbacks
110
+ end
111
+ =end
112
+
113
+ specify "should be able to draw an empty rounded rectangle onto the canvas with a line width of 5"
114
+ =begin
115
+ do
116
+ x = y = 100
117
+ w = h = 200
118
+ r = 5
119
+ w = 5
120
+ pdf = PDF::Wrapper.new
121
+ pdf.rounded_rectangle(x,y,w,h,r, :line_width => w)
122
+
123
+ receiver = PDF::Reader::RegisterReceiver.new
124
+ reader = PDF::Reader.string(pdf.render, receiver)
125
+
126
+ # TODO: test for the appropriate pattern of callbacks
127
+ end
128
+ =end
129
+
130
+ specify "should be able to draw a filled rounded rectangle onto the canvas"
131
+ =begin
132
+ do
133
+ x = y = 100
134
+ w = h = 200
135
+ r = 5
136
+ pdf = PDF::Wrapper.new
137
+ pdf.rounded_rectangle(x,y,w,h,r, :fill_color => :red)
138
+
139
+ receiver = PDF::Reader::RegisterReceiver.new
140
+ reader = PDF::Reader.string(pdf.render, receiver)
141
+
142
+ # TODO: test for the appropriate pattern of callbacks
143
+ end
144
+ =end
145
+
146
+ specify "should be able to draw an empty circle onto the canvas"
147
+ =begin
148
+ do
149
+ x = 100
150
+ y = 200
151
+ r = 5
152
+ pdf = PDF::Wrapper.new
153
+ pdf.circle(x,y,r)
154
+
155
+ receiver = PDF::Reader::RegisterReceiver.new
156
+ reader = PDF::Reader.string(pdf.render, receiver)
157
+
158
+ # TODO: test for the appropriate pattern of callbacks
159
+ end
160
+ =end
161
+
162
+ specify "should be able to draw an empty circle onto the canvas with a line width of 5"
163
+ =begin
164
+ do
165
+ x = 100
166
+ y = 200
167
+ r = 5
168
+ w = 5
169
+ pdf = PDF::Wrapper.new
170
+ pdf.circle(x,y,r, :line_width => w)
171
+
172
+ receiver = PDF::Reader::RegisterReceiver.new
173
+ reader = PDF::Reader.string(pdf.render, receiver)
174
+
175
+ # TODO: test for the appropriate pattern of callbacks
176
+ end
177
+ =end
178
+
179
+ specify "should be able to draw a filled circle onto the canvas"
180
+ =begin
181
+ do
182
+ x = 100
183
+ y = 200
184
+ r = 5
185
+ pdf = PDF::Wrapper.new
186
+ pdf.circle(x,y,r, :fill_color => :red)
187
+
188
+ receiver = PDF::Reader::RegisterReceiver.new
189
+ reader = PDF::Reader.string(pdf.render, receiver)
190
+
191
+ # TODO: test for the appropriate pattern of callbacks
192
+ end
193
+ =end
194
+ end
@@ -0,0 +1,70 @@
1
+ # coding: utf-8
2
+
3
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../lib')
4
+
5
+ require 'pdf/wrapper'
6
+ require 'tempfile'
7
+ require 'rubygems'
8
+
9
+ gem "pdf-reader", ">=0.6.1"
10
+
11
+ require 'pdf/reader'
12
+
13
+ # make some private methods of PDF::Wrapper public for testing
14
+ class PDF::Wrapper
15
+ public :build_pango_layout
16
+ public :calc_image_dimensions
17
+ public :load_librsvg
18
+ public :load_libpixbuf
19
+ public :load_libpango
20
+ public :load_libpoppler
21
+ public :default_text_options
22
+ public :detect_image_type
23
+ public :draw_pdf
24
+ public :draw_pixbuf
25
+ public :draw_png
26
+ public :draw_svg
27
+ public :validate_color
28
+ end
29
+
30
+ # a helper class for couting the number of pages in a PDF
31
+ class PageReceiver
32
+ attr_accessor :page_count
33
+
34
+ def initialize
35
+ @page_count = 0
36
+ end
37
+
38
+ # Called when page parsing ends
39
+ def end_page
40
+ @page_count += 1
41
+ end
42
+ end
43
+
44
+ class PageTextReceiver
45
+ attr_accessor :content
46
+
47
+ def initialize
48
+ @content = []
49
+ end
50
+
51
+ # Called when page parsing starts
52
+ def begin_page(arg = nil)
53
+ @content << ""
54
+ end
55
+
56
+ def show_text(string, *params)
57
+ @content.last << string.strip
58
+ end
59
+
60
+ # there's a few text callbacks, so make sure we process them all
61
+ alias :super_show_text :show_text
62
+ alias :move_to_next_line_and_show_text :show_text
63
+ alias :set_spacing_next_line_show_text :show_text
64
+
65
+ def show_text_with_positioning(*params)
66
+ params = params.first
67
+ params.each { |str| show_text(str) if str.kind_of?(String) }
68
+ end
69
+
70
+ end
@@ -0,0 +1,153 @@
1
+ # coding: utf-8
2
+
3
+ require File.dirname(__FILE__) + '/spec_helper'
4
+
5
+ context "The PDF::Wrapper class" do
6
+ specify "should be able to add ascii text to the canvas" do
7
+ msg = "Chunky Bacon"
8
+ pdf = PDF::Wrapper.new
9
+ pdf.text msg
10
+
11
+ receiver = PageTextReceiver.new
12
+ reader = PDF::Reader.string(pdf.render, receiver)
13
+
14
+ # TODO: test for the text is in the appropriate location on the page
15
+ receiver.content.first.should eql(msg)
16
+ end
17
+
18
+ specify "should be able to add unicode text to the canvas" do
19
+ msg = "メインページ"
20
+ pdf = PDF::Wrapper.new
21
+ pdf.text msg
22
+
23
+ receiver = PageTextReceiver.new
24
+ reader = PDF::Reader.string(pdf.render, receiver)
25
+
26
+ # TODO: test for the text is in the appropriate location on the page
27
+ receiver.content.first.should eql(msg)
28
+ end
29
+
30
+ specify "should be align text on the left when using the text method" do
31
+ msg = "Chunky Bacon"
32
+ pdf = PDF::Wrapper.new
33
+ pdf.text msg, :alignment => :left
34
+
35
+ receiver = PDF::Reader::RegisterReceiver.new
36
+ reader = PDF::Reader.string(pdf.render, receiver)
37
+
38
+ # set_text_matrix_and_text_line_matrix - [10.666992, 0.0, 0.0, 10.666992, 265.0, 788.89]
39
+
40
+ # ensure the text is placed in the right location
41
+ params = receiver.first_occurance_of(:set_text_matrix_and_text_line_matrix)[:args]
42
+ params[4].should eql(pdf.margin_left.to_f)
43
+ end
44
+
45
+ specify "should be align text in the centre when using the text method" do
46
+ msg = "Chunky Bacon"
47
+ pdf = PDF::Wrapper.new
48
+ pdf.text msg, :alignment => :center
49
+
50
+ receiver = PDF::Reader::RegisterReceiver.new
51
+ reader = PDF::Reader.string(pdf.render, receiver)
52
+
53
+ # ensure the text is placed in the right location - the left
54
+ # egde should be less than half way across the page, but not on the left margin
55
+ params = receiver.first_occurance_of(:set_text_matrix_and_text_line_matrix)[:args]
56
+ (params[4] < pdf.absolute_x_middle).should be_true
57
+ (params[4] > pdf.absolute_x_middle - 100).should be_true
58
+ end
59
+
60
+ specify "should be align text on the right when using the text method" do
61
+ msg = "Chunky Bacon"
62
+ pdf = PDF::Wrapper.new
63
+ pdf.text msg, :alignment => :right
64
+
65
+ receiver = PDF::Reader::RegisterReceiver.new
66
+ reader = PDF::Reader.string(pdf.render, receiver)
67
+
68
+ # ensure the text is placed in the right location - the left
69
+ # egde should be more than half way across the page, but not on the right margin
70
+ params = receiver.first_occurance_of(:set_text_matrix_and_text_line_matrix)[:args]
71
+ (params[4] > pdf.absolute_x_middle).should be_true
72
+ (params[4] < pdf.absolute_right_margin).should be_true
73
+ end
74
+
75
+ specify "should be able to add text to the canvas in a bounding box using the cell method" do
76
+ msg = "メインページ"
77
+ pdf = PDF::Wrapper.new
78
+ pdf.cell msg, 100, 100, 200, 200
79
+
80
+ receiver = PageTextReceiver.new
81
+ reader = PDF::Reader.string(pdf.render, receiver)
82
+
83
+ # TODO: test for the text is in the appropriate location on the page
84
+ receiver.content.first.should eql(msg)
85
+ end
86
+
87
+ specify "should keep all text for a cell inside the cell boundaries" do
88
+ msg = "This is a text cell, added by James"
89
+ pdf = PDF::Wrapper.new
90
+ x = y = 100
91
+ w = h = 200
92
+ pdf.cell msg, x, y, w, h
93
+
94
+ receiver = PDF::Reader::RegisterReceiver.new
95
+ reader = PDF::Reader.string(pdf.render, receiver)
96
+
97
+ receiver.all(:set_text_matrix_and_text_line_matrix).each do |cb|
98
+ # horizontal location
99
+ # TODO: we're only testing the it doesn't start past the right boundary of the cell
100
+ # should also test that it doesn't start in the cell but overrun it
101
+ (cb[:args][4] >= x).should be_true
102
+ (cb[:args][4] <= x + w).should be_true
103
+
104
+ # vertical location
105
+ # TODO: we're only testing the it doesn't start past the bottom boundary of the cell
106
+ # should also test that it doesn't start in the cell but overrun it
107
+ cell_top_bound = pdf.page_height - y
108
+ (cb[:args][5] <= cell_top_bound).should be_true
109
+ (cb[:args][5] >= cell_top_bound - h).should be_true
110
+ end
111
+ end
112
+
113
+ specify "should be able to calculate the height of a string of text" do
114
+ str = "This is a medium length string\nthat is also multi line. one two three four."
115
+ pdf = PDF::Wrapper.new
116
+ opts = {:font_size => 16, :font => "Sans Serif", :alignment => :left, :justify => false }
117
+ pdf.text_height(str, pdf.body_width, opts).should eql(49)
118
+ end
119
+
120
+ specify "should be able to calculate the width of a string of text" do
121
+ str = "James Healy"
122
+ str2 = "James Healy is a Ruby dev that lives in Melbourne, Australia. His day job mostly involved Ruby on Rails."
123
+ pdf = PDF::Wrapper.new
124
+ opts = {:font_size => 16, :font => "Sans Serif"}
125
+ pdf.text(str, opts)
126
+ pdf.text_width(str, opts).should eql(131)
127
+ pdf.text_width(str2, opts).should eql(1107)
128
+ end
129
+
130
+ specify "should raise an exception if build_pango_layout is passed anything other than a string" do
131
+ pdf = PDF::Wrapper.new
132
+ lambda { pdf.build_pango_layout(10) }.should raise_error(ArgumentError)
133
+ end
134
+
135
+ if RUBY_VERSION >= "1.9"
136
+ specify "should accept non UTF-8 strings to build_pango_layout and convert them on the fly" do
137
+ pdf = PDF::Wrapper.new
138
+
139
+ # all three of these files have the same content, but in different encodings
140
+ iso2022_str = File.open(File.dirname(__FILE__) + "/data/shift_jis.txt", "r:ISO-2022-JP") { |f| f.read }.strip!
141
+ shiftjis_str = File.open(File.dirname(__FILE__) + "/data/iso-2022-jp.txt", "r:Shift_JIS") { |f| f.read }.strip!
142
+ utf8_str = File.open(File.dirname(__FILE__) + "/data/utf8.txt", "r:UTF-8") { |f| f.read }.strip!
143
+
144
+ pdf.build_pango_layout(shiftjis_str)
145
+ pdf.build_pango_layout(iso2022_str)
146
+
147
+ # TODO: improve this spec using mocks. Atm, I'm assume that if build_pango_layout didn't raise an exception when
148
+ # passed in the non UTF-8 strings, then all worked fine. yuck.
149
+ end
150
+
151
+ specify "should raise an error when a string that isn't convertable to UTF-8 is passed into build_pango_layout()"
152
+ end
153
+ end
@@ -1,108 +1,9 @@
1
1
  # coding: utf-8
2
2
 
3
- $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../lib')
4
-
5
- require 'pdf/wrapper'
6
- require 'tempfile'
7
- require 'rubygems'
8
-
9
- gem "pdf-reader", ">=0.6.1"
10
-
11
- require 'pdf/reader'
12
-
13
- # make some private methods of PDF::Wrapper public for testing
14
- class PDF::Wrapper
15
- public :build_pango_layout
16
- public :calc_image_dimensions
17
- public :load_librsvg
18
- public :load_libpixbuf
19
- public :load_libpango
20
- public :load_libpoppler
21
- public :default_text_options
22
- public :detect_image_type
23
- public :draw_pdf
24
- public :draw_pixbuf
25
- public :draw_png
26
- public :draw_svg
27
- public :validate_color
28
- end
29
-
30
- # a helper class for couting the number of pages in a PDF
31
- class PageReceiver
32
- attr_accessor :page_count
33
-
34
- def initialize
35
- @page_count = 0
36
- end
37
-
38
- # Called when page parsing ends
39
- def end_page
40
- @page_count += 1
41
- end
42
- end
43
-
44
- class PageTextReceiver
45
- attr_accessor :content
46
-
47
- def initialize
48
- @content = []
49
- end
50
-
51
- # Called when page parsing starts
52
- def begin_page(arg = nil)
53
- @content << ""
54
- end
55
-
56
- def show_text(string, *params)
57
- @content.last << string.strip
58
- end
59
-
60
- # there's a few text callbacks, so make sure we process them all
61
- alias :super_show_text :show_text
62
- alias :move_to_next_line_and_show_text :show_text
63
- alias :set_spacing_next_line_show_text :show_text
64
-
65
- def show_text_with_positioning(*params)
66
- params = params.first
67
- params.each { |str| show_text(str) if str.kind_of?(String) }
68
- end
69
-
70
- end
3
+ require File.dirname(__FILE__) + '/spec_helper'
71
4
 
72
5
  context "The PDF::Wrapper class" do
73
6
 
74
- setup do
75
- #@file = File.new(File.dirname(__FILE__) + "/data/cairo-basic.pdf")
76
- @shortstr = "Chunky Bacon"
77
- @medstr = "This is a medium length string\nthat is also multi line. one two three four."
78
- end
79
-
80
- specify "should load external libs correctly" do
81
- pdf = PDF::Wrapper.new
82
-
83
- # lib gdkpixbuf
84
- ::Object.const_defined?(:Gdk).should eql(false)
85
- pdf.load_libpixbuf
86
- ::Object.const_defined?(:Gdk).should eql(true)
87
- ::Gdk.const_defined?(:Pixbuf).should eql(true)
88
-
89
- # pango
90
- ::Object.const_defined?(:Pango).should eql(false)
91
- pdf.load_libpango
92
- ::Object.const_defined?(:Pango).should eql(true)
93
-
94
- # libpoppler
95
- ::Object.const_defined?(:Poppler).should eql(false)
96
- pdf.load_libpoppler
97
- ::Object.const_defined?(:Poppler).should eql(true)
98
-
99
- # librsvg
100
- ::Object.const_defined?(:RSVG).should eql(false)
101
- pdf.load_librsvg
102
- ::Object.const_defined?(:RSVG).should eql(true)
103
-
104
- end
105
-
106
7
  specify "should initilize with the correct default paper size and orientation" do
107
8
  pdf = PDF::Wrapper.new
108
9
  pdf.page_width.should eql(PDF::Wrapper::PAGE_SIZES[:A4].first)
@@ -211,6 +112,16 @@ context "The PDF::Wrapper class" do
211
112
  lambda {pdf.move_to(100, PDF::Wrapper::PAGE_SIZES[:A4].last + 10)}.should raise_error(ArgumentError)
212
113
  end
213
114
 
115
+ specify "should be able to shift the y position of the cursor using pad" do
116
+ pdf = PDF::Wrapper.new
117
+ pdf.move_to(100,100)
118
+ newy = pdf.pad(25)
119
+ x,y = pdf.current_point
120
+ x.to_i.should eql(100)
121
+ y.to_i.should eql(125)
122
+ newy.should eql(125.0)
123
+ end
124
+
214
125
  specify "should add additional pages at the users request" do
215
126
  pdf = PDF::Wrapper.new
216
127
  pdf.move_to(100,100)
@@ -225,79 +136,6 @@ context "The PDF::Wrapper class" do
225
136
  receiver.page_count.should eql(2)
226
137
  end
227
138
 
228
- specify "should be able to draw a single line onto the canvas" do
229
- x0 = y0 = 100
230
- x1 = y1 = 200
231
- pdf = PDF::Wrapper.new
232
- pdf.line(x0,y0,x1,y1)
233
-
234
- receiver = PDF::Reader::RegisterReceiver.new
235
- reader = PDF::Reader.string(pdf.render, receiver)
236
-
237
- # the begin_new_subpath command specifies the start of the line, append line specifies the end
238
- receiver.count(:begin_new_subpath).should eql(1)
239
- receiver.count(:append_line).should eql(1)
240
- receiver.first_occurance_of(:begin_new_subpath)[:args].should eql([x0.to_f, y0.to_f])
241
- receiver.first_occurance_of(:append_line)[:args].should eql([x1.to_f, y1.to_f])
242
- end
243
-
244
- specify "should be able to draw a single line onto the canvas with a width of 5" do
245
- x0 = y0 = 100
246
- x1 = y1 = 200
247
- width = 5
248
- pdf = PDF::Wrapper.new
249
- pdf.line(x0,y0,x1,y1, :line_width => width)
250
-
251
- receiver = PDF::Reader::RegisterReceiver.new
252
- reader = PDF::Reader.string(pdf.render, receiver)
253
-
254
- # the begin_new_subpath command specifies the start of the line, append line specifies the end
255
- receiver.count(:set_line_width).should eql(1)
256
- receiver.count(:begin_new_subpath).should eql(1)
257
- receiver.count(:append_line).should eql(1)
258
- receiver.first_occurance_of(:set_line_width)[:args].should eql([width.to_f])
259
- receiver.first_occurance_of(:begin_new_subpath)[:args].should eql([x0.to_f, y0.to_f])
260
- receiver.first_occurance_of(:append_line)[:args].should eql([x1.to_f, y1.to_f])
261
- end
262
-
263
- specify "should be able to draw an empty rectangle onto the canvas" do
264
- x = y = 100
265
- w = h = 200
266
- pdf = PDF::Wrapper.new
267
- pdf.rectangle(x,y,w,h)
268
-
269
- receiver = PDF::Reader::RegisterReceiver.new
270
- reader = PDF::Reader.string(pdf.render, receiver)
271
-
272
- # the begin_new_subpath command specifies the start of the line, append line specifies the end
273
- callbacks = receiver.series(:begin_new_subpath, :append_line,:append_line,:append_line, :close_subpath)
274
- callbacks.shift[:args].should eql([x.to_f, y.to_f])
275
- callbacks.shift[:args].should eql([(x+w).to_f, y.to_f])
276
- callbacks.shift[:args].should eql([(x+w).to_f, (y+h).to_f])
277
- callbacks.shift[:args].should eql([x.to_f, (y+h).to_f])
278
- end
279
-
280
- specify "should be able to draw an empty rectangle onto the canvas with a line width of 5" do
281
- x = y = 100
282
- w = h = 200
283
- width = 5
284
- pdf = PDF::Wrapper.new
285
- pdf.rectangle(x,y,w,h, :line_width => width)
286
-
287
- receiver = PDF::Reader::RegisterReceiver.new
288
- reader = PDF::Reader.string(pdf.render, receiver)
289
-
290
- # ensure the line width was set correctly
291
- receiver.count(:set_line_width).should eql(1)
292
- receiver.first_occurance_of(:set_line_width)[:args].should eql([width.to_f])
293
-
294
- # the begin_new_subpath command specifies the start of the line, append line specifies the end
295
- callbacks = receiver.series(:begin_new_subpath, :append_line,:append_line,:append_line, :close_subpath)
296
- callbacks.shift[:args].should eql([x.to_f, y.to_f])
297
- callbacks.shift[:args].should eql([(x+w).to_f, y.to_f])
298
- callbacks.shift[:args].should eql([(x+w).to_f, (y+h).to_f])
299
- callbacks.shift[:args].should eql([x.to_f, (y+h).to_f])
300
- end
301
139
 
302
140
  specify "should leave the cursor in the bottom left of a layout when new text is added" do
303
141
  pdf = PDF::Wrapper.new
@@ -309,185 +147,10 @@ context "The PDF::Wrapper class" do
309
147
  newx, newy = pdf.current_point
310
148
 
311
149
  newx.should eql(x)
312
- # the top of our text box, plus its height
150
+ # the top of our text box, plus its height
313
151
  newy.should eql(y + height)
314
152
  end
315
153
 
316
- specify "should be able to draw a filled rectangle onto the canvas"
317
- =begin
318
- do
319
- x = y = 100
320
- w = h = 200
321
- pdf = PDF::Wrapper.new
322
- pdf.rectangle(x,y,w,h, :fill_color => :red)
323
-
324
- receiver = PDF::Reader::RegisterReceiver.new
325
- reader = PDF::Reader.string(pdf.render, receiver)
326
-
327
- # TODO: test for the appropriate pattern of callbacks
328
- end
329
- =end
330
-
331
- specify "should be able to draw an empty rounded rectangle onto the canvas"
332
- =begin
333
- do
334
- x = y = 100
335
- w = h = 200
336
- r = 5
337
- pdf = PDF::Wrapper.new
338
- pdf.rounded_rectangle(x,y,w,h,r)
339
-
340
- receiver = PDF::Reader::RegisterReceiver.new
341
- reader = PDF::Reader.string(pdf.render, receiver)
342
-
343
- # TODO: test for the appropriate pattern of callbacks
344
- end
345
- =end
346
-
347
- specify "should be able to draw an empty rounded rectangle onto the canvas with a line width of 5"
348
- =begin
349
- do
350
- x = y = 100
351
- w = h = 200
352
- r = 5
353
- w = 5
354
- pdf = PDF::Wrapper.new
355
- pdf.rounded_rectangle(x,y,w,h,r, :line_width => w)
356
-
357
- receiver = PDF::Reader::RegisterReceiver.new
358
- reader = PDF::Reader.string(pdf.render, receiver)
359
-
360
- # TODO: test for the appropriate pattern of callbacks
361
- end
362
- =end
363
-
364
- specify "should be able to draw a filled rounded rectangle onto the canvas"
365
- =begin
366
- do
367
- x = y = 100
368
- w = h = 200
369
- r = 5
370
- pdf = PDF::Wrapper.new
371
- pdf.rounded_rectangle(x,y,w,h,r, :fill_color => :red)
372
-
373
- receiver = PDF::Reader::RegisterReceiver.new
374
- reader = PDF::Reader.string(pdf.render, receiver)
375
-
376
- # TODO: test for the appropriate pattern of callbacks
377
- end
378
- =end
379
-
380
- specify "should be able to draw an empty circle onto the canvas"
381
- =begin
382
- do
383
- x = 100
384
- y = 200
385
- r = 5
386
- pdf = PDF::Wrapper.new
387
- pdf.circle(x,y,r)
388
-
389
- receiver = PDF::Reader::RegisterReceiver.new
390
- reader = PDF::Reader.string(pdf.render, receiver)
391
-
392
- # TODO: test for the appropriate pattern of callbacks
393
- end
394
- =end
395
-
396
- specify "should be able to draw an empty circle onto the canvas with a line width of 5"
397
- =begin
398
- do
399
- x = 100
400
- y = 200
401
- r = 5
402
- w = 5
403
- pdf = PDF::Wrapper.new
404
- pdf.circle(x,y,r, :line_width => w)
405
-
406
- receiver = PDF::Reader::RegisterReceiver.new
407
- reader = PDF::Reader.string(pdf.render, receiver)
408
-
409
- # TODO: test for the appropriate pattern of callbacks
410
- end
411
- =end
412
-
413
- specify "should be able to draw a filled circle onto the canvas"
414
- =begin
415
- do
416
- x = 100
417
- y = 200
418
- r = 5
419
- pdf = PDF::Wrapper.new
420
- pdf.circle(x,y,r, :fill_color => :red)
421
-
422
- receiver = PDF::Reader::RegisterReceiver.new
423
- reader = PDF::Reader.string(pdf.render, receiver)
424
-
425
- # TODO: test for the appropriate pattern of callbacks
426
- end
427
- =end
428
-
429
- specify "should be able to add ascii text to the canvas" do
430
- msg = "Chunky Bacon"
431
- pdf = PDF::Wrapper.new
432
- pdf.text msg
433
-
434
- receiver = PageTextReceiver.new
435
- reader = PDF::Reader.string(pdf.render, receiver)
436
-
437
- # TODO: test for the text is in the appropriate location on the page
438
- receiver.content.first.should eql(msg)
439
- end
440
-
441
- specify "should be able to add unicode text to the canvas" do
442
- msg = "メインページ"
443
- pdf = PDF::Wrapper.new
444
- pdf.text msg
445
-
446
- receiver = PageTextReceiver.new
447
- reader = PDF::Reader.string(pdf.render, receiver)
448
-
449
- # TODO: test for the text is in the appropriate location on the page
450
- receiver.content.first.should eql(msg)
451
- end
452
-
453
- specify "should be able to add text to the canvas in a bounding box using the cell method" do
454
- msg = "メインページ"
455
- pdf = PDF::Wrapper.new
456
- pdf.cell msg, 100, 100, 200, 200
457
-
458
- receiver = PageTextReceiver.new
459
- reader = PDF::Reader.string(pdf.render, receiver)
460
-
461
- # TODO: test for the text is in the appropriate location on the page
462
- receiver.content.first.should eql(msg)
463
- end
464
-
465
- specify "should keep all text for a cell inside the cell boundaries" do
466
- msg = "This is a text cell, added by James"
467
- pdf = PDF::Wrapper.new
468
- x = y = 100
469
- w = h = 200
470
- pdf.cell msg, x, y, w, h
471
-
472
- receiver = PDF::Reader::RegisterReceiver.new
473
- reader = PDF::Reader.string(pdf.render, receiver)
474
-
475
- receiver.all(:set_text_matrix_and_text_line_matrix).each do |cb|
476
- # horizontal location
477
- # TODO: we're only testing the it doesn't start past the right boundary of the cell
478
- # should also test that it doesn't start in the cell but overrun it
479
- (cb[:args][4] >= x).should be_true
480
- (cb[:args][4] <= x + w).should be_true
481
-
482
- # vertical location
483
- # TODO: we're only testing the it doesn't start past the bottom boundary of the cell
484
- # should also test that it doesn't start in the cell but overrun it
485
- cell_top_bound = pdf.page_height - y
486
- (cb[:args][5] <= cell_top_bound).should be_true
487
- (cb[:args][5] >= cell_top_bound - h).should be_true
488
- end
489
- end
490
-
491
154
  specify "should be able to render to a file" do
492
155
  # generate a PDF
493
156
  msg = "Chunky Bacon"
@@ -508,21 +171,6 @@ context "The PDF::Wrapper class" do
508
171
  tmp.unlink
509
172
  end
510
173
 
511
- specify "should be able to detect the filetype of an image" do
512
- pdf = PDF::Wrapper.new
513
- pdf.detect_image_type(File.dirname(__FILE__) + "/data/google.png").should eql(:png)
514
- pdf.detect_image_type(File.dirname(__FILE__) + "/data/zits.gif").should eql(:gif)
515
- pdf.detect_image_type(File.dirname(__FILE__) + "/data/orc.svg").should eql(:svg)
516
- pdf.detect_image_type(File.dirname(__FILE__) + "/data/utf8-long.pdf").should eql(:pdf)
517
- pdf.detect_image_type(File.dirname(__FILE__) + "/data/shipsail.jpg").should eql(:jpg)
518
- end
519
-
520
- specify "should be able to calculate the height of a string of text" do
521
- pdf = PDF::Wrapper.new
522
- opts = {:font_size => 16, :font => "Sans Serif", :alignment => :left, :justify => false }
523
- pdf.text_height(@medstr, pdf.body_width, opts).should eql(49)
524
- end
525
-
526
174
  specify "should be able to draw a table on the canvas"
527
175
 
528
176
  specify "should leave the cursor in the bottom left when adding a table" do
@@ -541,31 +189,6 @@ context "The PDF::Wrapper class" do
541
189
  x.to_i.should eql(100)
542
190
  end
543
191
 
544
- specify "should raise an exception if build_pango_layout is passed anything other than a string" do
545
- pdf = PDF::Wrapper.new
546
- lambda { pdf.build_pango_layout(10) }.should raise_error(ArgumentError)
547
-
548
- end
549
-
550
- if RUBY_VERSION >= "1.9"
551
- specify "should accept non UTF-8 strings to build_pango_layout and convert them on the fly" do
552
- pdf = PDF::Wrapper.new
553
-
554
- # all three of these files have the same content, but in different encodings
555
- iso2022_str = File.open(File.dirname(__FILE__) + "/data/shift_jis.txt", "r:ISO-2022-JP") { |f| f.read }.strip!
556
- shiftjis_str = File.open(File.dirname(__FILE__) + "/data/iso-2022-jp.txt", "r:Shift_JIS") { |f| f.read }.strip!
557
- utf8_str = File.open(File.dirname(__FILE__) + "/data/utf8.txt", "r:UTF-8") { |f| f.read }.strip!
558
-
559
- pdf.build_pango_layout(shiftjis_str)
560
- pdf.build_pango_layout(iso2022_str)
561
-
562
- # TODO: improve this spec using mocks. Atm, I'm assume that if build_pango_layout didn't raise an exception when
563
- # passed in the non UTF-8 strings, then all worked fine. yuck.
564
- end
565
-
566
- specify "should raise an error when a string that isn't convertable to UTF-8 is passed into build_pango_layout()"
567
- end
568
-
569
192
  specify "should be able to determine if a requested colour is valid or not" do
570
193
  pdf = PDF::Wrapper.new
571
194
  pdf.validate_color(:black).should be_true
@@ -794,12 +417,4 @@ context "The PDF::Wrapper class" do
794
417
  lambda { pdf.rounded_rectangle(100,100,100,100,10, :ponies => true)}.should raise_error(ArgumentError)
795
418
  lambda { pdf.image(File.dirname(__FILE__) + "/data/orc.svg", :ponies => true)}.should raise_error(ArgumentError)
796
419
  end
797
-
798
- specify "should be able to calculate image dimensions correctly" do
799
- pdf = PDF::Wrapper.new
800
- pdf.calc_image_dimensions(100, 100, 200, 200).should eql([100.0,100.0])
801
- pdf.calc_image_dimensions(nil, nil, 200, 200).should eql([200.0,200.0])
802
- pdf.calc_image_dimensions(150, 200, 200, 200, true).should eql([150.0,150.0])
803
- pdf.calc_image_dimensions(300, 250, 200, 200, true).should eql([250.0,250.0])
804
- end
805
420
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pdf-wrapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Healy
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-03-12 00:00:00 +11:00
12
+ date: 2008-04-27 00:00:00 +10:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -24,28 +24,33 @@ extra_rdoc_files:
24
24
  - CHANGELOG
25
25
  - TODO
26
26
  files:
27
- - examples/repeating.rb
28
27
  - examples/cell.rb
29
28
  - examples/image.rb
30
- - examples/utf8-long.rb
31
- - examples/table.rb
29
+ - examples/repeating.rb
32
30
  - examples/shapes.rb
31
+ - examples/table.rb
32
+ - examples/utf8-long.rb
33
33
  - examples/utf8.rb
34
34
  - lib/pdf
35
- - lib/pdf/wrapper.rb
36
35
  - lib/pdf/core.rb
36
+ - lib/pdf/wrapper.rb
37
37
  - specs/data
38
- - specs/data/shift_jis.txt
39
38
  - specs/data/google.png
40
- - specs/data/utf8-long.txt
41
39
  - specs/data/iso-2022-jp.txt
42
- - specs/data/utf8.txt
43
- - specs/data/shipsail.jpg
44
- - specs/data/zits.gif
45
40
  - specs/data/orc.svg
41
+ - specs/data/shift_jis.txt
42
+ - specs/data/shipsail.jpg
46
43
  - specs/data/stef.jpg
47
44
  - specs/data/utf8-long.pdf
45
+ - specs/data/utf8-long.txt
46
+ - specs/data/utf8.txt
47
+ - specs/data/zits.gif
48
48
  - specs/wrapper_spec.rb
49
+ - specs/load_spec.rb
50
+ - specs/shapes_spec.rb
51
+ - specs/text_spec.rb
52
+ - specs/spec_helper.rb
53
+ - specs/image_spec.rb
49
54
  - Rakefile
50
55
  - README
51
56
  - CHANGELOG