prawn 2.0.1 → 2.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +7 -5
- data/lib/prawn.rb +4 -4
- data/lib/prawn/document.rb +47 -46
- data/lib/prawn/document/bounding_box.rb +13 -19
- data/lib/prawn/document/column_box.rb +3 -5
- data/lib/prawn/document/internals.rb +0 -1
- data/lib/prawn/document/span.rb +12 -12
- data/lib/prawn/errors.rb +32 -33
- data/lib/prawn/font.rb +29 -36
- data/lib/prawn/font/afm.rb +20 -20
- data/lib/prawn/font/dfont.rb +0 -1
- data/lib/prawn/font/ttf.rb +30 -27
- data/lib/prawn/font_metric_cache.rb +4 -8
- data/lib/prawn/graphics.rb +37 -42
- data/lib/prawn/graphics/cap_style.rb +1 -1
- data/lib/prawn/graphics/color.rb +21 -23
- data/lib/prawn/graphics/dash.rb +5 -6
- data/lib/prawn/graphics/join_style.rb +1 -2
- data/lib/prawn/graphics/patterns.rb +25 -21
- data/lib/prawn/graphics/transformation.rb +4 -5
- data/lib/prawn/graphics/transparency.rb +6 -8
- data/lib/prawn/grid.rb +21 -14
- data/lib/prawn/image_handler.rb +2 -2
- data/lib/prawn/images.rb +29 -31
- data/lib/prawn/images/image.rb +1 -1
- data/lib/prawn/images/jpg.rb +10 -12
- data/lib/prawn/images/png.rb +13 -13
- data/lib/prawn/measurements.rb +7 -14
- data/lib/prawn/outline.rb +6 -6
- data/lib/prawn/repeater.rb +1 -5
- data/lib/prawn/security.rb +17 -25
- data/lib/prawn/security/arcfour.rb +1 -1
- data/lib/prawn/soft_mask.rb +11 -12
- data/lib/prawn/stamp.rb +16 -8
- data/lib/prawn/text.rb +23 -20
- data/lib/prawn/text/box.rb +3 -6
- data/lib/prawn/text/formatted/arranger.rb +9 -12
- data/lib/prawn/text/formatted/box.rb +23 -22
- data/lib/prawn/text/formatted/fragment.rb +0 -4
- data/lib/prawn/text/formatted/line_wrap.rb +13 -24
- data/lib/prawn/text/formatted/parser.rb +16 -20
- data/lib/prawn/text/formatted/wrap.rb +2 -7
- data/lib/prawn/utilities.rb +6 -3
- data/lib/prawn/version.rb +1 -1
- data/manual/basic_concepts/basic_concepts.rb +0 -2
- data/manual/basic_concepts/view.rb +1 -1
- data/manual/bounding_box/bounding_box.rb +0 -3
- data/manual/bounding_box/russian_boxes.rb +7 -8
- data/manual/bounding_box/stretchy.rb +0 -1
- data/manual/contents.rb +2 -2
- data/manual/cover.rb +11 -12
- data/manual/document_and_page_options/document_and_page_options.rb +2 -5
- data/manual/document_and_page_options/metadata.rb +10 -10
- data/manual/document_and_page_options/page_size.rb +0 -1
- data/manual/graphics/fill_rules.rb +5 -4
- data/manual/graphics/graphics.rb +0 -3
- data/manual/graphics/lines_and_curves.rb +1 -1
- data/manual/graphics/rotate.rb +0 -2
- data/manual/graphics/scale.rb +4 -2
- data/manual/graphics/soft_masks.rb +0 -1
- data/manual/graphics/stroke_cap.rb +1 -1
- data/manual/graphics/stroke_join.rb +1 -1
- data/manual/graphics/translate.rb +3 -3
- data/manual/graphics/transparency.rb +0 -1
- data/manual/how_to_read_this_manual.rb +0 -1
- data/manual/images/images.rb +0 -3
- data/manual/layout/boxes.rb +5 -5
- data/manual/layout/content.rb +2 -2
- data/manual/layout/layout.rb +0 -3
- data/manual/outline/outline.rb +0 -3
- data/manual/repeatable_content/page_numbering.rb +1 -1
- data/manual/repeatable_content/repeatable_content.rb +0 -3
- data/manual/repeatable_content/repeater.rb +6 -6
- data/manual/security/encryption.rb +0 -2
- data/manual/security/permissions.rb +0 -2
- data/manual/security/security.rb +0 -3
- data/manual/text/alignment.rb +3 -3
- data/manual/text/color.rb +0 -1
- data/manual/text/column_box.rb +0 -1
- data/manual/text/fallback_fonts.rb +2 -2
- data/manual/text/formatted_callbacks.rb +3 -2
- data/manual/text/paragraph_indentation.rb +2 -3
- data/manual/text/registering_families.rb +13 -9
- data/manual/text/rotation.rb +0 -1
- data/manual/text/text.rb +0 -3
- data/manual/text/text_box_overflow.rb +7 -5
- data/manual/text/utf8.rb +1 -1
- data/manual/text/win_ansi_charset.rb +2 -2
- data/prawn.gemspec +4 -4
- data/spec/acceptance/png.rb +6 -7
- data/spec/annotations_spec.rb +21 -28
- data/spec/bounding_box_spec.rb +100 -109
- data/spec/column_box_spec.rb +26 -32
- data/spec/destinations_spec.rb +2 -4
- data/spec/document_spec.rb +145 -151
- data/spec/extensions/mocha.rb +0 -1
- data/spec/font_metric_cache_spec.rb +7 -7
- data/spec/font_spec.rb +103 -102
- data/spec/formatted_text_arranger_spec.rb +76 -74
- data/spec/formatted_text_box_spec.rb +170 -159
- data/spec/formatted_text_fragment_spec.rb +57 -56
- data/spec/graphics_spec.rb +158 -175
- data/spec/grid_spec.rb +28 -29
- data/spec/image_handler_spec.rb +4 -5
- data/spec/images_spec.rb +50 -36
- data/spec/inline_formatted_text_parser_spec.rb +397 -393
- data/spec/jpg_spec.rb +4 -6
- data/spec/line_wrap_spec.rb +54 -55
- data/spec/measurement_units_spec.rb +12 -15
- data/spec/outline_spec.rb +77 -98
- data/spec/png_spec.rb +55 -65
- data/spec/reference_spec.rb +3 -3
- data/spec/repeater_spec.rb +20 -26
- data/spec/security_spec.rb +42 -49
- data/spec/soft_mask_spec.rb +4 -5
- data/spec/span_spec.rb +5 -6
- data/spec/spec_helper.rb +2 -4
- data/spec/stamp_spec.rb +41 -22
- data/spec/stroke_styles_spec.rb +36 -39
- data/spec/text_at_spec.rb +28 -29
- data/spec/text_box_spec.rb +160 -165
- data/spec/text_rendering_mode_spec.rb +9 -9
- data/spec/text_spacing_spec.rb +13 -13
- data/spec/text_spec.rb +116 -124
- data/spec/text_with_inline_formatting_spec.rb +5 -5
- data/spec/transparency_spec.rb +20 -20
- data/spec/view_spec.rb +0 -1
- metadata +7 -7
data/lib/prawn/outline.rb
CHANGED
@@ -101,8 +101,8 @@ module Prawn
|
|
101
101
|
#
|
102
102
|
def add_subsection_to(title, position = :last, &block)
|
103
103
|
@parent = items[title]
|
104
|
-
|
105
|
-
|
104
|
+
fail Prawn::Errors::UnknownOutlineTitle,
|
105
|
+
"\n No outline item with title: '#{title}' exists in the outline tree" unless @parent
|
106
106
|
@prev = position == :first ? nil : @parent.data.last
|
107
107
|
nxt = position == :first ? @parent.data.first : nil
|
108
108
|
insert_section(nxt, &block)
|
@@ -131,8 +131,8 @@ module Prawn
|
|
131
131
|
#
|
132
132
|
def insert_section_after(title, &block)
|
133
133
|
@prev = items[title]
|
134
|
-
|
135
|
-
|
134
|
+
fail Prawn::Errors::UnknownOutlineTitle,
|
135
|
+
"\n No outline item with title: '#{title}' exists in the outline tree" unless @prev
|
136
136
|
@parent = @prev.data.parent
|
137
137
|
nxt = @prev.data.next
|
138
138
|
insert_section(nxt, &block)
|
@@ -195,8 +195,8 @@ module Prawn
|
|
195
195
|
if options[:title]
|
196
196
|
title = options[:title]
|
197
197
|
else
|
198
|
-
|
199
|
-
|
198
|
+
fail Prawn::Errors::RequiredOption,
|
199
|
+
"\nTitle is a required option for page"
|
200
200
|
end
|
201
201
|
add_outline_item(title, options)
|
202
202
|
end
|
data/lib/prawn/repeater.rb
CHANGED
@@ -9,7 +9,6 @@
|
|
9
9
|
# This is free software. Please see the LICENSE and COPYING files for details.
|
10
10
|
|
11
11
|
module Prawn
|
12
|
-
|
13
12
|
class Document
|
14
13
|
# A list of all repeaters in the document.
|
15
14
|
# See Document#repeat for details
|
@@ -75,7 +74,7 @@ module Prawn
|
|
75
74
|
#
|
76
75
|
# end
|
77
76
|
#
|
78
|
-
def repeat(page_filter, options={}, &block)
|
77
|
+
def repeat(page_filter, options = {}, &block)
|
79
78
|
repeaters << Prawn::Repeater.new(self, page_filter, !!options[:dynamic], &block)
|
80
79
|
end
|
81
80
|
end
|
@@ -117,8 +116,5 @@ module Prawn
|
|
117
116
|
end
|
118
117
|
end
|
119
118
|
end
|
120
|
-
|
121
119
|
end
|
122
120
|
end
|
123
|
-
|
124
|
-
|
data/lib/prawn/security.rb
CHANGED
@@ -14,11 +14,9 @@ require_relative 'security/arcfour'
|
|
14
14
|
|
15
15
|
module Prawn
|
16
16
|
class Document
|
17
|
-
|
18
17
|
# Implements PDF encryption (password protection and permissions) as
|
19
18
|
# specified in the PDF Reference, version 1.3, section 3.5 "Encryption".
|
20
19
|
module Security
|
21
|
-
|
22
20
|
# @group Experimental API
|
23
21
|
|
24
22
|
# Encrypts the document, to protect confidential data or control
|
@@ -89,9 +87,9 @@ module Prawn
|
|
89
87
|
# not a limitation of Prawn, but is rather a built-in limitation of the
|
90
88
|
# PDF format.
|
91
89
|
#
|
92
|
-
def encrypt_document(options={})
|
90
|
+
def encrypt_document(options = {})
|
93
91
|
Prawn.verify_options [:user_password, :owner_password, :permissions],
|
94
|
-
|
92
|
+
options
|
95
93
|
@user_password = options.delete(:user_password) || ""
|
96
94
|
|
97
95
|
@owner_password = options.delete(:owner_password) || @user_password
|
@@ -113,8 +111,8 @@ module Prawn
|
|
113
111
|
# See Algorithm 3.1.
|
114
112
|
def self.encrypt_string(str, key, id, gen)
|
115
113
|
# Convert ID and Gen number into little-endian truncated byte strings
|
116
|
-
id = [id].pack('V')[0,3]
|
117
|
-
gen = [gen].pack('V')[0,2]
|
114
|
+
id = [id].pack('V')[0, 3]
|
115
|
+
gen = [gen].pack('V')[0, 2]
|
118
116
|
extended_key = "#{key}#{id}#{gen}"
|
119
117
|
|
120
118
|
# Compute the RC4 key from the extended key and perform the encryption
|
@@ -142,12 +140,12 @@ module Prawn
|
|
142
140
|
|
143
141
|
FullPermissions = 0b1111_1111_1111_1111_1111_1111_1111_1111
|
144
142
|
|
145
|
-
def permissions=(perms={})
|
143
|
+
def permissions=(perms = {})
|
146
144
|
@permissions ||= FullPermissions
|
147
145
|
perms.each do |key, value|
|
148
146
|
unless PermissionsBits[key]
|
149
|
-
|
150
|
-
PermissionsBits.keys.map
|
147
|
+
fail ArgumentError, "Unknown permission :#{key}. Valid options: " +
|
148
|
+
PermissionsBits.keys.map(&:inspect).join(", ")
|
151
149
|
end
|
152
150
|
|
153
151
|
# 0-based bit number, from LSB
|
@@ -167,7 +165,7 @@ module Prawn
|
|
167
165
|
|
168
166
|
PasswordPadding =
|
169
167
|
"28BF4E5E4E758A4164004E56FFFA01082E2E00B6D0683E802F0CA9FE6453697A".
|
170
|
-
scan(/../).map{|x| x.to_i(16)}.pack("c*")
|
168
|
+
scan(/../).map{ |x| x.to_i(16) }.pack("c*")
|
171
169
|
|
172
170
|
# Pads or truncates a password to 32 bytes as per Alg 3.2.
|
173
171
|
def pad_password(password)
|
@@ -197,9 +195,7 @@ module Prawn
|
|
197
195
|
def user_password_hash
|
198
196
|
Arcfour.new(user_encryption_key).encrypt(PasswordPadding)
|
199
197
|
end
|
200
|
-
|
201
198
|
end
|
202
|
-
|
203
199
|
end
|
204
200
|
end
|
205
201
|
|
@@ -213,11 +209,11 @@ module PDF
|
|
213
209
|
# from the indirect object referencing obj.
|
214
210
|
#
|
215
211
|
# @private
|
216
|
-
def EncryptedPdfObject(obj, key, id, gen, in_content_stream=false)
|
212
|
+
def EncryptedPdfObject(obj, key, id, gen, in_content_stream = false)
|
217
213
|
case obj
|
218
214
|
when Array
|
219
215
|
"[" << obj.map { |e|
|
220
|
-
|
216
|
+
EncryptedPdfObject(e, key, id, gen, in_content_stream)
|
221
217
|
}.join(' ') << "]"
|
222
218
|
when LiteralString
|
223
219
|
obj = ByteString.new(Prawn::Document::Security.encrypt_string(obj, key, id, gen)).gsub(/[\\\n\(\)]/) { |m| "\\#{m}" }
|
@@ -233,13 +229,12 @@ module PDF
|
|
233
229
|
in_content_stream)
|
234
230
|
when ::Hash
|
235
231
|
output = "<< "
|
236
|
-
obj.each do |k,v|
|
232
|
+
obj.each do |k, v|
|
237
233
|
unless String === k || Symbol === k
|
238
|
-
|
239
|
-
|
234
|
+
fail PDF::Core::Errors::FailedObjectConversion,
|
235
|
+
"A PDF Dictionary must be keyed by names"
|
240
236
|
end
|
241
|
-
output << PdfObject(k.to_sym, in_content_stream) << " " <<
|
242
|
-
EncryptedPdfObject(v, key, id, gen, in_content_stream) << "\n"
|
237
|
+
output << PdfObject(k.to_sym, in_content_stream) << " " << EncryptedPdfObject(v, key, id, gen, in_content_stream) << "\n"
|
243
238
|
end
|
244
239
|
output << ">>"
|
245
240
|
when NameTree::Value
|
@@ -252,7 +247,6 @@ module PDF
|
|
252
247
|
end
|
253
248
|
end
|
254
249
|
|
255
|
-
|
256
250
|
# @private
|
257
251
|
class Stream
|
258
252
|
def encrypted_object(key, id, gen)
|
@@ -266,23 +260,21 @@ module PDF
|
|
266
260
|
|
267
261
|
# @private
|
268
262
|
class Reference
|
269
|
-
|
270
263
|
# Returns the object definition for the object this references, keyed from
|
271
264
|
# +key+.
|
272
265
|
def encrypted_object(key)
|
273
266
|
@on_encode.call(self) if @on_encode
|
274
267
|
|
275
268
|
output = "#{@identifier} #{gen} obj\n"
|
276
|
-
|
269
|
+
if @stream.empty?
|
270
|
+
output << PDF::Core::EncryptedPdfObject(data, key, @identifier, gen) << "\n"
|
271
|
+
else
|
277
272
|
output << PDF::Core::EncryptedPdfObject(data.merge(@stream.data), key, @identifier, gen) << "\n" <<
|
278
273
|
@stream.encrypted_object(key, @identifier, gen)
|
279
|
-
else
|
280
|
-
output << PDF::Core::EncryptedPdfObject(data, key, @identifier, gen) << "\n"
|
281
274
|
end
|
282
275
|
|
283
276
|
output << "endobj\n"
|
284
277
|
end
|
285
|
-
|
286
278
|
end
|
287
279
|
end
|
288
280
|
end
|
data/lib/prawn/soft_mask.rb
CHANGED
@@ -8,7 +8,6 @@
|
|
8
8
|
#
|
9
9
|
|
10
10
|
module Prawn
|
11
|
-
|
12
11
|
# The Prawn::SoftMask module is used to create arbitrary transparency in
|
13
12
|
# document. Using a soft mask allows creating more visually rich documents.
|
14
13
|
#
|
@@ -31,30 +30,30 @@ module Prawn
|
|
31
30
|
def soft_mask(&block)
|
32
31
|
renderer.min_version(1.4)
|
33
32
|
|
34
|
-
group_attrs = ref!(
|
33
|
+
group_attrs = ref!(
|
35
34
|
:Type => :Group,
|
36
35
|
:S => :Transparency,
|
37
36
|
:CS => :DeviceRGB,
|
38
37
|
:I => false,
|
39
38
|
:K => false
|
40
|
-
|
39
|
+
)
|
41
40
|
|
42
|
-
group = ref!(
|
41
|
+
group = ref!(
|
43
42
|
:Type => :XObject,
|
44
43
|
:Subtype => :Form,
|
45
44
|
:BBox => state.page.dimensions,
|
46
|
-
:Group => group_attrs
|
47
|
-
|
45
|
+
:Group => group_attrs
|
46
|
+
)
|
48
47
|
|
49
48
|
state.page.stamp_stream(group, &block)
|
50
49
|
|
51
|
-
mask = ref!(
|
50
|
+
mask = ref!(
|
52
51
|
:Type => :Mask,
|
53
52
|
:S => :Luminosity,
|
54
53
|
:G => group
|
55
|
-
|
54
|
+
)
|
56
55
|
|
57
|
-
g_state = ref!(
|
56
|
+
g_state = ref!(
|
58
57
|
:Type => :ExtGState,
|
59
58
|
:SMask => mask,
|
60
59
|
|
@@ -63,13 +62,13 @@ module Prawn
|
|
63
62
|
:OP => false,
|
64
63
|
:op => false,
|
65
64
|
:OPM => 1,
|
66
|
-
:SA => true
|
67
|
-
|
65
|
+
:SA => true
|
66
|
+
)
|
68
67
|
|
69
68
|
registry_key = {
|
70
69
|
:bbox => state.page.dimensions,
|
71
70
|
:mask => [group.stream.filters.normalized, group.stream.filtered_stream],
|
72
|
-
:page => state.page_count
|
71
|
+
:page => state.page_count
|
73
72
|
}.hash
|
74
73
|
|
75
74
|
if soft_mask_registry[registry_key]
|
data/lib/prawn/stamp.rb
CHANGED
@@ -6,9 +6,7 @@
|
|
6
6
|
#
|
7
7
|
# This is free software. Please see the LICENSE and COPYING files for details.
|
8
8
|
#
|
9
|
-
|
10
9
|
module Prawn
|
11
|
-
|
12
10
|
# The Prawn::Stamp module is used to create content that will be
|
13
11
|
# included multiple times in a document. Using a stamp has three
|
14
12
|
# advantages over creating content anew each time it is placed on
|
@@ -27,7 +25,6 @@ module Prawn
|
|
27
25
|
# pdf.stamp("my_stamp")
|
28
26
|
#
|
29
27
|
module Stamp
|
30
|
-
|
31
28
|
# @group Stable API
|
32
29
|
|
33
30
|
# Renders the stamp named <tt>name</tt> to the page
|
@@ -45,6 +42,7 @@ module Prawn
|
|
45
42
|
def stamp(name)
|
46
43
|
dictionary_name, dictionary = stamp_dictionary(name)
|
47
44
|
renderer.add_content "/#{dictionary_name} Do"
|
45
|
+
update_annotation_references dictionary.data[:Annots]
|
48
46
|
state.page.xobjects.merge!(dictionary_name => dictionary)
|
49
47
|
end
|
50
48
|
|
@@ -94,9 +92,9 @@ module Prawn
|
|
94
92
|
end
|
95
93
|
|
96
94
|
def stamp_dictionary(name)
|
97
|
-
|
95
|
+
fail Prawn::Errors::InvalidName if name.empty?
|
98
96
|
if stamp_dictionary_registry[name].nil?
|
99
|
-
|
97
|
+
fail Prawn::Errors::UndefinedObjectName
|
100
98
|
end
|
101
99
|
|
102
100
|
dict = stamp_dictionary_registry[name]
|
@@ -107,8 +105,8 @@ module Prawn
|
|
107
105
|
end
|
108
106
|
|
109
107
|
def create_stamp_dictionary(name)
|
110
|
-
|
111
|
-
|
108
|
+
fail Prawn::Errors::InvalidName if name.empty?
|
109
|
+
fail Prawn::Errors::NameTaken unless stamp_dictionary_registry[name].nil?
|
112
110
|
# BBox origin is the lower left margin of the page, so we need
|
113
111
|
# it to be the full dimension of the page, or else things that
|
114
112
|
# should appear near the top or right margin are invisible
|
@@ -124,6 +122,17 @@ module Prawn
|
|
124
122
|
dictionary
|
125
123
|
end
|
126
124
|
|
125
|
+
# Referencing annotations from a stamp XObject doesn't result
|
126
|
+
# in a working link. Instead, the references must be appended
|
127
|
+
# to the /Annot dictionary of the object that contains the
|
128
|
+
# call to the stamp object.
|
129
|
+
def update_annotation_references(annots)
|
130
|
+
if annots && annots.any?
|
131
|
+
state.page.dictionary.data[:Annots] ||= []
|
132
|
+
state.page.dictionary.data[:Annots] |= annots
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
127
136
|
def freeze_stamp_graphics
|
128
137
|
update_colors
|
129
138
|
write_line_width
|
@@ -131,6 +140,5 @@ module Prawn
|
|
131
140
|
write_stroke_join_style
|
132
141
|
write_stroke_dash
|
133
142
|
end
|
134
|
-
|
135
143
|
end
|
136
144
|
end
|
data/lib/prawn/text.rb
CHANGED
@@ -15,7 +15,6 @@ require_relative "text/box"
|
|
15
15
|
|
16
16
|
module Prawn
|
17
17
|
module Text
|
18
|
-
|
19
18
|
include PDF::Core::Text
|
20
19
|
include Prawn::Text::Formatted
|
21
20
|
|
@@ -152,7 +151,7 @@ module Prawn
|
|
152
151
|
# Raises <tt>Prawn::Errrors::CannotFit</tt> if not wide enough to print
|
153
152
|
# any text
|
154
153
|
#
|
155
|
-
def text(string, options={})
|
154
|
+
def text(string, options = {})
|
156
155
|
return false if string.nil?
|
157
156
|
# we modify the options. don't change the user's hash
|
158
157
|
options = options.dup
|
@@ -188,7 +187,7 @@ module Prawn
|
|
188
187
|
#
|
189
188
|
# Same as for #text
|
190
189
|
#
|
191
|
-
def formatted_text(array, options={})
|
190
|
+
def formatted_text(array, options = {})
|
192
191
|
options = inspect_options_for_text(options.dup)
|
193
192
|
|
194
193
|
if color = options.delete(:color)
|
@@ -288,17 +287,17 @@ module Prawn
|
|
288
287
|
#
|
289
288
|
def draw_text!(text, options)
|
290
289
|
unless font.unicode? || font.class.hide_m17n_warning || text.ascii_only?
|
291
|
-
warn "PDF's built-in fonts have very limited support for "
|
292
|
-
"internationalized text.\nIf you need full UTF-8 support, "
|
293
|
-
"consider using a TTF font instead.\n\nTo disable this "
|
294
|
-
"warning, add the following line to your code:\n"
|
290
|
+
warn "PDF's built-in fonts have very limited support for " \
|
291
|
+
"internationalized text.\nIf you need full UTF-8 support, " \
|
292
|
+
"consider using a TTF font instead.\n\nTo disable this " \
|
293
|
+
"warning, add the following line to your code:\n" \
|
295
294
|
"Prawn::Font::AFM.hide_m17n_warning = true\n"
|
296
295
|
|
297
296
|
font.class.hide_m17n_warning = true
|
298
297
|
end
|
299
298
|
|
300
|
-
x,y = map_to_absolute(options[:at])
|
301
|
-
add_text_content(text,x,y,options)
|
299
|
+
x, y = map_to_absolute(options[:at])
|
300
|
+
add_text_content(text, x, y, options)
|
302
301
|
end
|
303
302
|
|
304
303
|
# Gets height of text in PDF points.
|
@@ -317,7 +316,7 @@ module Prawn
|
|
317
316
|
# Raises <tt>Prawn::Errrors::CannotFit</tt> if not wide enough to print
|
318
317
|
# any text
|
319
318
|
#
|
320
|
-
def height_of(string, options={})
|
319
|
+
def height_of(string, options = {})
|
321
320
|
height_of_formatted([{ :text => string }], options)
|
322
321
|
end
|
323
322
|
|
@@ -331,15 +330,16 @@ module Prawn
|
|
331
330
|
# :size => 24,
|
332
331
|
# :styles => [:bold, :italic] }])
|
333
332
|
#
|
334
|
-
def height_of_formatted(array, options={})
|
333
|
+
def height_of_formatted(array, options = {})
|
335
334
|
if options[:indent_paragraphs]
|
336
|
-
|
335
|
+
fail NotImplementedError, ":indent_paragraphs option not available" \
|
337
336
|
"with height_of"
|
338
337
|
end
|
339
338
|
process_final_gap_option(options)
|
340
|
-
box = Text::Formatted::Box.new(
|
341
|
-
|
342
|
-
|
339
|
+
box = Text::Formatted::Box.new(
|
340
|
+
array,
|
341
|
+
options.merge(:height => 100000000, :document => self)
|
342
|
+
)
|
343
343
|
box.render(:dry_run => true)
|
344
344
|
|
345
345
|
height = box.height
|
@@ -359,8 +359,11 @@ module Prawn
|
|
359
359
|
end
|
360
360
|
|
361
361
|
def draw_indented_formatted_line(string, options)
|
362
|
-
|
363
|
-
|
362
|
+
if options.fetch(:direction, text_direction) == :ltr
|
363
|
+
gap = [@indent_paragraphs, 0]
|
364
|
+
else
|
365
|
+
gap = [0, @indent_paragraphs]
|
366
|
+
end
|
364
367
|
|
365
368
|
indent(*gap) do
|
366
369
|
fill_formatted_text_box(string, options.dup.merge(:single_line => true))
|
@@ -392,9 +395,9 @@ module Prawn
|
|
392
395
|
|
393
396
|
def inspect_options_for_draw_text(options)
|
394
397
|
if options[:at].nil?
|
395
|
-
|
398
|
+
fail ArgumentError, "The :at option is required for draw_text"
|
396
399
|
elsif options[:align]
|
397
|
-
|
400
|
+
fail ArgumentError, "The :align option does not work with draw_text"
|
398
401
|
end
|
399
402
|
if options[:kerning].nil? then
|
400
403
|
options[:kerning] = default_kerning?
|
@@ -406,7 +409,7 @@ module Prawn
|
|
406
409
|
|
407
410
|
def inspect_options_for_text(options)
|
408
411
|
if options[:at]
|
409
|
-
|
412
|
+
fail ArgumentError, ":at is no longer a valid option with text." \
|
410
413
|
"use draw_text or text_box instead"
|
411
414
|
end
|
412
415
|
process_final_gap_option(options)
|
data/lib/prawn/text/box.rb
CHANGED
@@ -101,7 +101,7 @@ module Prawn
|
|
101
101
|
# Raises <tt>Prawn::Errors::CannotFit</tt> if not wide enough to print
|
102
102
|
# any text
|
103
103
|
#
|
104
|
-
def text_box(string, options={})
|
104
|
+
def text_box(string, options = {})
|
105
105
|
options = options.dup
|
106
106
|
options[:document] = self
|
107
107
|
|
@@ -125,17 +125,14 @@ module Prawn
|
|
125
125
|
# consumed by the printed text
|
126
126
|
#
|
127
127
|
class Box < Prawn::Text::Formatted::Box
|
128
|
-
|
129
|
-
def initialize(string, options={})
|
128
|
+
def initialize(string, options = {})
|
130
129
|
super([{ :text => string }], options)
|
131
130
|
end
|
132
131
|
|
133
|
-
def render(flags={})
|
132
|
+
def render(flags = {})
|
134
133
|
leftover = super(flags)
|
135
134
|
leftover.collect { |hash| hash[:text] }.join
|
136
135
|
end
|
137
|
-
|
138
136
|
end
|
139
|
-
|
140
137
|
end
|
141
138
|
end
|