prawn-svg 0.9.1.11 → 0.12.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -3,3 +3,4 @@ spec/sample_output/*.pdf
3
3
  prawn-svg-*.gem
4
4
  Gemfile.lock
5
5
  .rvmrc
6
+ .*.swp
@@ -0,0 +1,78 @@
1
+ prawn-svg
2
+ =========
3
+
4
+ An SVG renderer for the Prawn PDF library.
5
+
6
+ This will take an SVG file as input and render it into your PDF. Find out more about the Prawn PDF library at:
7
+
8
+ http://wiki.github.com/sandal/prawn/
9
+
10
+ Using prawn-svg
11
+ ---------------
12
+
13
+ ```ruby
14
+ Prawn::Document.generate("svg.pdf") do
15
+ svg svg_data, :at => [x, y], :width => w
16
+ end
17
+ ```
18
+
19
+ <tt>:at</tt> must be specified. <tt>:width</tt>, <tt>:height</tt>, or neither may be specified; if neither is present,
20
+ the resolution specified in the SVG will be used.
21
+
22
+ Supported features
23
+ ------------------
24
+
25
+ prawn-svg is in its infancy and does not support the full SVG specifications. It currently supports:
26
+
27
+ - <tt>line</tt> tag
28
+ - <tt>polyline</tt> tag
29
+ - <tt>polygon</tt> tag
30
+ - <tt>circle</tt> tag
31
+ - <tt>ellipse</tt> tag (although this seems to be buggy)
32
+
33
+ - <tt>rect</tt> tag
34
+ supports rounded rects, but only one radius is applied to all corners
35
+
36
+ - <tt>path</tt> tag
37
+ supports moveto, closepath, lineto, horiz lineto, vert lineto, curveto, smooth curveto, quad curveto, smooth quad curveto
38
+ does not support elliptical arc
39
+
40
+ - <tt>text</tt> and <tt>tspan</tt> tags
41
+ attributes: size, text-anchor, font-family, font-weight, dx, dy
42
+
43
+ - <tt>svg</tt>, <tt>g</tt> and <tt>symbol</tt> tags
44
+
45
+ - <tt>use</tt> tag
46
+
47
+ - <tt>style</tt> tag, if css_parser gem is installed on the system (see CSS section below)
48
+
49
+ - attributes/styles: <tt>fill</tt>, <tt>stroke</tt>, <tt>stroke-width</tt>, <tt>opacity</tt>, <tt>fill-opacity</tt>, <tt>stroke-opacity</tt>, <tt>transform</tt>
50
+
51
+ - transform methods: <tt>translate</tt>, <tt>rotate</tt>, <tt>scale</tt>, <tt>matrix</tt>
52
+
53
+ - colors: HTML standard names, <tt>#xxx</tt>, <tt>#xxxxxx</tt>, <tt>rgb(1, 2, 3)</tt>, <tt>rgb(1%, 2%, 3%)</tt>
54
+
55
+ - measurements specified in <tt>pt</tt>, <tt>cm</tt>, <tt>dm</tt>, <tt>ft</tt>, <tt>in</tt>, <tt>m</tt>, <tt>mm</tt>, <tt>yd</tt>, <tt>%</tt>
56
+
57
+ - fonts: generic CSS fonts, built in PDF fonts, and any TTF fonts in your fonts path
58
+
59
+ By default, prawn-svg has a fonts path of <tt>["/Library/Fonts", "/usr/share/fonts/truetype/**"]</tt> to catch
60
+ Mac OS X and Debian Linux users. You can add to the font path:
61
+
62
+ ```ruby
63
+ Prawn::Svg.font_path &lt;&lt; "/my/font/directory"
64
+ ```
65
+
66
+ CSS
67
+ ---
68
+
69
+ If the css_parser gem is installed, it will handle CSS style definitions, but only simple tag, class or id definitions. It's very basic
70
+ so do not expect too much of it.
71
+
72
+ Not supported
73
+ -------------
74
+
75
+ prawn-svg does NOT support external references, measurements in en or em, gradients/patterns or markers.
76
+
77
+ --
78
+ Copyright Roger Nesbitt <roger@seriousorange.com>. MIT licence.
@@ -53,37 +53,34 @@ class Prawn::Svg::Element
53
53
  case name
54
54
  when 'translate'
55
55
  x, y = arguments
56
- x, y = x.split(/\s+/) if y.nil?
57
56
  add_call_and_enter name, @document.distance(x), -@document.distance(y)
58
57
 
59
58
  when 'rotate'
60
- rotation_arguments = arguments.first.split(/\s+/)
61
- if (rotation_arguments.length == 3)
62
- add_call_and_enter name, -rotation_arguments.first.to_f, :origin => [@document.x(rotation_arguments[1].to_f), @document.y(rotation_arguments[2].to_f)]
59
+ r, x, y = arguments.collect {|a| a.to_f}
60
+ if arguments.length == 3
61
+ add_call_and_enter name, -r, :origin => [@document.x(x), @document.y(y)]
63
62
  else
64
- add_call_and_enter name, -arguments.first.to_f, :origin => [0, @document.y('0')]
63
+ add_call_and_enter name, -r, :origin => [0, @document.y('0')]
65
64
  end
66
65
 
67
66
  when 'scale'
68
- args = arguments.first.split(/\s+/)
69
- x_scale = args[0].to_f
70
- y_scale = (args[1] || x_scale).to_f
67
+ x_scale = arguments[0].to_f
68
+ y_scale = (arguments[1] || x_scale).to_f
71
69
  add_call_and_enter "transformation_matrix", x_scale, 0, 0, y_scale, 0, 0
72
70
 
73
71
  when 'matrix'
74
- args = arguments.first.split(/\s+/)
75
- if args.length != 6
72
+ if arguments.length != 6
76
73
  @document.warnings << "transform 'matrix' must have six arguments"
77
74
  else
78
- a, b, c, d, e, f = args.collect {|a| a.to_f}
79
- add_call_and_enter "transformation_matrix", a, b, c, d, @document.distance(e), -@document.distance(f)
75
+ a, b, c, d, e, f = arguments.collect {|argument| argument.to_f}
76
+ add_call_and_enter "transformation_matrix", a, -b, -c, d, @document.distance(e), -@document.distance(f)
80
77
  end
81
78
  else
82
79
  @document.warnings << "Unknown transformation '#{name}'; ignoring"
83
80
  end
84
81
  end
85
- end
86
-
82
+ end
83
+
87
84
  # Opacity:
88
85
  # We can't do nested opacities quite like the SVG requires, but this is close enough.
89
86
  fill_opacity = stroke_opacity = clamp(@attributes['opacity'].to_f, 0, 1) if @attributes['opacity']
@@ -147,9 +144,9 @@ class Prawn::Svg::Element
147
144
  def parse_css_method_calls(string)
148
145
  string.scan(/\s*(\w+)\(([^)]+)\)\s*/).collect do |call|
149
146
  name, argument_string = call
150
- arguments = argument_string.split(",").collect {|s| s.strip}
147
+ arguments = argument_string.strip.split(/\s*[,\s]\s*/)
151
148
  [name, arguments]
152
- end
149
+ end
153
150
  end
154
151
 
155
152
  # TODO : use http://www.w3.org/TR/SVG11/types.html#ColorKeywords
@@ -92,8 +92,10 @@ module Prawn
92
92
  @relative_text_position = options[:at][0] + width + space_width
93
93
 
94
94
  when 'transformation_matrix'
95
- arguments[4] += prawn.bounds.absolute_left * (1 - arguments[0])
96
- arguments[5] += prawn.bounds.absolute_top * (1 - arguments[3])
95
+ x = prawn.bounds.absolute_left
96
+ y = prawn.bounds.absolute_top
97
+ arguments[4] += x - (x * arguments[0] - y * arguments[1])
98
+ arguments[5] += y - (x * arguments[1] + y * arguments[0])
97
99
 
98
100
  when 'save'
99
101
  prawn.save_graphics_state
@@ -51,7 +51,6 @@ class Prawn::Svg::Parser
51
51
 
52
52
  private
53
53
  REQUIRED_ATTRIBUTES = {
54
- "line" => %w(x1 y1 x2 y2),
55
54
  "polyline" => %w(points),
56
55
  "polygon" => %w(points),
57
56
  "circle" => %w(r),
@@ -88,7 +87,7 @@ class Prawn::Svg::Parser
88
87
  @svg_text.parse(element)
89
88
 
90
89
  when 'line'
91
- element.add_call 'line', x(attrs['x1']), y(attrs['y1']), x(attrs['x2']), y(attrs['y2'])
90
+ element.add_call 'line', x(attrs['x1'] || '0'), y(attrs['y1'] || '0'), x(attrs['x2'] || '0'), y(attrs['y2'] || '0')
92
91
 
93
92
  when 'polyline'
94
93
  points = attrs['points'].split(/\s+/)
@@ -164,11 +163,15 @@ class Prawn::Svg::Parser
164
163
  end
165
164
 
166
165
  commands.collect do |command, args|
167
- point_to = [x(args[0]), y(args[1])]
168
- if command == 'curve_to'
169
- opts = {:bounds => [[x(args[2]), y(args[3])], [x(args[4]), y(args[5])]]}
166
+ if args && args.length > 0
167
+ point_to = [x(args[0]), y(args[1])]
168
+ if command == 'curve_to'
169
+ opts = {:bounds => [[x(args[2]), y(args[3])], [x(args[4]), y(args[5])]]}
170
+ end
171
+ element.add_call command, point_to, opts
172
+ else
173
+ element.add_call command
170
174
  end
171
- element.add_call command, point_to, opts
172
175
  end
173
176
  end
174
177
 
@@ -68,7 +68,8 @@ module Prawn
68
68
 
69
69
  when 'Z' # closepath
70
70
  if @subpath_initial_point
71
- @calls << ["line_to", @subpath_initial_point]
71
+ #@calls << ["line_to", @subpath_initial_point]
72
+ @calls << ["close_path"]
72
73
  @last_point = @subpath_initial_point
73
74
  end
74
75
 
@@ -1,5 +1,5 @@
1
1
  module Prawn
2
2
  module Svg
3
- VERSION = '0.9.1.11'
3
+ VERSION = '0.12.0.1'
4
4
  end
5
5
  end
@@ -9,7 +9,7 @@ describe Prawn::Svg::Parser::Path do
9
9
  it "correctly parses a valid path" do
10
10
  calls = []
11
11
  @path.stub!(:run_path_command) {|*args| calls << args}
12
- @path.parse("A12.34 -56.78 89B4 5 C 6,7 T QX 0")
12
+ @path.parse("A12.34 -56.78 89B4 5 C 6,7 T QX 0 Z")
13
13
 
14
14
  calls.should == [
15
15
  ["A", [12.34, -56.78, 89]],
@@ -17,7 +17,8 @@ describe Prawn::Svg::Parser::Path do
17
17
  ["C", [6, 7]],
18
18
  ["T", []],
19
19
  ["Q", []],
20
- ["X", [0]]
20
+ ["X", [0]],
21
+ ["Z", []]
21
22
  ]
22
23
  end
23
24
 
@@ -0,0 +1,10 @@
1
+ <?xml version="1.0" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
3
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+ <svg width="12cm" height="4cm" viewBox="0 0 1200 400"
5
+ xmlns="http://www.w3.org/2000/svg" version="1.1">
6
+ <desc>Example close_path - triangle with rounded corners</desc>
7
+ <!-- Show outline of canvas using 'polygon' element -->
8
+ <path d="M 10,10 L 15,20 L 20,10 z" />
9
+ </svg>
10
+
@@ -0,0 +1,10 @@
1
+ <svg height="975" version="1.1" width="1275" xmlns="http://www.w3.org/2000/svg">
2
+ <text x="200" y="200" text-anchor="middle" stroke="none" fill="#000000" font-size="40px" font-weight="bold" transform="matrix(0.9848,0.1736,-0.1736,0.9848,0,0)">
3
+ Zero transform
4
+ </text>
5
+ <rect x="198" y="198" width="4" height="4" stroke="blue" fill="blue" />
6
+ <text x="638" y="471" text-anchor="middle" stroke="none" fill="#000000" font-size="80px" font-weight="bold" transform="matrix(0.7071,-0.7071,0.7071,0.7071,-146.1814,589.0868)">
7
+ Matrix transform
8
+ </text>
9
+ <rect x="636" y="469" width="4" height="4" stroke="blue" fill="blue" />
10
+ </svg>
metadata CHANGED
@@ -1,82 +1,75 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: prawn-svg
3
- version: !ruby/object:Gem::Version
4
- hash: 21
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.12.0.1
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 9
9
- - 1
10
- - 11
11
- version: 0.9.1.11
12
6
  platform: ruby
13
- authors:
7
+ authors:
14
8
  - Roger Nesbitt
15
9
  autorequire:
16
10
  bindir: bin
17
11
  cert_chain: []
18
-
19
- date: 2012-04-20 00:00:00 +12:00
20
- default_executable:
21
- dependencies:
22
- - !ruby/object:Gem::Dependency
12
+ date: 2012-10-10 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
23
15
  name: prawn
24
- prerelease: false
25
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
26
17
  none: false
27
- requirements:
28
- - - ">="
29
- - !ruby/object:Gem::Version
30
- hash: 55
31
- segments:
32
- - 0
33
- - 8
34
- - 4
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
35
21
  version: 0.8.4
36
22
  type: :runtime
37
- version_requirements: *id001
38
- - !ruby/object:Gem::Dependency
39
- name: rspec
40
23
  prerelease: false
41
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.8.4
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
42
33
  none: false
43
- requirements:
44
- - - ">="
45
- - !ruby/object:Gem::Version
46
- hash: 3
47
- segments:
48
- - 0
49
- version: "0"
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
50
38
  type: :development
51
- version_requirements: *id002
52
- - !ruby/object:Gem::Dependency
53
- name: rake
54
39
  prerelease: false
55
- requirement: &id003 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
56
49
  none: false
57
- requirements:
58
- - - ">="
59
- - !ruby/object:Gem::Version
60
- hash: 3
61
- segments:
62
- - 0
63
- version: "0"
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
64
54
  type: :development
65
- version_requirements: *id003
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
66
62
  description: SVG renderer for Prawn PDF library
67
63
  email: roger@seriousorange.com
68
64
  executables: []
69
-
70
65
  extensions: []
71
-
72
66
  extra_rdoc_files: []
73
-
74
- files:
67
+ files:
75
68
  - .gitignore
76
69
  - .rspec
77
70
  - Gemfile
78
71
  - LICENSE
79
- - README
72
+ - README.md
80
73
  - Rakefile
81
74
  - lib/prawn-svg.rb
82
75
  - lib/prawn/svg/document.rb
@@ -99,12 +92,14 @@ files:
99
92
  - spec/sample_output/directory
100
93
  - spec/sample_svg/arcs01.svg
101
94
  - spec/sample_svg/circle01.svg
95
+ - spec/sample_svg/close_path.svg
102
96
  - spec/sample_svg/cubic01.svg
103
97
  - spec/sample_svg/cubic01a.svg
104
98
  - spec/sample_svg/cubic02.svg
105
99
  - spec/sample_svg/ellipse01.svg
106
100
  - spec/sample_svg/line01.svg
107
101
  - spec/sample_svg/maths.svg
102
+ - spec/sample_svg/matrix_transform.svg
108
103
  - spec/sample_svg/omnigraffle.svg
109
104
  - spec/sample_svg/opacity01.svg
110
105
  - spec/sample_svg/polygon01.svg
@@ -120,41 +115,31 @@ files:
120
115
  - spec/sample_svg/tspan03.svg
121
116
  - spec/sample_svg/use.svg
122
117
  - spec/spec_helper.rb
123
- has_rdoc: true
124
118
  homepage: http://github.com/mogest/prawn-svg
125
119
  licenses: []
126
-
127
120
  post_install_message:
128
121
  rdoc_options: []
129
-
130
- require_paths:
122
+ require_paths:
131
123
  - lib
132
- required_ruby_version: !ruby/object:Gem::Requirement
124
+ required_ruby_version: !ruby/object:Gem::Requirement
133
125
  none: false
134
- requirements:
135
- - - ">="
136
- - !ruby/object:Gem::Version
137
- hash: 3
138
- segments:
139
- - 0
140
- version: "0"
141
- required_rubygems_version: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ! '>='
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ required_rubygems_version: !ruby/object:Gem::Requirement
142
131
  none: false
143
- requirements:
144
- - - ">="
145
- - !ruby/object:Gem::Version
146
- hash: 3
147
- segments:
148
- - 0
149
- version: "0"
132
+ requirements:
133
+ - - ! '>='
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
150
136
  requirements: []
151
-
152
137
  rubyforge_project:
153
- rubygems_version: 1.6.2
138
+ rubygems_version: 1.8.23
154
139
  signing_key:
155
140
  specification_version: 3
156
141
  summary: SVG renderer for Prawn PDF library
157
- test_files:
142
+ test_files:
158
143
  - spec/lib/parser_spec.rb
159
144
  - spec/lib/path_spec.rb
160
145
  - spec/lib/svg_spec.rb
@@ -165,12 +150,14 @@ test_files:
165
150
  - spec/sample_output/directory
166
151
  - spec/sample_svg/arcs01.svg
167
152
  - spec/sample_svg/circle01.svg
153
+ - spec/sample_svg/close_path.svg
168
154
  - spec/sample_svg/cubic01.svg
169
155
  - spec/sample_svg/cubic01a.svg
170
156
  - spec/sample_svg/cubic02.svg
171
157
  - spec/sample_svg/ellipse01.svg
172
158
  - spec/sample_svg/line01.svg
173
159
  - spec/sample_svg/maths.svg
160
+ - spec/sample_svg/matrix_transform.svg
174
161
  - spec/sample_svg/omnigraffle.svg
175
162
  - spec/sample_svg/opacity01.svg
176
163
  - spec/sample_svg/polygon01.svg
data/README DELETED
@@ -1,57 +0,0 @@
1
- An SVG renderer for the Prawn PDF library.
2
-
3
- This will take an SVG file as input and render it into your PDF. Find out more about the Prawn PDF library at:
4
-
5
- http://wiki.github.com/sandal/prawn/
6
-
7
- Using prawn-svg:
8
-
9
- Prawn::Document.generate("svg.pdf") do
10
- svg svg_data, :at => [x, y], :width => w
11
- end
12
-
13
- :at must be specified. :width, :height, or neither may be specified; if neither is present,
14
- the resolution specified in the SVG will be used.
15
-
16
- prawn-svg is in its infancy and does not support the full SVG specifications. It currently supports:
17
-
18
- - line tag
19
- - polyline tag
20
- - polygon tag
21
- - circle tag
22
- - ellipse tag (although this seems to be buggy)
23
-
24
- - rect tag
25
- supports rounded rects, but only one radius is applied to all corners
26
-
27
- - path tag
28
- supports moveto, closepath, lineto, horiz lineto, vert lineto, curveto, smooth curveto, quad curveto, smooth quad curveto
29
- does not support elliptical arc
30
-
31
- - text and tspan tags
32
- attributes: size, text-anchor, font-family, font-weight, dx, dy
33
-
34
- - svg, g and symbol tags
35
-
36
- - use tag
37
-
38
- - style tag, if css_parser gem is installed on the system [1]
39
-
40
- - attributes/styles: fill, stroke, stroke-width, opacity, fill-opacity, stroke-opacity, transform
41
-
42
- - transform methods: translate, rotate, scale, matrix
43
-
44
- - colors: html standard names, #xxx, #xxxxxx, rgb(1, 2, 3), rgb(1%, 2%, 3%)
45
-
46
- - measurements specified in pt, cm, dm, ft, in, m, mm, yd, %
47
-
48
- - fonts: generic CSS fonts, built in PDF fonts, and any TTF fonts in your fonts path
49
-
50
- By default, prawn-svg has a fonts path of ["/Library/Fonts", "/usr/share/fonts/truetype/**"] to catch
51
- Mac OS X and Debian Linux users. You can add to the font path:
52
-
53
- Prawn::Svg.font_path << "/my/font/directory"
54
-
55
- prawn-svg does NOT support external references, gradients/patterns or markers.
56
-
57
- [1] If the css_parser gem is installed, it will handle CSS style definitions, but only simple tag, class or id definitions.