prawn 0.2.0 → 0.2.1
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/Rakefile +1 -1
- data/examples/span.rb +27 -0
- data/lib/prawn.rb +1 -1
- data/lib/prawn/document.rb +2 -1
- data/lib/prawn/document/span.rb +31 -0
- data/lib/prawn/font.rb +26 -8
- data/lib/prawn/font/cmap.rb +1 -1
- data/lib/prawn/font/metrics.rb +2 -2
- data/lib/prawn/font/wrapping.rb +4 -4
- data/lib/prawn/images.rb +9 -3
- data/spec/font_spec.rb +23 -1
- data/spec/images_spec.rb +16 -1
- metadata +4 -2
data/Rakefile
CHANGED
data/examples/span.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
$LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
|
4
|
+
require "prawn"
|
5
|
+
|
6
|
+
Prawn::Document.generate("span.pdf") do
|
7
|
+
|
8
|
+
# Spans will typically be used outside of bounding boxes as a way to build
|
9
|
+
# single columns of flowing text that span across pages.
|
10
|
+
#
|
11
|
+
span(350, :position => :center) do
|
12
|
+
text "Here's some centered text in a 350 point column. " * 100
|
13
|
+
end
|
14
|
+
|
15
|
+
# Spans are not really compatible with bounding boxes because they break
|
16
|
+
# the nesting chain and also may position text outside of the bounding box
|
17
|
+
# boundaries, but sometimes you may wish to use them anyway for convenience
|
18
|
+
# Here's an example of how to do that dynamically.
|
19
|
+
#
|
20
|
+
bounding_box([50,300], :width => 400) do
|
21
|
+
text "Here's some default bounding box text. " * 10
|
22
|
+
span(bounds.width,
|
23
|
+
:position => bounds.absolute_left - margin_box.absolute_left) do
|
24
|
+
text "The rain in spain falls mainly on the plains. " * 300
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/prawn.rb
CHANGED
data/lib/prawn/document.rb
CHANGED
@@ -12,6 +12,7 @@ require "prawn/document/bounding_box"
|
|
12
12
|
require "prawn/document/text"
|
13
13
|
require "prawn/document/table"
|
14
14
|
require "prawn/document/internals"
|
15
|
+
require "prawn/document/span"
|
15
16
|
|
16
17
|
module Prawn
|
17
18
|
class Document
|
@@ -78,7 +79,7 @@ module Prawn
|
|
78
79
|
def initialize(options={},&block)
|
79
80
|
Prawn.verify_options [:page_size, :page_layout, :on_page_start,
|
80
81
|
:on_page_stop, :left_margin, :right_margin, :top_margin,
|
81
|
-
:bottom_margin, :skip_page_creation, :compress ], options
|
82
|
+
:bottom_margin, :skip_page_creation, :compress, :skip_encoding, :text_options ], options
|
82
83
|
|
83
84
|
@objects = []
|
84
85
|
@info = ref(:Creator => "Prawn", :Producer => "Prawn")
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Prawn
|
2
|
+
class Document
|
3
|
+
def span(width, options={})
|
4
|
+
Prawn.verify_options [:position], options
|
5
|
+
original_position = self.y
|
6
|
+
|
7
|
+
# FIXME: How many effing times do I want to write this same code?
|
8
|
+
left_boundary = case(options[:position] || :left)
|
9
|
+
when :left
|
10
|
+
margin_box.absolute_left
|
11
|
+
when :center
|
12
|
+
margin_box.absolute_left + margin_box.width / 2.0 - width /2.0
|
13
|
+
when :right
|
14
|
+
margin_box.absolute_right - width
|
15
|
+
when Numeric
|
16
|
+
margin_box.absolute_left + options[:position]
|
17
|
+
else
|
18
|
+
raise ArgumentError, "Invalid option for :position"
|
19
|
+
end
|
20
|
+
|
21
|
+
# we need to bust out of whatever nested bounding boxes we're in.
|
22
|
+
canvas do
|
23
|
+
bounding_box([left_boundary,
|
24
|
+
margin_box.absolute_top], :width => width) do
|
25
|
+
self.y = original_position
|
26
|
+
yield
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/prawn/font.rb
CHANGED
@@ -39,7 +39,7 @@ module Prawn
|
|
39
39
|
|
40
40
|
# Hash of Font objects keyed by names
|
41
41
|
#
|
42
|
-
def font_registry
|
42
|
+
def font_registry #:nodoc:
|
43
43
|
@font_registry ||= {}
|
44
44
|
end
|
45
45
|
|
@@ -94,14 +94,28 @@ module Prawn
|
|
94
94
|
|
95
95
|
DEFAULT_SIZE = 12
|
96
96
|
|
97
|
-
def self.register(name,options={})
|
97
|
+
def self.register(name,options={}) #:nodoc:
|
98
98
|
options[:for].font_registry[name] = Font.new(name,options)
|
99
99
|
end
|
100
|
-
|
101
|
-
|
100
|
+
|
101
|
+
# The font metrics object
|
102
|
+
attr_reader :metrics
|
103
|
+
|
104
|
+
# The current font name
|
105
|
+
attr_reader :name
|
106
|
+
|
107
|
+
# The current font family
|
108
|
+
attr_reader :family
|
109
|
+
|
110
|
+
attr_reader :identifier, :reference #:nodoc:
|
111
|
+
|
112
|
+
# Sets the size of the current font:
|
113
|
+
#
|
114
|
+
# font.size = 16
|
115
|
+
#
|
102
116
|
attr_writer :size
|
103
117
|
|
104
|
-
def initialize(name,options={})
|
118
|
+
def initialize(name,options={}) #:nodoc:
|
105
119
|
@name = name
|
106
120
|
@family = options[:family]
|
107
121
|
|
@@ -113,7 +127,7 @@ module Prawn
|
|
113
127
|
@identifier = :"F#{@document.font_registry.size + 1}"
|
114
128
|
|
115
129
|
case(name)
|
116
|
-
when /\.ttf$/
|
130
|
+
when /\.ttf$/i
|
117
131
|
embed_ttf(name)
|
118
132
|
else
|
119
133
|
register_builtin(name)
|
@@ -170,11 +184,15 @@ module Prawn
|
|
170
184
|
@metrics.font_height(@size)
|
171
185
|
end
|
172
186
|
|
173
|
-
|
187
|
+
# The height of the ascender at the current font size in PDF points
|
188
|
+
#
|
189
|
+
def ascender
|
174
190
|
@metrics.ascender / 1000.0 * @size
|
175
191
|
end
|
176
192
|
|
177
|
-
|
193
|
+
# The height of the descender at the current font size in PDF points
|
194
|
+
#
|
195
|
+
def descender
|
178
196
|
@metrics.descender / 1000.0 * @size
|
179
197
|
end
|
180
198
|
|
data/lib/prawn/font/cmap.rb
CHANGED
data/lib/prawn/font/metrics.rb
CHANGED
@@ -10,13 +10,13 @@
|
|
10
10
|
# This is free software. Please see the LICENSE and COPYING files for details.
|
11
11
|
|
12
12
|
module Prawn
|
13
|
-
class Font
|
13
|
+
class Font
|
14
14
|
class Metrics #:nodoc:
|
15
15
|
|
16
16
|
include Prawn::Font::Wrapping
|
17
17
|
|
18
18
|
def self.[](font)
|
19
|
-
data[font] ||= (font.match(/\.ttf$/) ? TTF : Adobe).new(font)
|
19
|
+
data[font] ||= (font.match(/\.ttf$/i) ? TTF : Adobe).new(font)
|
20
20
|
end
|
21
21
|
|
22
22
|
def self.data
|
data/lib/prawn/font/wrapping.rb
CHANGED
@@ -6,17 +6,17 @@
|
|
6
6
|
#
|
7
7
|
# This is free software. Please see the LICENSE and COPYING files for details.
|
8
8
|
module Prawn
|
9
|
-
class Font
|
9
|
+
class Font
|
10
10
|
module Wrapping #:nodoc:
|
11
11
|
ruby_18 { $KCODE="U" }
|
12
12
|
|
13
13
|
# TODO: Replace with TeX optimal algorithm
|
14
14
|
def naive_wrap(string, line_width, font_size, options = {})
|
15
|
-
accumulated_width = 0
|
16
15
|
scan_pattern = options[:mode] == :character ? /./ : /\S+|\s+/
|
17
16
|
|
18
17
|
output = ""
|
19
|
-
string.lines.each do |line|
|
18
|
+
string.lines.each do |line|
|
19
|
+
accumulated_width = 0
|
20
20
|
segments = line.scan(scan_pattern)
|
21
21
|
|
22
22
|
segments.each do |segment|
|
@@ -24,7 +24,7 @@ module Prawn
|
|
24
24
|
:kerning => options[:kerning])
|
25
25
|
|
26
26
|
if (accumulated_width + segment_width).round > line_width.round
|
27
|
-
output = "#{output.
|
27
|
+
output = "#{output.sub(/[ \t]*\n?(\n*)\z/, "\n\\1")}"
|
28
28
|
|
29
29
|
if segment =~ /\s/
|
30
30
|
accumulated_width = 0
|
data/lib/prawn/images.rb
CHANGED
@@ -36,11 +36,15 @@ module Prawn
|
|
36
36
|
# proportionally. When both are provided, the image will be stretched to
|
37
37
|
# fit the dimensions without maintaining the aspect ratio.
|
38
38
|
#
|
39
|
-
def image(
|
39
|
+
def image(file, options={})
|
40
40
|
Prawn.verify_options [:at,:position, :height, :width, :scale], options
|
41
|
-
raise ArgumentError, "#{filename} not found" unless File.file?(filename)
|
42
41
|
|
43
|
-
|
42
|
+
if file.kind_of?(IO)
|
43
|
+
image_content = file.read
|
44
|
+
else
|
45
|
+
raise ArgumentError, "#{file} not found" unless File.file?(file)
|
46
|
+
image_content = File.read_binary(file)
|
47
|
+
end
|
44
48
|
|
45
49
|
image_sha1 = Digest::SHA1.hexdigest(image_content)
|
46
50
|
|
@@ -83,6 +87,8 @@ module Prawn
|
|
83
87
|
# add the image to the current page
|
84
88
|
instruct = "\nq\n%.3f 0 0 %.3f %.3f %.3f cm\n/%s Do\nQ"
|
85
89
|
add_content instruct % [ w, h, x, y - h, label ]
|
90
|
+
|
91
|
+
return info
|
86
92
|
end
|
87
93
|
|
88
94
|
private
|
data/spec/font_spec.rb
CHANGED
@@ -17,7 +17,29 @@ describe "Font Metrics" do
|
|
17
17
|
comicsans = "#{Prawn::BASEDIR}/data/fonts/comicsans.ttf"
|
18
18
|
@pdf.font(comicsans)
|
19
19
|
@pdf.font.metrics.should == Prawn::Font::Metrics[comicsans]
|
20
|
-
end
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should wrap text" do
|
23
|
+
@pdf = Prawn::Document.new
|
24
|
+
@pdf.font "Courier"
|
25
|
+
@pdf.font.metrics.naive_wrap("Please wrap this text about HERE. More text that should be wrapped", 220, @pdf.font.size).should ==
|
26
|
+
"Please wrap this text about\nHERE. More text that should be\nwrapped"
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should respect end of line when wrapping text" do
|
30
|
+
@pdf = Prawn::Document.new
|
31
|
+
@pdf.font "Courier"
|
32
|
+
text = "Please wrap only before\nTHIS word. Don't wrap this"
|
33
|
+
@pdf.font.metrics.naive_wrap(text, 220, @pdf.font.size).should == text
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should respect end of line when wrapping text and mode is set to 'character'" do
|
37
|
+
@pdf = Prawn::Document.new
|
38
|
+
@pdf.font "Courier"
|
39
|
+
opts = {:mode => :character}
|
40
|
+
@pdf.font.metrics.naive_wrap("You can wrap this text HERE", 180, @pdf.font.size, opts).should ==
|
41
|
+
"You can wrap this text HE\nRE"
|
42
|
+
end
|
21
43
|
|
22
44
|
end
|
23
45
|
|
data/spec/images_spec.rb
CHANGED
@@ -5,7 +5,7 @@ require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
|
|
5
5
|
describe "the image() function" do
|
6
6
|
|
7
7
|
before(:each) do
|
8
|
-
@filename = "#{Prawn::BASEDIR}/data/images/pigs.jpg"
|
8
|
+
@filename = "#{Prawn::BASEDIR}/data/images/pigs.jpg"
|
9
9
|
create_pdf
|
10
10
|
end
|
11
11
|
|
@@ -21,5 +21,20 @@ describe "the image() function" do
|
|
21
21
|
# but only 1 image xobject
|
22
22
|
output.scan(/\/Type \/XObject/).size.should == 1
|
23
23
|
end
|
24
|
+
|
25
|
+
it "should return the image info object" do
|
26
|
+
info = @pdf.image(@filename)
|
27
|
+
|
28
|
+
assert info.kind_of?(Prawn::Images::JPG)
|
29
|
+
|
30
|
+
info.height.should == 453
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should accept IO objects" do
|
34
|
+
file = File.open(@filename, "rb")
|
35
|
+
info = @pdf.image(file)
|
36
|
+
|
37
|
+
info.height.should == 453
|
38
|
+
end
|
24
39
|
end
|
25
40
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prawn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gregory Brown
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-10-17 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -53,6 +53,7 @@ files:
|
|
53
53
|
- examples/simple_text.rb
|
54
54
|
- examples/simple_text_ttf.rb
|
55
55
|
- examples/sjis.rb
|
56
|
+
- examples/span.rb
|
56
57
|
- examples/table.rb
|
57
58
|
- examples/text_flow.rb
|
58
59
|
- examples/utf8.rb
|
@@ -62,6 +63,7 @@ files:
|
|
62
63
|
- lib/prawn/document/bounding_box.rb
|
63
64
|
- lib/prawn/document/internals.rb
|
64
65
|
- lib/prawn/document/page_geometry.rb
|
66
|
+
- lib/prawn/document/span.rb
|
65
67
|
- lib/prawn/document/table.rb
|
66
68
|
- lib/prawn/document/text.rb
|
67
69
|
- lib/prawn/document.rb
|