prawn-core 0.5.0.1 → 0.5.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/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
|