prawn-core 0.5.0.1 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +1 -1
- data/README +21 -6
- data/Rakefile +1 -1
- data/examples/bounding_box/bounding_boxes.rb +1 -2
- data/examples/bounding_box/indentation.rb +34 -0
- data/examples/bounding_box/russian_boxes.rb +1 -2
- data/examples/column_box/column_box_example.rb +1 -2
- data/examples/example_helper.rb +3 -0
- data/examples/general/background.rb +11 -8
- data/examples/general/canvas.rb +1 -2
- data/examples/general/measurement_units.rb +1 -2
- data/examples/general/metadata-info.rb +1 -2
- data/examples/general/multi_page_layout.rb +1 -2
- data/examples/general/page_geometry.rb +1 -2
- data/examples/graphics/basic_images.rb +1 -2
- data/examples/graphics/cmyk.rb +1 -2
- data/examples/graphics/curves.rb +1 -2
- data/examples/graphics/hexagon.rb +1 -2
- data/examples/graphics/image_fit.rb +1 -2
- data/examples/graphics/image_flow.rb +1 -2
- data/examples/graphics/image_position.rb +1 -2
- data/examples/graphics/line.rb +1 -2
- data/examples/graphics/png_types.rb +1 -2
- data/examples/graphics/polygons.rb +1 -2
- data/examples/graphics/remote_images.rb +2 -2
- data/examples/graphics/ruport_style_helpers.rb +1 -2
- data/examples/graphics/stroke_bounds.rb +1 -2
- data/examples/m17n/chinese_text_wrapping.rb +5 -6
- data/examples/m17n/euro.rb +1 -2
- data/examples/m17n/sjis.rb +1 -2
- data/examples/m17n/utf8.rb +1 -2
- data/examples/m17n/win_ansi_charset.rb +1 -2
- data/examples/text/alignment.rb +1 -2
- data/examples/text/dfont.rb +1 -2
- data/examples/text/family_based_styling.rb +1 -2
- data/examples/text/font_calculations.rb +1 -2
- data/examples/text/font_size.rb +1 -2
- data/examples/text/kerning.rb +1 -2
- data/examples/text/simple_text.rb +1 -2
- data/examples/text/simple_text_ttf.rb +1 -2
- data/examples/text/span.rb +1 -2
- data/examples/text/text_box.rb +3 -4
- data/examples/text/text_flow.rb +2 -3
- data/lib/prawn/core.rb +12 -5
- data/lib/prawn/document/annotations.rb +15 -14
- data/lib/prawn/document/bounding_box.rb +36 -28
- data/lib/prawn/document/column_box.rb +15 -0
- data/lib/prawn/document/destinations.rb +10 -0
- data/lib/prawn/document/internals.rb +4 -0
- data/lib/prawn/document/page_geometry.rb +7 -3
- data/lib/prawn/document/text.rb +6 -15
- data/lib/prawn/document.rb +21 -2
- data/lib/prawn/errors.rb +2 -2
- data/lib/prawn/font/dfont.rb +3 -0
- data/lib/prawn/font/ttf.rb +2 -0
- data/lib/prawn/font.rb +2 -0
- data/lib/prawn/graphics.rb +0 -1
- data/lib/prawn/images/jpg.rb +2 -1
- data/lib/prawn/images/png.rb +2 -0
- data/spec/bounding_box_spec.rb +35 -0
- data/spec/font_spec.rb +1 -2
- metadata +4 -2
@@ -11,16 +11,14 @@ require 'prawn/literal_string'
|
|
11
11
|
module Prawn
|
12
12
|
class Document
|
13
13
|
|
14
|
-
# Provides very low-level support for annotations.
|
15
|
-
#
|
16
|
-
#
|
17
|
-
# being developed by Jamis Buck to be included in a Prawn release soon.
|
18
|
-
#
|
19
|
-
# Feedback is welcome!
|
20
|
-
#
|
14
|
+
# Provides very low-level support for annotations. These extensions are
|
15
|
+
# mainly for use by prawn-format, so be sure to check that out if all
|
16
|
+
# you need is basic internal or external links.
|
21
17
|
module Annotations
|
18
|
+
|
22
19
|
# Adds a new annotation (section 8.4 in PDF spec) to the current page.
|
23
20
|
# +options+ must be a Hash describing the annotation.
|
21
|
+
#
|
24
22
|
def annotate(options)
|
25
23
|
@current_page.data[:Annots] ||= []
|
26
24
|
options = sanitize_annotation_hash(options)
|
@@ -31,6 +29,7 @@ module Prawn
|
|
31
29
|
# A convenience method for creating Text annotations. +rect+ must be an array
|
32
30
|
# of four numbers, describing the bounds of the annotation. +contents+ should
|
33
31
|
# be a string, to be shown when the annotation is activated.
|
32
|
+
#
|
34
33
|
def text_annotation(rect, contents, options={})
|
35
34
|
options = options.merge(:Subtype => :Text, :Rect => rect, :Contents => contents)
|
36
35
|
annotate(options)
|
@@ -42,6 +41,7 @@ module Prawn
|
|
42
41
|
# string that has been recorded in the document's Dests tree), or :A (describing
|
43
42
|
# an action to perform on clicking the link), or :PA (for describing a URL to
|
44
43
|
# link to).
|
44
|
+
#
|
45
45
|
def link_annotation(rect, options={})
|
46
46
|
options = options.merge(:Subtype => :Link, :Rect => rect)
|
47
47
|
annotate(options)
|
@@ -49,15 +49,16 @@ module Prawn
|
|
49
49
|
|
50
50
|
private
|
51
51
|
|
52
|
-
|
53
|
-
|
52
|
+
def sanitize_annotation_hash(options)
|
53
|
+
options = options.merge(:Type => :Annot)
|
54
54
|
|
55
|
-
|
56
|
-
|
57
|
-
end
|
58
|
-
|
59
|
-
options
|
55
|
+
if options[:Dest].is_a?(String)
|
56
|
+
options[:Dest] = Prawn::LiteralString.new(options[:Dest])
|
60
57
|
end
|
58
|
+
|
59
|
+
options
|
60
|
+
end
|
61
|
+
|
61
62
|
end
|
62
63
|
end
|
63
64
|
end
|
@@ -14,8 +14,7 @@ module Prawn
|
|
14
14
|
#
|
15
15
|
# A bounding box serves two important purposes:
|
16
16
|
# * Provide bounds for flowing text, starting at a given point
|
17
|
-
# * Translate the origin (0,0) for graphics primitives
|
18
|
-
# of simplifying coordinate math.
|
17
|
+
# * Translate the origin (0,0) for graphics primitives
|
19
18
|
#
|
20
19
|
# ==Positioning
|
21
20
|
#
|
@@ -25,20 +24,20 @@ module Prawn
|
|
25
24
|
#
|
26
25
|
# Usage:
|
27
26
|
#
|
28
|
-
# * Bounding box 100pt x 100pt in the
|
29
|
-
# box:
|
27
|
+
# * Bounding box 100pt x 100pt in the absolute bottom left of the
|
28
|
+
# containing box:
|
30
29
|
#
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
30
|
+
# pdf.bounding_box([0,100], :width => 100, :height => 100)
|
31
|
+
# stroke_bounds
|
32
|
+
# end
|
34
33
|
#
|
35
34
|
# * Bounding box 200pt x 400pt high in the center of the page:
|
36
35
|
#
|
37
|
-
#
|
38
|
-
#
|
39
|
-
#
|
40
|
-
#
|
41
|
-
#
|
36
|
+
# x_pos = ((bounds.width / 2) - 150)
|
37
|
+
# y_pos = ((bounds.height / 2) + 200)
|
38
|
+
# pdf.bounding_box([x_pos, y_pos], :width => 300, :height => 400) do
|
39
|
+
# stroke_bounds
|
40
|
+
# end
|
42
41
|
#
|
43
42
|
# ==Flowing Text
|
44
43
|
#
|
@@ -57,6 +56,10 @@ module Prawn
|
|
57
56
|
# "and return to the margin_box"
|
58
57
|
# end
|
59
58
|
#
|
59
|
+
# Note that this is a low level tool and is designed primarily for
|
60
|
+
# building other abstractions. If you just want to flow some text on
|
61
|
+
# a page, look into span() or text_box()
|
62
|
+
#
|
60
63
|
# ==Translating Coordinates
|
61
64
|
#
|
62
65
|
# When translating coordinates, the idea is to allow the user to draw
|
@@ -101,7 +104,7 @@ module Prawn
|
|
101
104
|
#
|
102
105
|
# ==Nesting Bounding Boxes
|
103
106
|
#
|
104
|
-
#
|
107
|
+
# At the top level, bounding boxes are specified relative to the document's
|
105
108
|
# margin_box (which is itself a bounding box). You can also nest bounding
|
106
109
|
# boxes, allowing you to build components which are relative to each other
|
107
110
|
#
|
@@ -118,8 +121,8 @@ module Prawn
|
|
118
121
|
#
|
119
122
|
# ==Stretchyness
|
120
123
|
#
|
121
|
-
# If you do not specify a height to a
|
122
|
-
# and
|
124
|
+
# If you do not specify a height to a bounding box, it will become stretchy
|
125
|
+
# and its height will be calculated according to the last drawing position
|
123
126
|
# within the bounding box:
|
124
127
|
#
|
125
128
|
# pdf.bounding_box([100,400], :width => 400) do
|
@@ -184,7 +187,12 @@ module Prawn
|
|
184
187
|
|
185
188
|
@bounding_box = parent_box
|
186
189
|
end
|
187
|
-
|
190
|
+
|
191
|
+
# Low level layout helper that simplifies coordinate math.
|
192
|
+
#
|
193
|
+
# See Prawn::Document#bounding_box for a description of what this class
|
194
|
+
# is used for.
|
195
|
+
#
|
188
196
|
class BoundingBox
|
189
197
|
|
190
198
|
def initialize(parent, point, options={}) #:nodoc:
|
@@ -210,6 +218,18 @@ module Prawn
|
|
210
218
|
0
|
211
219
|
end
|
212
220
|
|
221
|
+
|
222
|
+
# Temporarily adjust the @x coordinate to allow for left_padding
|
223
|
+
#
|
224
|
+
def indent(left_padding, &block)
|
225
|
+
@x += left_padding
|
226
|
+
@width -= left_padding
|
227
|
+
yield
|
228
|
+
ensure
|
229
|
+
@x -= left_padding
|
230
|
+
@width += left_padding
|
231
|
+
end
|
232
|
+
|
213
233
|
# Relative right x-coordinate of the bounding box. (Equal to the box width)
|
214
234
|
#
|
215
235
|
# Example, position some text 3 pts from the right of the containing box:
|
@@ -359,18 +379,6 @@ module Prawn
|
|
359
379
|
!@height
|
360
380
|
end
|
361
381
|
|
362
|
-
def left_side
|
363
|
-
absolute_left
|
364
|
-
end
|
365
|
-
|
366
|
-
def right_side
|
367
|
-
absolute_right
|
368
|
-
end
|
369
|
-
|
370
|
-
def move_past_bottom
|
371
|
-
@parent.start_new_page
|
372
|
-
end
|
373
|
-
|
374
382
|
end
|
375
383
|
|
376
384
|
end
|
@@ -40,6 +40,21 @@ module Prawn
|
|
40
40
|
|
41
41
|
@bounding_box = parent_box
|
42
42
|
end
|
43
|
+
|
44
|
+
# Template methods to support ColumnBox extensions
|
45
|
+
class BoundingBox
|
46
|
+
def left_side
|
47
|
+
absolute_left
|
48
|
+
end
|
49
|
+
|
50
|
+
def right_side
|
51
|
+
absolute_right
|
52
|
+
end
|
53
|
+
|
54
|
+
def move_past_bottom
|
55
|
+
@parent.start_new_page
|
56
|
+
end
|
57
|
+
end
|
43
58
|
|
44
59
|
class ColumnBox < BoundingBox
|
45
60
|
|
@@ -17,6 +17,7 @@ module Prawn
|
|
17
17
|
# The Dests name tree in the Name dictionary (see Prawn::Document::Internal#names).
|
18
18
|
# This name tree is used to store named destinations (PDF spec 8.2.1).
|
19
19
|
# (For more on name trees, see section 3.8.4 in the PDF spec.)
|
20
|
+
#
|
20
21
|
def dests
|
21
22
|
names.data[:Dests] ||= ref(Prawn::NameTree::Node.new(self, NAME_TREE_CHILDREN_LIMIT))
|
22
23
|
end
|
@@ -24,6 +25,7 @@ module Prawn
|
|
24
25
|
# Adds a new destination to the dests name tree (see #dests). The
|
25
26
|
# +reference+ parameter will be converted into a Prawn::Reference if
|
26
27
|
# it is not already one.
|
28
|
+
#
|
27
29
|
def add_dest(name, reference)
|
28
30
|
reference = ref(reference) unless reference.is_a?(Prawn::Reference)
|
29
31
|
dests.data.add(name, reference)
|
@@ -31,48 +33,56 @@ module Prawn
|
|
31
33
|
|
32
34
|
# Return a Dest specification for a specific location (and optional zoom
|
33
35
|
# level).
|
36
|
+
#
|
34
37
|
def dest_xyz(left, top, zoom=nil, page=@current_page)
|
35
38
|
[page, :XYZ, left, top, zoom]
|
36
39
|
end
|
37
40
|
|
38
41
|
# Return a Dest specification that will fit the given page into the
|
39
42
|
# viewport.
|
43
|
+
#
|
40
44
|
def dest_fit(page=@current_page)
|
41
45
|
[page, :Fit]
|
42
46
|
end
|
43
47
|
|
44
48
|
# Return a Dest specification that will fit the given page horizontally
|
45
49
|
# into the viewport, aligned vertically at the given top coordinate.
|
50
|
+
#
|
46
51
|
def dest_fit_horizontally(top, page=@current_page)
|
47
52
|
[page, :FitH, top]
|
48
53
|
end
|
49
54
|
|
50
55
|
# Return a Dest specification that will fit the given page vertically
|
51
56
|
# into the viewport, aligned horizontally at the given left coordinate.
|
57
|
+
#
|
52
58
|
def dest_fit_vertically(left, page=@current_page)
|
53
59
|
[page, :FitV, left]
|
54
60
|
end
|
55
61
|
|
56
62
|
# Return a Dest specification that will fit the given rectangle into the
|
57
63
|
# viewport, for the given page.
|
64
|
+
#
|
58
65
|
def dest_fit_rect(left, bottom, right, top, page=@current_page)
|
59
66
|
[page, :FitR, left, bottom, right, top]
|
60
67
|
end
|
61
68
|
|
62
69
|
# Return a Dest specfication that will fit the given page's bounding box
|
63
70
|
# into the viewport.
|
71
|
+
#
|
64
72
|
def dest_fit_bounds(page=@current_page)
|
65
73
|
[page, :FitB]
|
66
74
|
end
|
67
75
|
|
68
76
|
# Same as #dest_fit_horizontally, but works on the page's bounding box
|
69
77
|
# instead of the entire page.
|
78
|
+
#
|
70
79
|
def dest_fit_bounds_horizontally(top, page=@current_page)
|
71
80
|
[page, :FitBH, top]
|
72
81
|
end
|
73
82
|
|
74
83
|
# Same as #dest_fit_vertically, but works on the page's bounding box
|
75
84
|
# instead of the entire page.
|
85
|
+
#
|
76
86
|
def dest_fit_bounds_vertically(left, page=@current_page)
|
77
87
|
[page, :FitBV, left]
|
78
88
|
end
|
@@ -15,6 +15,7 @@ module Prawn
|
|
15
15
|
# are you won't need anything you find here.
|
16
16
|
#
|
17
17
|
module Internals
|
18
|
+
|
18
19
|
# Creates a new Prawn::Reference and adds it to the Document's object
|
19
20
|
# list. The +data+ argument is anything that Prawn::PdfObject() can convert.
|
20
21
|
#
|
@@ -22,6 +23,7 @@ module Prawn
|
|
22
23
|
# out to the PDF document stream. This allows you to do deferred processing
|
23
24
|
# on some references (such as fonts, which you might know all the details
|
24
25
|
# about until the last page of the document is finished).
|
26
|
+
#
|
25
27
|
def ref(data, &block)
|
26
28
|
@objects.push(Prawn::Reference.new(@objects.size + 1, data, &block)).last
|
27
29
|
end
|
@@ -58,6 +60,7 @@ module Prawn
|
|
58
60
|
end
|
59
61
|
|
60
62
|
# The XObject dictionary for the current page
|
63
|
+
#
|
61
64
|
def page_xobjects
|
62
65
|
page_resources[:XObject] ||= {}
|
63
66
|
end
|
@@ -65,6 +68,7 @@ module Prawn
|
|
65
68
|
# The Name dictionary (PDF spec 3.6.3) for this document. It is
|
66
69
|
# lazily initialized, so that documents that do not need a name
|
67
70
|
# dictionary do not incur the additional overhead.
|
71
|
+
#
|
68
72
|
def names
|
69
73
|
@root.data[:Names] ||= ref(:Type => :Names)
|
70
74
|
end
|
@@ -77,8 +77,7 @@ module Prawn
|
|
77
77
|
# LEGAL:: => 612.00 x 1008.00
|
78
78
|
# LETTER:: => 612.00 x 792.00
|
79
79
|
# TABLOID:: => 792.00 x 1224.00
|
80
|
-
|
81
|
-
|
80
|
+
#
|
82
81
|
module PageGeometry
|
83
82
|
|
84
83
|
SIZES = { "4A0" => [4767.87, 6740.79],
|
@@ -132,7 +131,12 @@ module Prawn
|
|
132
131
|
"LETTER" => [612.00, 792.00],
|
133
132
|
"TABLOID" => [792.00, 1224.00] }
|
134
133
|
|
135
|
-
|
134
|
+
|
135
|
+
# Returns the width and height of the current page in PDF points.
|
136
|
+
# Usually, you'll want the dimensions of the bounding_box or
|
137
|
+
# margin_box instead.
|
138
|
+
#
|
139
|
+
def page_dimensions
|
136
140
|
coords = SIZES[page_size] || page_size
|
137
141
|
[0,0] + case(page_layout)
|
138
142
|
when :portrait
|
data/lib/prawn/document/text.rb
CHANGED
@@ -52,7 +52,7 @@ module Prawn
|
|
52
52
|
# == Rotation
|
53
53
|
#
|
54
54
|
# Text can be rotated before it is placed on the canvas by specifying the
|
55
|
-
#
|
55
|
+
# +:rotate+ option with a given angle. Rotation occurs counter-clockwise.
|
56
56
|
#
|
57
57
|
# == Encoding
|
58
58
|
#
|
@@ -73,7 +73,7 @@ module Prawn
|
|
73
73
|
text = text.to_s.dup
|
74
74
|
|
75
75
|
save_font do
|
76
|
-
options = text_options.merge(options)
|
76
|
+
options = @text_options.merge(options)
|
77
77
|
process_text_options(options)
|
78
78
|
|
79
79
|
font.normalize_encoding!(text) unless @skip_encoding
|
@@ -89,21 +89,12 @@ module Prawn
|
|
89
89
|
end
|
90
90
|
end
|
91
91
|
end
|
92
|
-
|
93
|
-
# A hash of configuration options, to be used globally by text().
|
94
|
-
#
|
95
|
-
# pdf.text_options.update(:size => 16, :align => :right)
|
96
|
-
# pdf.text "Hello World" #=> Size 16 w. right alignment
|
97
|
-
#
|
98
|
-
def text_options
|
99
|
-
@text_options ||= {}
|
100
|
-
end
|
101
|
-
|
92
|
+
|
102
93
|
private
|
103
|
-
|
94
|
+
|
104
95
|
def process_text_options(options)
|
105
96
|
Prawn.verify_options [:style, :kerning, :size, :at, :wrap,
|
106
|
-
:
|
97
|
+
:leading, :align, :rotate, :final_gap ], options
|
107
98
|
|
108
99
|
if options[:style]
|
109
100
|
raise "Bad font family" unless font.family
|
@@ -154,7 +145,7 @@ module Prawn
|
|
154
145
|
|
155
146
|
if i < last_gap_before
|
156
147
|
move_text_position(font.line_gap - font.descender)
|
157
|
-
move_text_position(options[:
|
148
|
+
move_text_position(options[:leading]) if options[:leading]
|
158
149
|
end
|
159
150
|
end
|
160
151
|
end
|
data/lib/prawn/document.rb
CHANGED
@@ -17,6 +17,7 @@ require "prawn/document/annotations"
|
|
17
17
|
require "prawn/document/destinations"
|
18
18
|
|
19
19
|
module Prawn
|
20
|
+
|
20
21
|
# The Prawn::Document class is how you start creating a PDF document.
|
21
22
|
#
|
22
23
|
# There are three basic ways you can instantiate PDF Documents in Prawn, they
|
@@ -49,6 +50,7 @@ module Prawn
|
|
49
50
|
# that you want to immediately save or render out.
|
50
51
|
#
|
51
52
|
# See the new and generate methods for further details on the above.
|
53
|
+
#
|
52
54
|
class Document
|
53
55
|
|
54
56
|
include Text
|
@@ -108,6 +110,7 @@ module Prawn
|
|
108
110
|
# <tt>:compress</tt>:: Compresses content streams before rendering them [false]
|
109
111
|
# <tt>:background</tt>:: An image path to be used as background on all pages [nil]
|
110
112
|
# <tt>:info</tt>:: Generic hash allowing for custom metadata properties [nil]
|
113
|
+
# <tt>:text_options</tt>:: A set of default options to be handed to text(). Be careful with this.
|
111
114
|
|
112
115
|
# Additionally, :page_size can be specified as a simple two value array giving
|
113
116
|
# the width and height of the document you need in PDF Points.
|
@@ -153,7 +156,7 @@ module Prawn
|
|
153
156
|
@background = options[:background]
|
154
157
|
@font_size = 12
|
155
158
|
|
156
|
-
text_options
|
159
|
+
@text_options = options[:text_options] || {}
|
157
160
|
|
158
161
|
@margins = { :left => options[:left_margin] || 36,
|
159
162
|
:right => options[:right_margin] || 36,
|
@@ -347,6 +350,21 @@ module Prawn
|
|
347
350
|
yield
|
348
351
|
move_down(y)
|
349
352
|
end
|
353
|
+
|
354
|
+
|
355
|
+
# Indents the specified number of PDF points for the duration of the block
|
356
|
+
#
|
357
|
+
# pdf.text "some text"
|
358
|
+
# pdf.indent(20) do
|
359
|
+
# pdf.text "This is indented 20 points"
|
360
|
+
# end
|
361
|
+
# pdf.text "This starts 20 points left of the above line " +
|
362
|
+
# "and is flush with the first line"
|
363
|
+
#
|
364
|
+
def indent(x, &block)
|
365
|
+
bounds.indent(x, &block)
|
366
|
+
end
|
367
|
+
|
350
368
|
|
351
369
|
def mask(*fields) # :nodoc:
|
352
370
|
# Stores the current state of the named attributes, executes the block, and
|
@@ -389,7 +407,8 @@ module Prawn
|
|
389
407
|
:height => page_dimensions[-1] - (@margins[:top] + @margins[:bottom])
|
390
408
|
)
|
391
409
|
|
392
|
-
# update bounding box if not flowing from the previous page
|
410
|
+
# we must update bounding box if not flowing from the previous page
|
411
|
+
#
|
393
412
|
# FIXME: This may have a bug where the old margin is restored
|
394
413
|
# when the bounding box exits.
|
395
414
|
@bounding_box = @margin_box if old_margin_box == @bounding_box
|
data/lib/prawn/errors.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
2
|
+
#
|
3
3
|
# errors.rb : Implements custom error classes for Prawn
|
4
4
|
#
|
5
5
|
# Copyright April 2008, Gregory Brown. All Rights Reserved.
|
6
6
|
#
|
7
7
|
# This is free software. Please see the LICENSE and COPYING files for details.
|
8
|
-
|
8
|
+
#
|
9
9
|
module Prawn
|
10
10
|
module Errors
|
11
11
|
|
data/lib/prawn/font/dfont.rb
CHANGED
@@ -3,11 +3,13 @@ require 'prawn/font/ttf'
|
|
3
3
|
module Prawn
|
4
4
|
class Font
|
5
5
|
class DFont < TTF
|
6
|
+
|
6
7
|
# Returns a list of the names of all named fonts in the given dfont file.
|
7
8
|
# Note that fonts are not required to be named in a dfont file, so the
|
8
9
|
# list may be empty even if the file does contain fonts. Also, note that
|
9
10
|
# the list is returned in no particular order, so the first font in the
|
10
11
|
# list is not necessarily the font at index 0 in the file.
|
12
|
+
#
|
11
13
|
def self.named_fonts(file)
|
12
14
|
TTFunk::ResourceFile.open(file) do |file|
|
13
15
|
return file.resources_for("sfnt")
|
@@ -15,6 +17,7 @@ module Prawn
|
|
15
17
|
end
|
16
18
|
|
17
19
|
# Returns the number of fonts contained in the dfont file.
|
20
|
+
#
|
18
21
|
def self.font_count(file)
|
19
22
|
TTFunk::ResourceFile.open(file) do |file|
|
20
23
|
return file.map["sfnt"][:list].length
|
data/lib/prawn/font/ttf.rb
CHANGED
@@ -23,6 +23,7 @@ module Prawn
|
|
23
23
|
end
|
24
24
|
|
25
25
|
# +string+ must be UTF8-encoded.
|
26
|
+
#
|
26
27
|
def compute_width_of(string, options={})
|
27
28
|
scale = (options[:size] || size) / 1000.0
|
28
29
|
if options[:kerning]
|
@@ -55,6 +56,7 @@ module Prawn
|
|
55
56
|
# either a string or an array (for kerned text).
|
56
57
|
#
|
57
58
|
# The +text+ parameter must be UTF8-encoded.
|
59
|
+
#
|
58
60
|
def encode_text(text,options={})
|
59
61
|
text = text.chomp
|
60
62
|
|
data/lib/prawn/font.rb
CHANGED
@@ -78,6 +78,7 @@ module Prawn
|
|
78
78
|
|
79
79
|
# Sets the font directly, given an actual Font object
|
80
80
|
# and size.
|
81
|
+
#
|
81
82
|
def set_font(font, size=nil) # :nodoc:
|
82
83
|
@font = font
|
83
84
|
@font_size = size if size
|
@@ -85,6 +86,7 @@ module Prawn
|
|
85
86
|
|
86
87
|
# Saves the current font, and then yields. When the block
|
87
88
|
# finishes, the original font is restored.
|
89
|
+
#
|
88
90
|
def save_font
|
89
91
|
@font ||= find_font("Helvetica")
|
90
92
|
original_font = @font
|
data/lib/prawn/graphics.rb
CHANGED
data/lib/prawn/images/jpg.rb
CHANGED
@@ -11,7 +11,8 @@ require 'stringio'
|
|
11
11
|
module Prawn
|
12
12
|
module Images
|
13
13
|
# A convenience class that wraps the logic for extracting the parts
|
14
|
-
# of a
|
14
|
+
# of a JPG image that we need to embed them in a PDF
|
15
|
+
#
|
15
16
|
class JPG
|
16
17
|
attr_reader :width, :height, :bits, :channels
|
17
18
|
attr_accessor :scaled_width, :scaled_height
|
data/lib/prawn/images/png.rb
CHANGED
@@ -9,11 +9,13 @@
|
|
9
9
|
# This is free software. Please see the LICENSE and COPYING files for details.
|
10
10
|
|
11
11
|
require 'stringio'
|
12
|
+
require 'enumerator'
|
12
13
|
|
13
14
|
module Prawn
|
14
15
|
module Images
|
15
16
|
# A convenience class that wraps the logic for extracting the parts
|
16
17
|
# of a PNG image that we need to embed them in a PDF
|
18
|
+
#
|
17
19
|
class PNG
|
18
20
|
attr_reader :palette, :img_data, :transparency
|
19
21
|
attr_reader :width, :height, :bits
|
data/spec/bounding_box_spec.rb
CHANGED
@@ -128,6 +128,41 @@ describe "drawing bounding boxes" do
|
|
128
128
|
|
129
129
|
end
|
130
130
|
|
131
|
+
describe "Indentation" do
|
132
|
+
before(:each) { create_pdf }
|
133
|
+
|
134
|
+
it "should temporarily shift the x coordinate and width" do
|
135
|
+
@pdf.bounding_box([100,100], :width => 200) do
|
136
|
+
@pdf.indent(20) do
|
137
|
+
@pdf.bounds.absolute_left.should == 120
|
138
|
+
@pdf.bounds.width.should == 180
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
it "should restore the x coordinate and width after block exits" do
|
144
|
+
@pdf.bounding_box([100,100], :width => 200) do
|
145
|
+
@pdf.indent(20) do
|
146
|
+
# no-op
|
147
|
+
end
|
148
|
+
@pdf.bounds.absolute_left.should == 100
|
149
|
+
@pdf.bounds.width.should == 200
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
it "should restore the x coordinate and width on error" do
|
154
|
+
@pdf.bounding_box([100,100], :width => 200) do
|
155
|
+
begin
|
156
|
+
@pdf.indent(20) { raise }
|
157
|
+
rescue
|
158
|
+
@pdf.bounds.absolute_left.should == 100
|
159
|
+
@pdf.bounds.width.should == 200
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
165
|
+
|
131
166
|
describe "A canvas" do
|
132
167
|
before(:each) { create_pdf }
|
133
168
|
|
data/spec/font_spec.rb
CHANGED
@@ -57,8 +57,7 @@ describe "font style support" do
|
|
57
57
|
@pdf.text "In ActionMan-Italic"
|
58
58
|
|
59
59
|
text = PDF::Inspector::Text.analyze(@pdf.render)
|
60
|
-
name = text.font_settings.map { |e| e[:name] }.first
|
61
|
-
name = name.unpack("n*")[2..-1].pack("U*")
|
60
|
+
name = text.font_settings.map { |e| e[:name] }.first.to_s
|
62
61
|
name = name.sub(/\w+\+/, "subset+")
|
63
62
|
name.should == "subset+ActionMan-Italic"
|
64
63
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prawn-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.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: 2009-
|
12
|
+
date: 2009-09-22 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -25,8 +25,10 @@ extra_rdoc_files:
|
|
25
25
|
- COPYING
|
26
26
|
files:
|
27
27
|
- examples/bounding_box/bounding_boxes.rb
|
28
|
+
- examples/bounding_box/indentation.rb
|
28
29
|
- examples/bounding_box/russian_boxes.rb
|
29
30
|
- examples/column_box/column_box_example.rb
|
31
|
+
- examples/example_helper.rb
|
30
32
|
- examples/general/background.rb
|
31
33
|
- examples/general/canvas.rb
|
32
34
|
- examples/general/measurement_units.rb
|