prawn 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +6 -10
- data/Rakefile +4 -13
- data/data/encodings/win_ansi.txt +29 -0
- data/data/images/fractal.jpg +0 -0
- data/data/images/letterhead.jpg +0 -0
- data/examples/bounding_box/bounding_boxes.rb +44 -0
- data/examples/bounding_box/lazy_bounding_boxes.rb +28 -0
- data/examples/bounding_box/padded_box.rb +24 -0
- data/examples/{russian_boxes.rb → bounding_box/russian_boxes.rb} +9 -6
- data/examples/general/background.rb +20 -0
- data/examples/{canvas.rb → general/canvas.rb} +6 -2
- data/examples/general/measurement_units.rb +52 -0
- data/examples/{multi_page_layout.rb → general/multi_page_layout.rb} +6 -3
- data/examples/{page_geometry.rb → general/page_geometry.rb} +6 -2
- data/examples/{image.rb → graphics/basic_images.rb} +8 -4
- data/examples/graphics/cmyk.rb +13 -0
- data/examples/graphics/curves.rb +12 -0
- data/examples/{hexagon.rb → graphics/hexagon.rb} +5 -5
- data/examples/graphics/image_fit.rb +16 -0
- data/examples/graphics/image_flow.rb +38 -0
- data/examples/graphics/image_position.rb +18 -0
- data/examples/{line.rb → graphics/line.rb} +4 -2
- data/examples/{png_types.rb → graphics/png_types.rb} +4 -4
- data/examples/{polygons.rb → graphics/polygons.rb} +5 -4
- data/examples/graphics/remote_images.rb +12 -0
- data/examples/{ruport_helpers.rb → graphics/ruport_style_helpers.rb} +8 -5
- data/examples/graphics/stroke_bounds.rb +23 -0
- data/examples/{chinese_text_wrapping.rb → m17n/chinese_text_wrapping.rb} +7 -4
- data/examples/m17n/euro.rb +16 -0
- data/examples/m17n/sjis.rb +29 -0
- data/examples/m17n/utf8.rb +14 -0
- data/examples/m17n/win_ansi_charset.rb +55 -0
- data/examples/{addressbook.csv → table/addressbook.csv} +0 -0
- data/examples/{cell.rb → table/cell.rb} +8 -6
- data/examples/{currency.csv → table/currency.csv} +0 -0
- data/examples/{fancy_table.rb → table/fancy_table.rb} +9 -6
- data/examples/{ruport_formatter.rb → table/ruport_formatter.rb} +6 -3
- data/examples/{table.rb → table/table.rb} +6 -2
- data/examples/table/table_alignment.rb +18 -0
- data/examples/table/table_border_color.rb +17 -0
- data/examples/table/table_colspan.rb +19 -0
- data/examples/table/table_header_color.rb +19 -0
- data/examples/table/table_header_underline.rb +15 -0
- data/examples/{alignment.rb → text/alignment.rb} +5 -2
- data/examples/text/family_based_styling.rb +25 -0
- data/examples/{flowing_text_with_header_and_footer.rb → text/flowing_text_with_header_and_footer.rb} +19 -8
- data/examples/text/font_calculations.rb +91 -0
- data/examples/text/font_size.rb +34 -0
- data/examples/{kerning.rb → text/kerning.rb} +5 -1
- data/examples/text/simple_text.rb +18 -0
- data/examples/text/simple_text_ttf.rb +18 -0
- data/examples/{span.rb → text/span.rb} +5 -2
- data/examples/text/text_box.rb +26 -0
- data/examples/{text_flow.rb → text/text_flow.rb} +5 -2
- data/lib/prawn.rb +26 -20
- data/lib/prawn/compatibility.rb +5 -8
- data/lib/prawn/document.rb +29 -13
- data/lib/prawn/document/annotations.rb +63 -0
- data/lib/prawn/document/bounding_box.rb +18 -3
- data/lib/prawn/document/destinations.rb +81 -0
- data/lib/prawn/document/internals.rb +16 -2
- data/lib/prawn/document/page_geometry.rb +58 -57
- data/lib/prawn/document/span.rb +8 -0
- data/lib/prawn/document/table.rb +81 -31
- data/lib/prawn/document/text.rb +66 -21
- data/lib/prawn/document/text/box.rb +77 -0
- data/lib/prawn/encoding.rb +121 -0
- data/lib/prawn/errors.rb +4 -0
- data/lib/prawn/font.rb +70 -42
- data/lib/prawn/font/metrics.rb +64 -119
- data/lib/prawn/graphics.rb +105 -87
- data/lib/prawn/graphics/cell.rb +55 -28
- data/lib/prawn/graphics/color.rb +8 -0
- data/lib/prawn/images.rb +55 -12
- data/lib/prawn/images/jpg.rb +2 -1
- data/lib/prawn/images/png.rb +2 -1
- data/lib/prawn/literal_string.rb +14 -0
- data/lib/prawn/measurement_extensions.rb +46 -0
- data/lib/prawn/measurements.rb +71 -0
- data/lib/prawn/name_tree.rb +165 -0
- data/lib/prawn/pdf_object.rb +8 -1
- data/spec/annotations_spec.rb +90 -0
- data/spec/destinations_spec.rb +15 -0
- data/spec/document_spec.rb +39 -2
- data/spec/font_spec.rb +22 -0
- data/spec/graphics_spec.rb +99 -87
- data/spec/images_spec.rb +29 -1
- data/spec/measurement_units_spec.rb +23 -0
- data/spec/metrics_spec.rb +3 -2
- data/spec/name_tree_spec.rb +103 -0
- data/spec/pdf_object_spec.rb +15 -5
- data/spec/png_spec.rb +14 -14
- data/spec/spec_helper.rb +8 -6
- data/spec/table_spec.rb +40 -0
- data/spec/text_spec.rb +6 -4
- data/vendor/ttfunk/data/fonts/DejaVuSans.ttf +0 -0
- data/vendor/ttfunk/data/fonts/comicsans.ttf +0 -0
- data/vendor/ttfunk/example.rb +5 -0
- data/vendor/ttfunk/lib/ttfunk.rb +48 -0
- data/vendor/ttfunk/lib/ttfunk/table.rb +27 -0
- data/vendor/ttfunk/lib/ttfunk/table/cmap.rb +94 -0
- data/vendor/ttfunk/lib/ttfunk/table/directory.rb +25 -0
- data/vendor/ttfunk/lib/ttfunk/table/head.rb +25 -0
- data/vendor/ttfunk/lib/ttfunk/table/hhea.rb +27 -0
- data/vendor/ttfunk/lib/ttfunk/table/hmtx.rb +20 -0
- data/vendor/ttfunk/lib/ttfunk/table/kern.rb +48 -0
- data/vendor/ttfunk/lib/ttfunk/table/maxp.rb +17 -0
- data/vendor/ttfunk/lib/ttfunk/table/name.rb +52 -0
- metadata +93 -62
- data/examples/bounding_boxes.rb +0 -30
- data/examples/curves.rb +0 -10
- data/examples/family_based_styling.rb +0 -21
- data/examples/font_size.rb +0 -19
- data/examples/image2.rb +0 -13
- data/examples/image_flow.rb +0 -29
- data/examples/lazy_bounding_boxes.rb +0 -19
- data/examples/remote_images.rb +0 -7
- data/examples/simple_text.rb +0 -15
- data/examples/simple_text_ttf.rb +0 -16
- data/examples/sjis.rb +0 -21
- data/examples/utf8.rb +0 -12
- data/vendor/font_ttf/ttf.rb +0 -20
- data/vendor/font_ttf/ttf/datatypes.rb +0 -189
- data/vendor/font_ttf/ttf/encodings.rb +0 -140
- data/vendor/font_ttf/ttf/exceptions.rb +0 -28
- data/vendor/font_ttf/ttf/file.rb +0 -290
- data/vendor/font_ttf/ttf/fontchunk.rb +0 -77
- data/vendor/font_ttf/ttf/table/cmap.rb +0 -408
- data/vendor/font_ttf/ttf/table/cvt.rb +0 -49
- data/vendor/font_ttf/ttf/table/fpgm.rb +0 -48
- data/vendor/font_ttf/ttf/table/gasp.rb +0 -88
- data/vendor/font_ttf/ttf/table/glyf.rb +0 -452
- data/vendor/font_ttf/ttf/table/head.rb +0 -86
- data/vendor/font_ttf/ttf/table/hhea.rb +0 -96
- data/vendor/font_ttf/ttf/table/hmtx.rb +0 -98
- data/vendor/font_ttf/ttf/table/kern.rb +0 -186
- data/vendor/font_ttf/ttf/table/loca.rb +0 -75
- data/vendor/font_ttf/ttf/table/maxp.rb +0 -81
- data/vendor/font_ttf/ttf/table/name.rb +0 -222
- data/vendor/font_ttf/ttf/table/os2.rb +0 -172
- data/vendor/font_ttf/ttf/table/post.rb +0 -120
- data/vendor/font_ttf/ttf/table/prep.rb +0 -27
- data/vendor/font_ttf/ttf/table/vhea.rb +0 -45
- data/vendor/font_ttf/ttf/table/vmtx.rb +0 -36
@@ -0,0 +1,63 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# annotations.rb : Implements low-level annotation support for PDF
|
4
|
+
#
|
5
|
+
# Copyright November 2008, Jamis Buck. All Rights Reserved.
|
6
|
+
#
|
7
|
+
# This is free software. Please see the LICENSE and COPYING files for details.
|
8
|
+
|
9
|
+
require 'prawn/literal_string'
|
10
|
+
|
11
|
+
module Prawn
|
12
|
+
class Document
|
13
|
+
|
14
|
+
# Provides very low-level support for annotations. Those who are
|
15
|
+
# interested should check out the text-format branch of sandal/prawn,
|
16
|
+
# which includes much higher level interfaces to this code currently
|
17
|
+
# being developed by Jamis Buck to be included in a Prawn release soon.
|
18
|
+
#
|
19
|
+
# Feedback is welcome!
|
20
|
+
#
|
21
|
+
module Annotations
|
22
|
+
# Adds a new annotation (section 8.4 in PDF spec) to the current page.
|
23
|
+
# +options+ must be a Hash describing the annotation.
|
24
|
+
def annotate(options)
|
25
|
+
@current_page.data[:Annots] ||= []
|
26
|
+
options = sanitize_annotation_hash(options)
|
27
|
+
@current_page.data[:Annots] << ref(options)
|
28
|
+
return options
|
29
|
+
end
|
30
|
+
|
31
|
+
# A convenience method for creating Text annotations. +rect+ must be an array
|
32
|
+
# of four numbers, describing the bounds of the annotation. +contents+ should
|
33
|
+
# be a string, to be shown when the annotation is activated.
|
34
|
+
def text_annotation(rect, contents, options={})
|
35
|
+
options = options.merge(:Subtype => :Text, :Rect => rect, :Contents => contents)
|
36
|
+
annotate(options)
|
37
|
+
end
|
38
|
+
|
39
|
+
# A convenience method for creating Link annotations. +rect+ must be an array
|
40
|
+
# of four numbers, describing the bounds of the annotation. The +options+ hash
|
41
|
+
# should include either :Dest (describing the target destination, usually as a
|
42
|
+
# string that has been recorded in the document's Dests tree), or :A (describing
|
43
|
+
# an action to perform on clicking the link), or :PA (for describing a URL to
|
44
|
+
# link to).
|
45
|
+
def link_annotation(rect, options={})
|
46
|
+
options = options.merge(:Subtype => :Link, :Rect => rect)
|
47
|
+
annotate(options)
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def sanitize_annotation_hash(options)
|
53
|
+
options = options.merge(:Type => :Annot)
|
54
|
+
|
55
|
+
if options[:Dest].is_a?(String)
|
56
|
+
options[:Dest] = Prawn::LiteralString.new(options[:Dest])
|
57
|
+
end
|
58
|
+
|
59
|
+
options
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -1,5 +1,11 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
+
# bounding_box.rb : Implements a mechanism for shifting the coordinate space
|
4
|
+
#
|
5
|
+
# Copyright May 2008, Gregory Brown. All Rights Reserved.
|
6
|
+
#
|
7
|
+
# This is free software. Please see the LICENSE and COPYING files for details.
|
8
|
+
|
3
9
|
module Prawn
|
4
10
|
class Document
|
5
11
|
|
@@ -10,7 +16,7 @@ module Prawn
|
|
10
16
|
#
|
11
17
|
# When flowing text, the usage of a bounding box is simple. Text will
|
12
18
|
# begin at the point specified, flowing the width of the bounding box.
|
13
|
-
# After the block exits, the
|
19
|
+
# After the block exits, the cursor position will be moved to
|
14
20
|
# the bottom of the bounding box (y - height). If flowing text exceeds
|
15
21
|
# the height of the bounding box, the text will be continued on the next
|
16
22
|
# page, starting again at the top-left corner of the bounding box.
|
@@ -135,12 +141,21 @@ module Prawn
|
|
135
141
|
)
|
136
142
|
end
|
137
143
|
end
|
144
|
+
|
145
|
+
# A bounding box with the same dimensions of its parents, minus a margin
|
146
|
+
# on all sides
|
147
|
+
#
|
148
|
+
def padded_box(margin, &block)
|
149
|
+
bounding_box [bounds.left + margin, bounds.top - margin],
|
150
|
+
:width => bounds.width - (margin * 2),
|
151
|
+
:height => bounds.height - (margin * 2), &block
|
152
|
+
end
|
138
153
|
|
139
154
|
# A header is a LazyBoundingBox drawn relative to the margins that can be
|
140
155
|
# repeated on every page of the document.
|
141
156
|
#
|
142
157
|
# Unless <tt>:width</tt> or <tt>:height</tt> are specified, the margin_box
|
143
|
-
# width and height
|
158
|
+
# width and height are used.
|
144
159
|
#
|
145
160
|
# header margin_box.top_left do
|
146
161
|
# text "Here's My Fancy Header", :size => 25, :align => :center
|
@@ -155,7 +170,7 @@ module Prawn
|
|
155
170
|
# repeated on every page of the document.
|
156
171
|
#
|
157
172
|
# Unless <tt>:width</tt> or <tt>:height</tt> are specified, the margin_box
|
158
|
-
# width and height
|
173
|
+
# width and height are used.
|
159
174
|
#
|
160
175
|
# footer [margin_box.left, margin_box.bottom + 25] do
|
161
176
|
# stroke_horizontal_rule
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# annotations.rb : Implements destination support for PDF
|
4
|
+
#
|
5
|
+
# Copyright November 2008, Jamis Buck. All Rights Reserved.
|
6
|
+
#
|
7
|
+
# This is free software. Please see the LICENSE and COPYING files for details.
|
8
|
+
#
|
9
|
+
require 'prawn/name_tree'
|
10
|
+
|
11
|
+
module Prawn
|
12
|
+
class Document
|
13
|
+
module Destinations
|
14
|
+
# The maximum number of children to fit into a single node in the Dests tree.
|
15
|
+
NAME_TREE_CHILDREN_LIMIT = 20 #:nodoc:
|
16
|
+
|
17
|
+
# The Dests name tree in the Name dictionary (see Prawn::Document::Internal#names).
|
18
|
+
# This name tree is used to store named destinations (PDF spec 8.2.1).
|
19
|
+
# (For more on name trees, see section 3.8.4 in the PDF spec.)
|
20
|
+
def dests
|
21
|
+
names.data[:Dests] ||= ref(Prawn::NameTree::Node.new(self, NAME_TREE_CHILDREN_LIMIT))
|
22
|
+
end
|
23
|
+
|
24
|
+
# Adds a new destination to the dests name tree (see #dests). The
|
25
|
+
# +reference+ parameter will be converted into a Prawn::Reference if
|
26
|
+
# it is not already one.
|
27
|
+
def add_dest(name, reference)
|
28
|
+
reference = ref(reference) unless reference.is_a?(Prawn::Reference)
|
29
|
+
dests.data.add(name, reference)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Return a Dest specification for a specific location (and optional zoom
|
33
|
+
# level).
|
34
|
+
def dest_xyz(left, top, zoom=nil, page=@current_page)
|
35
|
+
[page, :XYZ, left, top, zoom]
|
36
|
+
end
|
37
|
+
|
38
|
+
# Return a Dest specification that will fit the given page into the
|
39
|
+
# viewport.
|
40
|
+
def dest_fit(page=@current_page)
|
41
|
+
[page, :Fit]
|
42
|
+
end
|
43
|
+
|
44
|
+
# Return a Dest specification that will fit the given page horizontally
|
45
|
+
# into the viewport, aligned vertically at the given top coordinate.
|
46
|
+
def dest_fit_horizontally(top, page=@current_page)
|
47
|
+
[page, :FitH, top]
|
48
|
+
end
|
49
|
+
|
50
|
+
# Return a Dest specification that will fit the given page vertically
|
51
|
+
# into the viewport, aligned horizontally at the given left coordinate.
|
52
|
+
def dest_fit_vertically(left, page=@current_page)
|
53
|
+
[page, :FitV, left]
|
54
|
+
end
|
55
|
+
|
56
|
+
# Return a Dest specification that will fit the given rectangle into the
|
57
|
+
# viewport, for the given page.
|
58
|
+
def dest_fit_rect(left, bottom, right, top, page=@current_page)
|
59
|
+
[page, :FitR, left, bottom, right, top]
|
60
|
+
end
|
61
|
+
|
62
|
+
# Return a Dest specfication that will fit the given page's bounding box
|
63
|
+
# into the viewport.
|
64
|
+
def dest_fit_bounds(page=@current_page)
|
65
|
+
[page, :FitB]
|
66
|
+
end
|
67
|
+
|
68
|
+
# Same as #dest_fit_horizontally, but works on the page's bounding box
|
69
|
+
# instead of the entire page.
|
70
|
+
def dest_fit_bounds_horizontally(top, page=@current_page)
|
71
|
+
[page, :FitBH, top]
|
72
|
+
end
|
73
|
+
|
74
|
+
# Same as #dest_fit_vertically, but works on the page's bounding box
|
75
|
+
# instead of the entire page.
|
76
|
+
def dest_fit_bounds_vertically(left, page=@current_page)
|
77
|
+
[page, :FitBV, left]
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -1,3 +1,11 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# internals.rb : Implements document internals for Prawn
|
4
|
+
#
|
5
|
+
# Copyright August 2008, Gregory Brown. All Rights Reserved.
|
6
|
+
#
|
7
|
+
# This is free software. Please see the LICENSE and COPYING files for details.
|
8
|
+
|
1
9
|
module Prawn
|
2
10
|
class Document
|
3
11
|
|
@@ -7,7 +15,6 @@ module Prawn
|
|
7
15
|
# are you won't need anything you find here.
|
8
16
|
#
|
9
17
|
module Internals
|
10
|
-
|
11
18
|
# Creates a new Prawn::Reference and adds it to the Document's object
|
12
19
|
# list. The +data+ argument is anything that Prawn::PdfObject() can convert.
|
13
20
|
def ref(data)
|
@@ -50,6 +57,13 @@ module Prawn
|
|
50
57
|
page_resources[:XObject] ||= {}
|
51
58
|
end
|
52
59
|
|
60
|
+
# The Name dictionary (PDF spec 3.6.3) for this document. It is
|
61
|
+
# lazily initialized, so that documents that do not need a name
|
62
|
+
# dictionary do not incur the additional overhead.
|
63
|
+
def names
|
64
|
+
@root.data[:Names] ||= ref(:Type => :Names)
|
65
|
+
end
|
66
|
+
|
53
67
|
private
|
54
68
|
|
55
69
|
def finish_page_content
|
@@ -104,4 +118,4 @@ module Prawn
|
|
104
118
|
|
105
119
|
end
|
106
120
|
end
|
107
|
-
end
|
121
|
+
end
|
@@ -9,70 +9,71 @@
|
|
9
9
|
module Prawn
|
10
10
|
class Document
|
11
11
|
module PageGeometry
|
12
|
-
|
12
|
+
|
13
13
|
# Dimensions pulled from PDF::Writer, rubyforge.org/projects/ruby-pdf
|
14
|
-
SIZES = { "4A0" => [4767.87, 6740.79],
|
15
|
-
"2A0" => [3370.39, 4767.87],
|
16
|
-
"A0" => [2383.94, 3370.39],
|
17
|
-
"A1" => [1683.78, 2383.94],
|
18
|
-
"A2" => [1190.55, 1683.78],
|
19
|
-
"A3" => [841.89, 1190.55],
|
20
|
-
"A4" => [595.28, 841.89],
|
21
|
-
"A5" => [419.53, 595.28],
|
22
|
-
"A6" => [297.64, 419.53],
|
23
|
-
"A7" => [209.76, 297.64],
|
24
|
-
"A8" => [147.40, 209.76],
|
25
|
-
"A9" => [104.88, 147.40],
|
26
|
-
"A10" => [73.70, 104.88],
|
27
|
-
"B0" => [2834.65, 4008.19],
|
28
|
-
"B1" => [2004.09, 2834.65],
|
29
|
-
"B2" => [1417.32, 2004.09],
|
30
|
-
"B3" => [1000.63, 1417.32],
|
31
|
-
"B4" => [708.66, 1000.63],
|
32
|
-
"B5" => [498.90, 708.66],
|
33
|
-
"B6" => [354.33, 498.90],
|
34
|
-
"B7" => [249.45, 354.33],
|
35
|
-
"B8" => [175.75, 249.45],
|
36
|
-
"B9" => [124.72, 175.75],
|
37
|
-
"B10" => [87.87, 124.72],
|
38
|
-
"C0" => [2599.37, 3676.54],
|
39
|
-
"C1" => [1836.85, 2599.37],
|
40
|
-
"C2" => [1298.27, 1836.85],
|
41
|
-
"C3" => [918.43, 1298.27],
|
42
|
-
"C4" => [649.13, 918.43],
|
43
|
-
"C5" => [459.21, 649.13],
|
44
|
-
"C6" => [323.15, 459.21],
|
45
|
-
"C7" => [229.61, 323.15],
|
46
|
-
"C8" => [161.57, 229.61],
|
47
|
-
"C9" => [113.39, 161.57],
|
48
|
-
"C10" => [79.37, 113.39],
|
49
|
-
"RA0" => [2437.80, 3458.27],
|
50
|
-
"RA1" => [1729.13, 2437.80],
|
51
|
-
"RA2" => [1218.90, 1729.13],
|
52
|
-
"RA3" => [864.57, 1218.90],
|
53
|
-
"RA4" => [609.45, 864.57],
|
54
|
-
"SRA0" => [2551.18, 3628.35],
|
55
|
-
"SRA1" => [1814.17, 2551.18],
|
56
|
-
"SRA2" => [1275.59, 1814.17],
|
57
|
-
"SRA3" => [907.09, 1275.59],
|
58
|
-
"SRA4" => [637.80, 907.09],
|
59
|
-
|
60
|
-
"
|
61
|
-
"
|
62
|
-
|
63
|
-
|
14
|
+
SIZES = { "4A0" => [4767.87, 6740.79],
|
15
|
+
"2A0" => [3370.39, 4767.87],
|
16
|
+
"A0" => [2383.94, 3370.39],
|
17
|
+
"A1" => [1683.78, 2383.94],
|
18
|
+
"A2" => [1190.55, 1683.78],
|
19
|
+
"A3" => [841.89, 1190.55],
|
20
|
+
"A4" => [595.28, 841.89],
|
21
|
+
"A5" => [419.53, 595.28],
|
22
|
+
"A6" => [297.64, 419.53],
|
23
|
+
"A7" => [209.76, 297.64],
|
24
|
+
"A8" => [147.40, 209.76],
|
25
|
+
"A9" => [104.88, 147.40],
|
26
|
+
"A10" => [73.70, 104.88],
|
27
|
+
"B0" => [2834.65, 4008.19],
|
28
|
+
"B1" => [2004.09, 2834.65],
|
29
|
+
"B2" => [1417.32, 2004.09],
|
30
|
+
"B3" => [1000.63, 1417.32],
|
31
|
+
"B4" => [708.66, 1000.63],
|
32
|
+
"B5" => [498.90, 708.66],
|
33
|
+
"B6" => [354.33, 498.90],
|
34
|
+
"B7" => [249.45, 354.33],
|
35
|
+
"B8" => [175.75, 249.45],
|
36
|
+
"B9" => [124.72, 175.75],
|
37
|
+
"B10" => [87.87, 124.72],
|
38
|
+
"C0" => [2599.37, 3676.54],
|
39
|
+
"C1" => [1836.85, 2599.37],
|
40
|
+
"C2" => [1298.27, 1836.85],
|
41
|
+
"C3" => [918.43, 1298.27],
|
42
|
+
"C4" => [649.13, 918.43],
|
43
|
+
"C5" => [459.21, 649.13],
|
44
|
+
"C6" => [323.15, 459.21],
|
45
|
+
"C7" => [229.61, 323.15],
|
46
|
+
"C8" => [161.57, 229.61],
|
47
|
+
"C9" => [113.39, 161.57],
|
48
|
+
"C10" => [79.37, 113.39],
|
49
|
+
"RA0" => [2437.80, 3458.27],
|
50
|
+
"RA1" => [1729.13, 2437.80],
|
51
|
+
"RA2" => [1218.90, 1729.13],
|
52
|
+
"RA3" => [864.57, 1218.90],
|
53
|
+
"RA4" => [609.45, 864.57],
|
54
|
+
"SRA0" => [2551.18, 3628.35],
|
55
|
+
"SRA1" => [1814.17, 2551.18],
|
56
|
+
"SRA2" => [1275.59, 1814.17],
|
57
|
+
"SRA3" => [907.09, 1275.59],
|
58
|
+
"SRA4" => [637.80, 907.09],
|
59
|
+
"EXECUTIVE" => [521.86, 756.00],
|
60
|
+
"FOLIO" => [612.00, 936.00],
|
61
|
+
"LEGAL" => [612.00, 1008.00],
|
62
|
+
"LETTER" => [612.00, 792.00],
|
63
|
+
"TABLOID" => [792.00, 1224.00] }
|
64
|
+
|
64
65
|
def page_dimensions #:nodoc:
|
65
66
|
coords = SIZES[page_size] || page_size
|
66
|
-
[0,0] + case(page_layout)
|
67
|
+
[0,0] + case(page_layout)
|
67
68
|
when :portrait
|
68
69
|
coords
|
69
70
|
when :landscape
|
70
|
-
coords.reverse
|
71
|
-
else
|
72
|
-
raise Prawn::Errors::InvalidPageLayout,
|
71
|
+
coords.reverse
|
72
|
+
else
|
73
|
+
raise Prawn::Errors::InvalidPageLayout,
|
73
74
|
"Layout must be either :portrait or :landscape"
|
74
75
|
end
|
75
|
-
end
|
76
|
-
end
|
76
|
+
end
|
77
|
+
end
|
77
78
|
end
|
78
79
|
end
|
data/lib/prawn/document/span.rb
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# span.rb : Implements text columns
|
4
|
+
#
|
5
|
+
# Copyright September 2008, Gregory Brown. All Rights Reserved.
|
6
|
+
#
|
7
|
+
# This is free software. Please see the LICENSE and COPYING files for details.
|
8
|
+
|
1
9
|
module Prawn
|
2
10
|
class Document
|
3
11
|
# A span is a special purpose bounding box that allows a column of
|
data/lib/prawn/document/table.rb
CHANGED
@@ -37,7 +37,14 @@ module Prawn
|
|
37
37
|
#
|
38
38
|
# end
|
39
39
|
#
|
40
|
+
# Will raise <tt>Prawn::Errors::EmptyTable</tt> given
|
41
|
+
# a nil or empty <tt>data</tt> paramater.
|
42
|
+
#
|
40
43
|
def table(data,options={})
|
44
|
+
if data.nil? || data.empty?
|
45
|
+
raise Prawn::Errors::EmptyTable,
|
46
|
+
"data must be a non-empty, non-nil, two dimensional array of Prawn::Cells or strings"
|
47
|
+
end
|
41
48
|
Prawn::Document::Table.new(data,self,options).draw
|
42
49
|
end
|
43
50
|
|
@@ -80,17 +87,22 @@ module Prawn
|
|
80
87
|
# The following options are available for customizing your tables, with
|
81
88
|
# defaults shown in [] at the end of each description.
|
82
89
|
#
|
90
|
+
# <tt>:headers</tt>:: An array of table headers, either strings or Cells. [Empty]
|
91
|
+
# <tt>:align_headers</tt>:: Alignment of header text. Specify for entire header (<tt>:left</tt>) or by column (<tt>{ 0 => :right, 1 => :left}</tt>). If omitted, the header alignment is the same as the column alignment.
|
92
|
+
# <tt>:header_text_color</tt>:: Sets the text color of the headers
|
93
|
+
# <tt>:header_color</tt>:: Manually sets the header color
|
83
94
|
# <tt>:font_size</tt>:: The font size for the text cells . [12]
|
84
95
|
# <tt>:horizontal_padding</tt>:: The horizontal cell padding in PDF points [5]
|
85
96
|
# <tt>:vertical_padding</tt>:: The vertical cell padding in PDF points [5]
|
86
97
|
# <tt>:padding</tt>:: Horizontal and vertical cell padding (overrides both)
|
87
98
|
# <tt>:border_width</tt>:: With of border lines in PDF points [1]
|
88
|
-
# <tt>:border_style</tt>:: If set to :grid, fills in all borders.
|
99
|
+
# <tt>:border_style</tt>:: If set to :grid, fills in all borders. If set to :underline_header, underline header only. Otherwise, borders are drawn on columns only, not rows
|
100
|
+
# <tt>:border_color</tt>:: Sets the color of the borders.
|
89
101
|
# <tt>:position</tt>:: One of <tt>:left</tt>, <tt>:center</tt> or <tt>n</tt>, where <tt>n</tt> is an x-offset from the left edge of the current bounding box
|
90
102
|
# <tt>:widths:</tt> A hash of indices and widths in PDF points. E.g. <tt>{ 0 => 50, 1 => 100 }</tt>
|
91
103
|
# <tt>:row_colors</tt>:: An array of row background colors which are used cyclicly.
|
92
104
|
# <tt>:align</tt>:: Alignment of text in columns, for entire table (<tt>:center</tt>) or by column (<tt>{ 0 => :left, 1 => :center}</tt>)
|
93
|
-
# <tt>:
|
105
|
+
# <tt>:minimum_rows</tt>:: The minimum rows to display on a page, including header.
|
94
106
|
#
|
95
107
|
# Row colors are specified as html encoded values, e.g.
|
96
108
|
# ["ffffff","aaaaaa","ccaaff"]. You can also specify
|
@@ -110,8 +122,9 @@ module Prawn
|
|
110
122
|
@document = document
|
111
123
|
|
112
124
|
Prawn.verify_options [:font_size,:border_style, :border_width,
|
113
|
-
:position, :headers, :row_colors, :align, :align_headers,
|
114
|
-
:horizontal_padding, :vertical_padding, :padding, :widths
|
125
|
+
:position, :headers, :row_colors, :align, :align_headers, :header_text_color, :border_color,
|
126
|
+
:horizontal_padding, :vertical_padding, :padding, :widths,
|
127
|
+
:header_color ], options
|
115
128
|
|
116
129
|
configuration.update(options)
|
117
130
|
|
@@ -193,10 +206,12 @@ module Prawn
|
|
193
206
|
@document.font.size C(:font_size) do
|
194
207
|
renderable_data.each_with_index do |row,index|
|
195
208
|
c = Prawn::Graphics::CellBlock.new(@document)
|
196
|
-
|
209
|
+
|
210
|
+
col_index = 0
|
211
|
+
row.each do |e|
|
197
212
|
case C(:align)
|
198
213
|
when Hash
|
199
|
-
align = C(:align)[
|
214
|
+
align = C(:align)[col_index]
|
200
215
|
else
|
201
216
|
align = C(:align)
|
202
217
|
end
|
@@ -207,7 +222,7 @@ module Prawn
|
|
207
222
|
case e
|
208
223
|
when Prawn::Graphics::Cell
|
209
224
|
e.document = @document
|
210
|
-
e.width = @col_widths[
|
225
|
+
e.width = @col_widths[col_index]
|
211
226
|
e.horizontal_padding = C(:horizontal_padding)
|
212
227
|
e.vertical_padding = C(:vertical_padding)
|
213
228
|
e.border_width = C(:border_width)
|
@@ -215,28 +230,42 @@ module Prawn
|
|
215
230
|
e.align = align
|
216
231
|
c << e
|
217
232
|
else
|
233
|
+
text = e.is_a?(Hash) ? e[:text] : e.to_s
|
234
|
+
width = if e.is_a?(Hash) && e.has_key?(:colspan)
|
235
|
+
@col_widths.slice(col_index, e[:colspan]).inject { |sum, width| sum + width }
|
236
|
+
else
|
237
|
+
@col_widths[col_index]
|
238
|
+
end
|
239
|
+
|
218
240
|
c << Prawn::Graphics::Cell.new(
|
219
241
|
:document => @document,
|
220
|
-
:text =>
|
221
|
-
:width =>
|
242
|
+
:text => text,
|
243
|
+
:width => width,
|
222
244
|
:horizontal_padding => C(:horizontal_padding),
|
223
245
|
:vertical_padding => C(:vertical_padding),
|
224
246
|
:border_width => C(:border_width),
|
225
247
|
:border_style => :sides,
|
226
248
|
:align => align )
|
227
|
-
end
|
249
|
+
end
|
250
|
+
|
251
|
+
col_index += (e.is_a?(Hash) && e.has_key?(:colspan)) ? e[:colspan] : 1
|
228
252
|
end
|
229
253
|
|
230
254
|
bbox = @parent_bounds.stretchy? ? @document.margin_box : @parent_bounds
|
231
255
|
if c.height > y_pos - bbox.absolute_bottom
|
232
|
-
|
233
|
-
|
234
|
-
if C(:headers)
|
235
|
-
page_contents = [page_contents[0]]
|
236
|
-
y_pos = @document.y - page_contents[0].height
|
237
|
-
else
|
238
|
-
page_contents = []
|
256
|
+
if C(:headers) && page_contents.length == 1
|
257
|
+
@document.start_new_page
|
239
258
|
y_pos = @document.y
|
259
|
+
else
|
260
|
+
draw_page(page_contents)
|
261
|
+
@document.start_new_page
|
262
|
+
if C(:headers) && page_contents.any?
|
263
|
+
page_contents = [page_contents[0]]
|
264
|
+
y_pos = @document.y - page_contents[0].height
|
265
|
+
else
|
266
|
+
page_contents = []
|
267
|
+
y_pos = @document.y
|
268
|
+
end
|
240
269
|
end
|
241
270
|
end
|
242
271
|
|
@@ -254,29 +283,50 @@ module Prawn
|
|
254
283
|
|
255
284
|
def draw_page(contents)
|
256
285
|
return if contents.empty?
|
257
|
-
|
258
|
-
if C(:border_style) == :
|
286
|
+
|
287
|
+
if C(:border_style) == :underline_header
|
288
|
+
contents.each { |e| e.border_style = :none }
|
289
|
+
contents.first.border_style = :bottom_only if C(:headers)
|
290
|
+
elsif C(:border_style) == :grid || contents.length == 1
|
259
291
|
contents.each { |e| e.border_style = :all }
|
260
|
-
else
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
292
|
+
else
|
293
|
+
contents.first.border_style = C(:headers) ? :all : :no_bottom
|
294
|
+
contents.last.border_style = :no_top
|
295
|
+
end
|
296
|
+
|
297
|
+
if C(:headers)
|
298
|
+
contents.first.cells.each_with_index do |e,i|
|
299
|
+
if C(:align_headers)
|
300
|
+
case C(:align_headers)
|
301
|
+
when Hash
|
302
|
+
align = C(:align_headers)[i]
|
303
|
+
else
|
304
|
+
align = C(:align_headers)
|
305
|
+
end
|
306
|
+
end
|
307
|
+
e.align = align if align
|
308
|
+
e.text_color = C(:header_text_color) if C(:header_text_color)
|
309
|
+
e.background_color = C(:header_color) if C(:header_color)
|
266
310
|
end
|
267
|
-
contents.last.border_style = :no_top
|
268
311
|
end
|
269
|
-
|
270
|
-
contents.each do |x|
|
271
|
-
x.background_color
|
312
|
+
|
313
|
+
contents.each do |x|
|
314
|
+
unless x.background_color
|
315
|
+
x.background_color = next_row_color if C(:row_colors)
|
316
|
+
end
|
317
|
+
x.border_color = C(:border_color) if C(:border_color)
|
318
|
+
|
272
319
|
x.draw
|
273
320
|
end
|
274
|
-
|
321
|
+
|
275
322
|
reset_row_colors
|
276
323
|
end
|
277
324
|
|
325
|
+
|
278
326
|
def next_row_color
|
279
|
-
C(:row_colors).
|
327
|
+
color = C(:row_colors).shift
|
328
|
+
C(:row_colors).push(color)
|
329
|
+
color
|
280
330
|
end
|
281
331
|
|
282
332
|
def reset_row_colors
|