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,15 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Demonstrates the :underline_header border style for Document#table.
|
4
|
+
#
|
5
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
|
6
|
+
require "prawn"
|
7
|
+
|
8
|
+
Prawn::Document.generate "table_header_underline.pdf" do
|
9
|
+
table [ ['01/01/2008', 'John Doe', '4.2', '125.00', '525.00'],
|
10
|
+
['01/12/2008', 'Jane Doe', '3.2', '75.50', '241.60'] ] * 5,
|
11
|
+
:position => :center,
|
12
|
+
:headers => ['Date', 'Employee', 'Hours', 'Rate', 'Total'],
|
13
|
+
:widths => { 0 => 75, 1 => 100, 2 => 50, 3 => 50, 4 => 50},
|
14
|
+
:border_style => :underline_header
|
15
|
+
end
|
@@ -1,6 +1,9 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
3
|
-
|
2
|
+
#
|
3
|
+
# This example demonstrates usage of Document#text with the :align option.
|
4
|
+
# Available options are :left, :right, and :center, with :left as default.
|
5
|
+
#
|
6
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
|
4
7
|
require "prawn"
|
5
8
|
|
6
9
|
Prawn::Document.generate("alignment.pdf") do
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# This example demonstrates using the :style option for Document#text.
|
4
|
+
# If you are working with TTF fonts, you'll want to check out the
|
5
|
+
# documentation for Document#font_families and register your fonts with it.
|
6
|
+
#
|
7
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
|
8
|
+
require "prawn"
|
9
|
+
|
10
|
+
Prawn::Document.generate("family_style.pdf") do
|
11
|
+
["Courier","Helvetica","Times-Roman"].each do |f|
|
12
|
+
[:bold,:bold_italic,:italic,:normal].each do |s|
|
13
|
+
font f, :style => s
|
14
|
+
text "I'm writing in #{f} (#{s})"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
font "Helvetica"
|
19
|
+
|
20
|
+
text "Normal"
|
21
|
+
text "Bold", :style => :bold
|
22
|
+
text "Bold Italic", :style => :bold_italic
|
23
|
+
text "Italic", :style => :italic
|
24
|
+
text "Normal"
|
25
|
+
end
|
data/examples/{flowing_text_with_header_and_footer.rb → text/flowing_text_with_header_and_footer.rb}
RENAMED
@@ -1,18 +1,30 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
3
|
-
|
2
|
+
#
|
3
|
+
# Multi-faceted example that demonstrates a document flowing between header
|
4
|
+
# and footer regions. At the moment, headers and footers in Prawn are run
|
5
|
+
# using the current font settings (among other things), for each page. THhis
|
6
|
+
# means that it is important to non-destructively set your desired styling
|
7
|
+
# within your headers and footers, as shown below.
|
8
|
+
#
|
9
|
+
# Future versions of Prawn may make this more convenient somehow.
|
10
|
+
#
|
11
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
|
4
12
|
require "prawn"
|
5
13
|
|
6
14
|
Prawn::Document.generate("flow_with_headers_and_footers.pdf") do
|
7
15
|
|
8
16
|
header margin_box.top_left do
|
9
|
-
|
10
|
-
|
17
|
+
font "Helvetica" do
|
18
|
+
text "Here's My Fancy Header", :size => 25, :align => :center
|
19
|
+
stroke_horizontal_rule
|
20
|
+
end
|
11
21
|
end
|
12
22
|
|
13
23
|
footer [margin_box.left, margin_box.bottom + 25] do
|
14
|
-
|
15
|
-
|
24
|
+
font "Helvetica" do
|
25
|
+
stroke_horizontal_rule
|
26
|
+
text "And here's a sexy footer", :size => 16
|
27
|
+
end
|
16
28
|
end
|
17
29
|
|
18
30
|
bounding_box([bounds.left, bounds.top - 50],
|
@@ -68,5 +80,4 @@ Prawn::Document.generate("flow_with_headers_and_footers.pdf") do
|
|
68
80
|
|
69
81
|
end
|
70
82
|
|
71
|
-
end
|
72
|
-
|
83
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# This example is a demonstration of how Prawn does its text positioning,
|
4
|
+
# meant to assist those that need to do advanced positioning calculations.
|
5
|
+
# Run the example for a clearer picture of how things work
|
6
|
+
#
|
7
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
|
8
|
+
require 'prawn'
|
9
|
+
|
10
|
+
Prawn::Document.generate('font_calculations.pdf') do
|
11
|
+
|
12
|
+
def demonstration(pos)
|
13
|
+
move_down 10
|
14
|
+
|
15
|
+
stroke_horizontal_rule
|
16
|
+
|
17
|
+
text "When using flowing text, Prawn will position text\n" +
|
18
|
+
"starting font.#{pos} below the baseline, and leave\n" +
|
19
|
+
"the y-cursor at the baseline of the next line of text"
|
20
|
+
|
21
|
+
stroke_horizontal_rule
|
22
|
+
|
23
|
+
move_down 20
|
24
|
+
|
25
|
+
bl = y - bounds.absolute_bottom
|
26
|
+
|
27
|
+
stroke_horizontal_rule
|
28
|
+
text "When using text positioned with :at, the baseline is used", :at => [0, bl]
|
29
|
+
|
30
|
+
text "(and the Y-cursor is not moved)", :at => [350, bl]
|
31
|
+
|
32
|
+
colors = { :ascender => "ff0000",
|
33
|
+
:descender => "00ff00",
|
34
|
+
:line_gap => "0000ff",
|
35
|
+
:font_height => "005500" }
|
36
|
+
|
37
|
+
|
38
|
+
pad(20) do
|
39
|
+
text "Calculations Demo", :size => 16
|
40
|
+
end
|
41
|
+
|
42
|
+
fill_color colors[:ascender]
|
43
|
+
text "ASCENDER"
|
44
|
+
|
45
|
+
fill_color colors[:descender]
|
46
|
+
text "DESCENDER"
|
47
|
+
|
48
|
+
fill_color colors[:line_gap]
|
49
|
+
text "LINEGAP"
|
50
|
+
|
51
|
+
fill_color colors[:font_height]
|
52
|
+
text "FONT_HEIGHT"
|
53
|
+
|
54
|
+
fill_color "000000"
|
55
|
+
font.size = 20
|
56
|
+
|
57
|
+
move_down 40
|
58
|
+
|
59
|
+
bl = y - bounds.absolute_bottom
|
60
|
+
text "The quick brown fox jumps over the lazy dog.", :at => [0, bl]
|
61
|
+
|
62
|
+
stroke_color colors[:ascender]
|
63
|
+
stroke_line [0, bl], [0, bl + font.ascender]
|
64
|
+
stroke_line [0, bl + font.ascender], [bounds.width, bl + font.ascender]
|
65
|
+
|
66
|
+
stroke_color colors[:descender]
|
67
|
+
stroke_line [0,bl], [0, bl + font.descender]
|
68
|
+
stroke_line [0, bl + font.descender], [bounds.width, bl + font.descender]
|
69
|
+
|
70
|
+
stroke_color colors[:line_gap]
|
71
|
+
stroke_line [0, bl + font.descender], [0,bl + font.descender - font.line_gap]
|
72
|
+
stroke_line [0, bl + font.descender - font.line_gap],
|
73
|
+
[bounds.width,bl + font.descender - font.line_gap]
|
74
|
+
|
75
|
+
stroke_color colors[:font_height]
|
76
|
+
stroke_line [bounds.width, bl + font.ascender],
|
77
|
+
[bounds.width, bl + font.descender - font.line_gap]
|
78
|
+
|
79
|
+
stroke_color "000000"
|
80
|
+
fill_color "000000"
|
81
|
+
end
|
82
|
+
|
83
|
+
text "Using AFM", :size => 20
|
84
|
+
demonstration("height")
|
85
|
+
|
86
|
+
move_down 75
|
87
|
+
font "#{Prawn::BASEDIR}/data/fonts/DejaVuSans.ttf"
|
88
|
+
text "Using TTF", :size => 20
|
89
|
+
demonstration("ascender")
|
90
|
+
|
91
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# This example shows the many ways of setting font sizes in Prawn
|
4
|
+
#
|
5
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
|
6
|
+
require "prawn"
|
7
|
+
|
8
|
+
Prawn::Document.generate "font_size.pdf", :page_size => "A4" do
|
9
|
+
|
10
|
+
# Explicit global changes
|
11
|
+
font 'Helvetica'
|
12
|
+
font.size = 16
|
13
|
+
|
14
|
+
text 'Font at 16 point'
|
15
|
+
|
16
|
+
# Transactional changes rolled back after block exit
|
17
|
+
font.size 9 do
|
18
|
+
text 'Font at 9 point'
|
19
|
+
# single line changes, not persisted.
|
20
|
+
text 'Font at manual override 20 point', :size => 20
|
21
|
+
text 'Font at 9 point'
|
22
|
+
end
|
23
|
+
|
24
|
+
# Transactional changes rolled back after block exit on full fonts.
|
25
|
+
font("Times-Roman", :style => :italic, :size => 12) do
|
26
|
+
text "Font in times at 12"
|
27
|
+
font.size(16) { text "Font in Times at 16" }
|
28
|
+
end
|
29
|
+
|
30
|
+
text 'Font at 16 point'
|
31
|
+
|
32
|
+
font "Courier", :size => 40
|
33
|
+
text "40 pt!"
|
34
|
+
end
|
@@ -1,4 +1,8 @@
|
|
1
|
-
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Demonstration of enabling and disabling kerning support
|
4
|
+
#
|
5
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
|
2
6
|
require "prawn"
|
3
7
|
|
4
8
|
Prawn::Document.generate "kerning.pdf" do
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# An early example of basic text generation at absolute positions.
|
4
|
+
# Mostly kept for nostalgia.
|
5
|
+
#
|
6
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
|
7
|
+
require "prawn"
|
8
|
+
|
9
|
+
Prawn::Document.generate "simple_text.pdf" do
|
10
|
+
fill_color "0000ff"
|
11
|
+
text "Hello World", :at => [200,420], :size => 32, :rotate => 45
|
12
|
+
font "Times-Roman"
|
13
|
+
fill_color "ff0000"
|
14
|
+
text "Using Another Font", :at => [5,5]
|
15
|
+
start_new_page
|
16
|
+
font "Courier"
|
17
|
+
text "Goodbye World", :at => [288,50]
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# An early example of TTF font embedding. Mostly kept for nostalgia's sake.
|
4
|
+
#
|
5
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
|
6
|
+
require "prawn"
|
7
|
+
|
8
|
+
Prawn::Document.generate "simple_text_ttf.pdf" do
|
9
|
+
fill_color "0000ff"
|
10
|
+
font "#{Prawn::BASEDIR}/data/fonts/comicsans.ttf"
|
11
|
+
text "Hello World", :at => [200,720], :size => 32
|
12
|
+
|
13
|
+
font "#{Prawn::BASEDIR}/data/fonts/Chalkboard.ttf"
|
14
|
+
|
15
|
+
pad(20) do
|
16
|
+
text "This is chalkboard wrapping " * 20
|
17
|
+
end
|
18
|
+
end
|
@@ -1,6 +1,9 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
3
|
-
|
2
|
+
#
|
3
|
+
# Demonstration of Document#span, which is used for generating flowing
|
4
|
+
# columns of text.
|
5
|
+
#
|
6
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
|
4
7
|
require "prawn"
|
5
8
|
|
6
9
|
Prawn::Document.generate("span.pdf") do
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# A text box is positioned by a top-left corner, width, and height and is
|
4
|
+
# essentially an invisible rectangle that the text wil lflow within. If the
|
5
|
+
# text exceeds the boundaries, it is either truncated, replaced with some
|
6
|
+
# ellipses, or set to expand beyond the bottom boundary.
|
7
|
+
#
|
8
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
|
9
|
+
require 'prawn'
|
10
|
+
|
11
|
+
Prawn::Document.generate("text_box.pdf") do
|
12
|
+
|
13
|
+
text_box "Oh hai text box. " * 200,
|
14
|
+
:width => 300, :height => font.height * 5,
|
15
|
+
:overflow => :ellipses,
|
16
|
+
:at => [100,bounds.top]
|
17
|
+
|
18
|
+
text_box "Oh hai text box. " * 200,
|
19
|
+
:width => 250, :height => font.height * 10,
|
20
|
+
:overflow => :truncate,
|
21
|
+
:at => [50, 300]
|
22
|
+
|
23
|
+
move_down 20
|
24
|
+
|
25
|
+
text_box "Oh hai text box. " * 100, :overflow => :expand
|
26
|
+
end
|
@@ -1,6 +1,9 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
3
|
-
|
2
|
+
#
|
3
|
+
# Basic text flowing example including the use of bounding boxes. A somewhat
|
4
|
+
# old example, mostly retained for nostalgia.
|
5
|
+
#
|
6
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
|
4
7
|
require "prawn"
|
5
8
|
|
6
9
|
content = <<-EOS
|
data/lib/prawn.rb
CHANGED
@@ -1,37 +1,41 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
2
|
+
|
3
3
|
# prawn.rb : A library for PDF generation in Ruby
|
4
4
|
#
|
5
|
-
# Copyright April 2008, Gregory Brown.
|
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
|
-
%w[
|
9
|
+
%w[ttfunk/lib].each do |dep|
|
10
10
|
$LOAD_PATH.unshift(File.dirname(__FILE__) + "/../vendor/#{dep}")
|
11
11
|
end
|
12
|
-
|
13
|
-
require '
|
14
|
-
|
15
|
-
module Prawn
|
12
|
+
|
13
|
+
require 'ttfunk'
|
14
|
+
|
15
|
+
module Prawn
|
16
16
|
file = __FILE__
|
17
17
|
file = File.readlink(file) if File.symlink?(file)
|
18
18
|
dir = File.dirname(file)
|
19
19
|
|
20
20
|
# The base source directory for Prawn as installed on the system
|
21
|
-
BASEDIR = File.expand_path(File.join(dir, '..'))
|
21
|
+
BASEDIR = File.expand_path(File.join(dir, '..'))
|
22
22
|
|
23
|
-
VERSION = "0.
|
23
|
+
VERSION = "0.3.0"
|
24
24
|
|
25
25
|
extend self
|
26
26
|
|
27
|
-
|
27
|
+
attr_accessor :debug
|
28
|
+
|
29
|
+
def verify_options(accepted,actual) #:nodoc:
|
30
|
+
return unless debug || $DEBUG
|
28
31
|
require "set"
|
29
32
|
unless (act=Set[*actual.keys]).subset?(acc=Set[*accepted])
|
30
|
-
raise Prawn::Errors::UnknownOption,
|
33
|
+
raise Prawn::Errors::UnknownOption,
|
31
34
|
"\nDetected unknown option(s): #{(act - acc).to_a.inspect}\n" <<
|
32
35
|
"Accepted options are: #{accepted.inspect}"
|
33
|
-
end
|
34
|
-
|
36
|
+
end
|
37
|
+
yield if block_given?
|
38
|
+
end
|
35
39
|
|
36
40
|
module Configurable #:nodoc:
|
37
41
|
def configuration(*args)
|
@@ -41,16 +45,16 @@ module Prawn
|
|
41
45
|
elsif args.length > 1
|
42
46
|
@config.values_at(*args)
|
43
47
|
elsif args.length == 1
|
44
|
-
@config[args[0]]
|
45
|
-
else
|
46
|
-
@config
|
48
|
+
@config[args[0]]
|
49
|
+
else
|
50
|
+
@config
|
47
51
|
end
|
48
|
-
end
|
52
|
+
end
|
49
53
|
|
50
54
|
alias_method :C, :configuration
|
51
55
|
end
|
52
|
-
end
|
53
|
-
|
56
|
+
end
|
57
|
+
|
54
58
|
require "prawn/compatibility"
|
55
59
|
require "prawn/errors"
|
56
60
|
require "prawn/pdf_object"
|
@@ -60,4 +64,6 @@ require "prawn/images/jpg"
|
|
60
64
|
require "prawn/images/png"
|
61
65
|
require "prawn/document"
|
62
66
|
require "prawn/reference"
|
63
|
-
require "prawn/font"
|
67
|
+
require "prawn/font"
|
68
|
+
require "prawn/encoding"
|
69
|
+
require "prawn/measurements"
|
data/lib/prawn/compatibility.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
# Why would we ever use Ruby 1.8.7 when we can backport with something
|
2
|
+
# as simple as this?
|
3
|
+
#
|
1
4
|
# encoding: utf-8
|
2
5
|
|
3
6
|
if RUBY_VERSION < "1.9"
|
@@ -14,7 +17,7 @@ if RUBY_VERSION < "1.9"
|
|
14
17
|
end
|
15
18
|
|
16
19
|
class File #:nodoc:
|
17
|
-
def self.
|
20
|
+
def self.binread(file)
|
18
21
|
File.open(file,"rb") { |f| f.read }
|
19
22
|
end
|
20
23
|
end
|
@@ -27,13 +30,7 @@ if RUBY_VERSION < "1.9"
|
|
27
30
|
false
|
28
31
|
end
|
29
32
|
|
30
|
-
else
|
31
|
-
|
32
|
-
class File #:nodoc:
|
33
|
-
def self.read_binary(file)
|
34
|
-
File.open(file,"rb:BINARY") { |f| f.read }
|
35
|
-
end
|
36
|
-
end
|
33
|
+
else
|
37
34
|
|
38
35
|
def ruby_18 #:nodoc:
|
39
36
|
false
|
data/lib/prawn/document.rb
CHANGED
@@ -9,19 +9,23 @@
|
|
9
9
|
require "stringio"
|
10
10
|
require "prawn/document/page_geometry"
|
11
11
|
require "prawn/document/bounding_box"
|
12
|
-
require "prawn/document/text"
|
12
|
+
require "prawn/document/text"
|
13
13
|
require "prawn/document/table"
|
14
14
|
require "prawn/document/internals"
|
15
15
|
require "prawn/document/span"
|
16
|
+
require "prawn/document/annotations"
|
17
|
+
require "prawn/document/destinations"
|
16
18
|
|
17
19
|
module Prawn
|
18
20
|
class Document
|
19
21
|
|
20
22
|
include Prawn::Document::Internals
|
21
|
-
include Prawn::
|
23
|
+
include Prawn::Document::Annotations
|
24
|
+
include Prawn::Document::Destinations
|
25
|
+
include Prawn::Graphics
|
22
26
|
include Prawn::Images
|
23
|
-
include Text
|
24
|
-
include PageGeometry
|
27
|
+
include Text
|
28
|
+
include PageGeometry
|
25
29
|
|
26
30
|
attr_accessor :y, :margin_box
|
27
31
|
attr_reader :margins, :page_size, :page_layout
|
@@ -59,14 +63,13 @@ module Prawn
|
|
59
63
|
#
|
60
64
|
# <tt>:page_size</tt>:: One of the Document::PageGeometry::SIZES [LETTER]
|
61
65
|
# <tt>:page_layout</tt>:: Either <tt>:portrait</tt> or <tt>:landscape</tt>
|
62
|
-
# <tt>:on_page_start</tt>:: Optional proc run at each page start
|
63
|
-
# <tt>:on_page_stop</tt>:: Optional proc run at each page stop
|
64
66
|
# <tt>:left_margin</tt>:: Sets the left margin in points [ 0.5 inch]
|
65
67
|
# <tt>:right_margin</tt>:: Sets the right margin in points [ 0.5 inch]
|
66
68
|
# <tt>:top_margin</tt>:: Sets the top margin in points [ 0.5 inch]
|
67
69
|
# <tt>:bottom_margin</tt>:: Sets the bottom margin in points [0.5 inch]
|
68
70
|
# <tt>:skip_page_creation</tt>:: Creates a document without starting the first page [false]
|
69
71
|
# <tt>:compress</tt>:: Compresses content streams before rendering them [false]
|
72
|
+
# <tt>:background</tt>:: An image path to be used as background on all pages [nil]
|
70
73
|
#
|
71
74
|
# Usage:
|
72
75
|
#
|
@@ -76,19 +79,23 @@ module Prawn
|
|
76
79
|
# # New document, A4 paper, landscaped
|
77
80
|
# pdf = Prawn::Document.new(:page_size => "A4", :page_layout => :landscape)
|
78
81
|
#
|
82
|
+
# # New document, with background
|
83
|
+
# pdf = Prawn::Document.new(:background => "#{Prawn::BASEDIR}/data/images/pigs.jpg")
|
84
|
+
#
|
79
85
|
def initialize(options={},&block)
|
80
|
-
Prawn.verify_options [:page_size, :page_layout, :
|
81
|
-
:
|
82
|
-
:
|
86
|
+
Prawn.verify_options [:page_size, :page_layout, :left_margin,
|
87
|
+
:right_margin, :top_margin, :bottom_margin, :skip_page_creation,
|
88
|
+
:compress, :skip_encoding, :text_options, :background ], options
|
83
89
|
|
84
90
|
@objects = []
|
85
91
|
@info = ref(:Creator => "Prawn", :Producer => "Prawn")
|
86
|
-
@pages = ref(:Type => :Pages, :Count => 0, :Kids => [])
|
87
|
-
@root = ref(:Type => :Catalog, :Pages => @pages)
|
92
|
+
@pages = ref(:Type => :Pages, :Count => 0, :Kids => [])
|
93
|
+
@root = ref(:Type => :Catalog, :Pages => @pages)
|
88
94
|
@page_size = options[:page_size] || "LETTER"
|
89
95
|
@page_layout = options[:page_layout] || :portrait
|
90
96
|
@compress = options[:compress] || false
|
91
97
|
@skip_encoding = options[:skip_encoding]
|
98
|
+
@background = options[:background]
|
92
99
|
|
93
100
|
text_options.update(options[:text_options] || {})
|
94
101
|
|
@@ -134,7 +141,9 @@ module Prawn
|
|
134
141
|
|
135
142
|
add_content "q"
|
136
143
|
|
137
|
-
@y = @bounding_box.absolute_top
|
144
|
+
@y = @bounding_box.absolute_top
|
145
|
+
|
146
|
+
image(@background, :at => [0,@y]) if @background
|
138
147
|
end
|
139
148
|
|
140
149
|
# Returns the number of pages in the document
|
@@ -147,6 +156,13 @@ module Prawn
|
|
147
156
|
def page_count
|
148
157
|
@pages.data[:Count]
|
149
158
|
end
|
159
|
+
|
160
|
+
# The current y drawing position relative to the innermost bounding box,
|
161
|
+
# or to the page margins at the top level.
|
162
|
+
#
|
163
|
+
def cursor
|
164
|
+
y - bounds.absolute_bottom
|
165
|
+
end
|
150
166
|
|
151
167
|
# Renders the PDF document to string
|
152
168
|
#
|
@@ -270,7 +286,7 @@ module Prawn
|
|
270
286
|
:Parent => @pages,
|
271
287
|
:MediaBox => page_dimensions,
|
272
288
|
:Contents => @page_content)
|
273
|
-
font.add_to_current_page if @
|
289
|
+
font.add_to_current_page if @font
|
274
290
|
update_colors
|
275
291
|
end
|
276
292
|
|