prawn 0.4.1 → 0.5.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/prawn.rb +2 -72
- metadata +33 -224
- data/COPYING +0 -340
- data/LICENSE +0 -56
- data/README +0 -40
- data/Rakefile +0 -79
- data/data/encodings/win_ansi.txt +0 -29
- data/data/fonts/Action Man.dfont +0 -0
- data/data/fonts/Activa.ttf +0 -0
- data/data/fonts/Chalkboard.ttf +0 -0
- data/data/fonts/Courier-Bold.afm +0 -342
- data/data/fonts/Courier-BoldOblique.afm +0 -342
- data/data/fonts/Courier-Oblique.afm +0 -342
- data/data/fonts/Courier.afm +0 -342
- data/data/fonts/DejaVuSans.ttf +0 -0
- data/data/fonts/Dustismo_Roman.ttf +0 -0
- data/data/fonts/Helvetica-Bold.afm +0 -2827
- data/data/fonts/Helvetica-BoldOblique.afm +0 -2827
- data/data/fonts/Helvetica-Oblique.afm +0 -3051
- data/data/fonts/Helvetica.afm +0 -3051
- data/data/fonts/MustRead.html +0 -19
- data/data/fonts/Symbol.afm +0 -213
- data/data/fonts/Times-Bold.afm +0 -2588
- data/data/fonts/Times-BoldItalic.afm +0 -2384
- data/data/fonts/Times-Italic.afm +0 -2667
- data/data/fonts/Times-Roman.afm +0 -2419
- data/data/fonts/ZapfDingbats.afm +0 -225
- data/data/fonts/comicsans.ttf +0 -0
- data/data/fonts/gkai00mp.ttf +0 -0
- data/data/images/arrow.png +0 -0
- data/data/images/arrow2.png +0 -0
- data/data/images/barcode_issue.png +0 -0
- data/data/images/dice.alpha +0 -0
- data/data/images/dice.dat +0 -0
- data/data/images/dice.png +0 -0
- data/data/images/fractal.jpg +0 -0
- data/data/images/letterhead.jpg +0 -0
- data/data/images/page_white_text.alpha +0 -0
- data/data/images/page_white_text.dat +0 -0
- data/data/images/page_white_text.png +0 -0
- data/data/images/pigs.jpg +0 -0
- data/data/images/rails.dat +0 -0
- data/data/images/rails.png +0 -0
- data/data/images/ruport.png +0 -0
- data/data/images/ruport_data.dat +0 -0
- data/data/images/ruport_transparent.png +0 -0
- data/data/images/ruport_type0.png +0 -0
- data/data/images/stef.jpg +0 -0
- data/data/images/web-links.dat +0 -1
- data/data/images/web-links.png +0 -0
- data/data/shift_jis_text.txt +0 -1
- data/examples/bounding_box/bounding_boxes.rb +0 -44
- data/examples/bounding_box/lazy_bounding_boxes.rb +0 -28
- data/examples/bounding_box/padded_box.rb +0 -24
- data/examples/bounding_box/russian_boxes.rb +0 -37
- data/examples/general/background.rb +0 -20
- data/examples/general/canvas.rb +0 -16
- data/examples/general/measurement_units.rb +0 -52
- data/examples/general/multi_page_layout.rb +0 -17
- data/examples/general/page_geometry.rb +0 -32
- data/examples/graphics/basic_images.rb +0 -27
- data/examples/graphics/cmyk.rb +0 -13
- data/examples/graphics/curves.rb +0 -12
- data/examples/graphics/hexagon.rb +0 -14
- data/examples/graphics/image_fit.rb +0 -16
- data/examples/graphics/image_flow.rb +0 -38
- data/examples/graphics/image_position.rb +0 -18
- data/examples/graphics/line.rb +0 -33
- data/examples/graphics/png_types.rb +0 -23
- data/examples/graphics/polygons.rb +0 -17
- data/examples/graphics/remote_images.rb +0 -12
- data/examples/graphics/ruport_style_helpers.rb +0 -20
- data/examples/graphics/stroke_bounds.rb +0 -23
- data/examples/m17n/chinese_text_wrapping.rb +0 -20
- data/examples/m17n/euro.rb +0 -16
- data/examples/m17n/sjis.rb +0 -29
- data/examples/m17n/utf8.rb +0 -14
- data/examples/m17n/win_ansi_charset.rb +0 -55
- data/examples/text/alignment.rb +0 -19
- data/examples/text/dfont.rb +0 -49
- data/examples/text/family_based_styling.rb +0 -25
- data/examples/text/flowing_text_with_header_and_footer.rb +0 -37
- data/examples/text/font_calculations.rb +0 -92
- data/examples/text/font_size.rb +0 -34
- data/examples/text/kerning.rb +0 -31
- data/examples/text/simple_text.rb +0 -18
- data/examples/text/simple_text_ttf.rb +0 -18
- data/examples/text/span.rb +0 -30
- data/examples/text/text_box.rb +0 -26
- data/examples/text/text_flow.rb +0 -68
- data/lib/prawn/compatibility.rb +0 -38
- data/lib/prawn/document.rb +0 -309
- data/lib/prawn/document/annotations.rb +0 -63
- data/lib/prawn/document/bounding_box.rb +0 -368
- data/lib/prawn/document/destinations.rb +0 -81
- data/lib/prawn/document/internals.rb +0 -126
- data/lib/prawn/document/page_geometry.rb +0 -79
- data/lib/prawn/document/span.rb +0 -55
- data/lib/prawn/document/text.rb +0 -185
- data/lib/prawn/document/text/box.rb +0 -76
- data/lib/prawn/document/text/wrapping.rb +0 -59
- data/lib/prawn/encoding.rb +0 -121
- data/lib/prawn/errors.rb +0 -40
- data/lib/prawn/font.rb +0 -277
- data/lib/prawn/font/afm.rb +0 -202
- data/lib/prawn/font/dfont.rb +0 -31
- data/lib/prawn/font/ttf.rb +0 -326
- data/lib/prawn/graphics.rb +0 -257
- data/lib/prawn/graphics/color.rb +0 -140
- data/lib/prawn/images.rb +0 -339
- data/lib/prawn/images/jpg.rb +0 -45
- data/lib/prawn/images/png.rb +0 -199
- data/lib/prawn/literal_string.rb +0 -14
- data/lib/prawn/measurement_extensions.rb +0 -46
- data/lib/prawn/measurements.rb +0 -71
- data/lib/prawn/name_tree.rb +0 -165
- data/lib/prawn/pdf_object.rb +0 -73
- data/lib/prawn/reference.rb +0 -59
- data/spec/annotations_spec.rb +0 -90
- data/spec/bounding_box_spec.rb +0 -141
- data/spec/destinations_spec.rb +0 -15
- data/spec/document_spec.rb +0 -193
- data/spec/font_spec.rb +0 -234
- data/spec/graphics_spec.rb +0 -209
- data/spec/images_spec.rb +0 -68
- data/spec/jpg_spec.rb +0 -25
- data/spec/measurement_units_spec.rb +0 -23
- data/spec/name_tree_spec.rb +0 -103
- data/spec/pdf_object_spec.rb +0 -112
- data/spec/png_spec.rb +0 -196
- data/spec/reference_spec.rb +0 -42
- data/spec/spec_helper.rb +0 -23
- data/spec/text_spec.rb +0 -178
- data/vendor/pdf-inspector/README +0 -18
- data/vendor/pdf-inspector/lib/pdf/inspector.rb +0 -25
- data/vendor/pdf-inspector/lib/pdf/inspector/graphics.rb +0 -80
- data/vendor/pdf-inspector/lib/pdf/inspector/page.rb +0 -16
- data/vendor/pdf-inspector/lib/pdf/inspector/text.rb +0 -31
- data/vendor/pdf-inspector/lib/pdf/inspector/xobject.rb +0 -19
- data/vendor/ttfunk/data/fonts/DejaVuSans.ttf +0 -0
- data/vendor/ttfunk/data/fonts/comicsans.ttf +0 -0
- data/vendor/ttfunk/example.rb +0 -45
- data/vendor/ttfunk/lib/ttfunk.rb +0 -102
- data/vendor/ttfunk/lib/ttfunk/directory.rb +0 -17
- data/vendor/ttfunk/lib/ttfunk/encoding/mac_roman.rb +0 -88
- data/vendor/ttfunk/lib/ttfunk/encoding/windows_1252.rb +0 -69
- data/vendor/ttfunk/lib/ttfunk/reader.rb +0 -44
- data/vendor/ttfunk/lib/ttfunk/resource_file.rb +0 -78
- data/vendor/ttfunk/lib/ttfunk/subset.rb +0 -18
- data/vendor/ttfunk/lib/ttfunk/subset/base.rb +0 -141
- data/vendor/ttfunk/lib/ttfunk/subset/mac_roman.rb +0 -46
- data/vendor/ttfunk/lib/ttfunk/subset/unicode.rb +0 -48
- data/vendor/ttfunk/lib/ttfunk/subset/unicode_8bit.rb +0 -63
- data/vendor/ttfunk/lib/ttfunk/subset/windows_1252.rb +0 -51
- data/vendor/ttfunk/lib/ttfunk/subset_collection.rb +0 -72
- data/vendor/ttfunk/lib/ttfunk/table.rb +0 -46
- data/vendor/ttfunk/lib/ttfunk/table/cmap.rb +0 -34
- data/vendor/ttfunk/lib/ttfunk/table/cmap/format00.rb +0 -54
- data/vendor/ttfunk/lib/ttfunk/table/cmap/format04.rb +0 -126
- data/vendor/ttfunk/lib/ttfunk/table/cmap/subtable.rb +0 -79
- data/vendor/ttfunk/lib/ttfunk/table/glyf.rb +0 -64
- data/vendor/ttfunk/lib/ttfunk/table/glyf/compound.rb +0 -81
- data/vendor/ttfunk/lib/ttfunk/table/glyf/simple.rb +0 -37
- data/vendor/ttfunk/lib/ttfunk/table/head.rb +0 -44
- data/vendor/ttfunk/lib/ttfunk/table/hhea.rb +0 -41
- data/vendor/ttfunk/lib/ttfunk/table/hmtx.rb +0 -47
- data/vendor/ttfunk/lib/ttfunk/table/kern.rb +0 -79
- data/vendor/ttfunk/lib/ttfunk/table/kern/format0.rb +0 -62
- data/vendor/ttfunk/lib/ttfunk/table/loca.rb +0 -43
- data/vendor/ttfunk/lib/ttfunk/table/maxp.rb +0 -40
- data/vendor/ttfunk/lib/ttfunk/table/name.rb +0 -119
- data/vendor/ttfunk/lib/ttfunk/table/os2.rb +0 -78
- data/vendor/ttfunk/lib/ttfunk/table/post.rb +0 -91
- data/vendor/ttfunk/lib/ttfunk/table/post/format10.rb +0 -43
- data/vendor/ttfunk/lib/ttfunk/table/post/format20.rb +0 -35
- data/vendor/ttfunk/lib/ttfunk/table/post/format25.rb +0 -23
- data/vendor/ttfunk/lib/ttfunk/table/post/format30.rb +0 -17
- data/vendor/ttfunk/lib/ttfunk/table/post/format40.rb +0 -17
- data/vendor/ttfunk/lib/ttfunk/table/simple.rb +0 -14
data/examples/text/text_flow.rb
DELETED
@@ -1,68 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
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'))
|
7
|
-
require "prawn"
|
8
|
-
|
9
|
-
content = <<-EOS
|
10
|
-
How does
|
11
|
-
Prawn deal with
|
12
|
-
white
|
13
|
-
space
|
14
|
-
|
15
|
-
and
|
16
|
-
|
17
|
-
line
|
18
|
-
breaks?
|
19
|
-
EOS
|
20
|
-
|
21
|
-
poem = <<-EOS
|
22
|
-
GOOD-BYE
|
23
|
-
|
24
|
-
Good-bye, proud world! I'm going home: Thou art not my friend, and I'm not thine. Long through thy weary crowds I roam; A river-ark on the ocean brine, Long I've been tossed like the driven foam: But now, proud world! I'm going home.
|
25
|
-
|
26
|
-
Good-bye to Flattery's fawning face; To Grandeur with his wise grimace; To upstart Wealth's averted eye; To supple Office, low and high; To crowded halls, to court and street; To frozen hearts and hasting feet; To those who go, and those who come; Good-bye, proud world! I'm going home.
|
27
|
-
|
28
|
-
I am going to my own hearth-stone, Bosomed in yon green hills alone,-- secret nook in a pleasant land, Whose groves the frolic fairies planned; Where arches green, the livelong day, Echo the blackbird's roundelay, And vulgar feet have never trod A spot that is sacred to thought and God.
|
29
|
-
|
30
|
-
O, when I am safe in my sylvan home, I tread on the pride of Greece and Rome; And when I am stretched beneath the pines, Where the evening star so holy shines, I laugh at the lore and the pride of man, At the sophist schools and the learned clan; For what are they all, in their high conceit, When man in the bush with God may meet?
|
31
|
-
EOS
|
32
|
-
|
33
|
-
overflow = "This text should flow gracefully onto the next page, like a stream"+
|
34
|
-
" flows elegantly from a mountain lake down into the village below."
|
35
|
-
|
36
|
-
Prawn::Document.generate("flow.pdf") do |pdf|
|
37
|
-
|
38
|
-
pdf.font "Times-Roman"
|
39
|
-
pdf.stroke_line [pdf.bounds.left, pdf.bounds.top],
|
40
|
-
[pdf.bounds.right, pdf.bounds.top]
|
41
|
-
|
42
|
-
pdf.text content, :size => 10
|
43
|
-
|
44
|
-
pdf.bounding_box([100,600], :width => 200, :height => 525) do
|
45
|
-
pdf.stroke_line [pdf.bounds.left, pdf.bounds.top],
|
46
|
-
[pdf.bounds.right, pdf.bounds.top]
|
47
|
-
pdf.text poem, :size => 12
|
48
|
-
end
|
49
|
-
|
50
|
-
pdf.bounding_box([325,600], :width => 200, :height => 525) do
|
51
|
-
pdf.stroke_line [pdf.bounds.left, pdf.bounds.top],
|
52
|
-
[pdf.bounds.right, pdf.bounds.top]
|
53
|
-
pdf.text poem.reverse, :size => 12
|
54
|
-
end
|
55
|
-
|
56
|
-
pdf.text overflow * 10, :size => 14
|
57
|
-
|
58
|
-
pdf.text "Hooray! We've conquered the evil PDF gods", :size => 36
|
59
|
-
|
60
|
-
pdf.bounding_box([100,450], :width => 300) do
|
61
|
-
pdf.stroke_line [pdf.bounds.left, pdf.bounds.top],
|
62
|
-
[pdf.bounds.right, pdf.bounds.top]
|
63
|
-
pdf.text poem, :size => 10, :spacing => 5
|
64
|
-
end
|
65
|
-
|
66
|
-
pdf.text "And this text automatically goes below the poem", :size => 18
|
67
|
-
|
68
|
-
end
|
data/lib/prawn/compatibility.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
#
|
3
|
-
# Why would we ever use Ruby 1.8.7 when we can backport with something
|
4
|
-
# as simple as this?
|
5
|
-
#
|
6
|
-
class String #:nodoc:
|
7
|
-
unless "".respond_to?(:lines)
|
8
|
-
alias_method :lines, :to_a
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
unless File.respond_to?(:binread)
|
13
|
-
def File.binread(file)
|
14
|
-
File.open(file,"rb") { |f| f.read }
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
if RUBY_VERSION < "1.9"
|
19
|
-
|
20
|
-
def ruby_18 #:nodoc:
|
21
|
-
yield
|
22
|
-
end
|
23
|
-
|
24
|
-
def ruby_19 #:nodoc:
|
25
|
-
false
|
26
|
-
end
|
27
|
-
|
28
|
-
else
|
29
|
-
|
30
|
-
def ruby_18 #:nodoc:
|
31
|
-
false
|
32
|
-
end
|
33
|
-
|
34
|
-
def ruby_19 #:nodoc:
|
35
|
-
yield
|
36
|
-
end
|
37
|
-
|
38
|
-
end
|
data/lib/prawn/document.rb
DELETED
@@ -1,309 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
# document.rb : Implements PDF document generation for Prawn
|
4
|
-
#
|
5
|
-
# Copyright April 2008, Gregory Brown. All Rights Reserved.
|
6
|
-
#
|
7
|
-
# This is free software. Please see the LICENSE and COPYING files for details.
|
8
|
-
|
9
|
-
require "stringio"
|
10
|
-
require "prawn/document/page_geometry"
|
11
|
-
require "prawn/document/bounding_box"
|
12
|
-
require "prawn/document/internals"
|
13
|
-
require "prawn/document/span"
|
14
|
-
require "prawn/document/text"
|
15
|
-
require "prawn/document/annotations"
|
16
|
-
require "prawn/document/destinations"
|
17
|
-
|
18
|
-
module Prawn
|
19
|
-
class Document
|
20
|
-
|
21
|
-
include Text
|
22
|
-
include PageGeometry
|
23
|
-
include Internals
|
24
|
-
include Annotations
|
25
|
-
include Destinations
|
26
|
-
include Prawn::Graphics
|
27
|
-
include Prawn::Images
|
28
|
-
|
29
|
-
attr_accessor :y, :margin_box
|
30
|
-
attr_reader :margins, :page_size, :page_layout
|
31
|
-
attr_writer :font_size
|
32
|
-
|
33
|
-
# Creates and renders a PDF document.
|
34
|
-
#
|
35
|
-
# When using the implicit block form, Prawn will evaluate the block
|
36
|
-
# within an instance of Prawn::Document, simplifying your syntax.
|
37
|
-
# However, please note that you will not be able to reference variables
|
38
|
-
# from the enclosing scope within this block.
|
39
|
-
#
|
40
|
-
# # Using implicit block form and rendering to a file
|
41
|
-
# Prawn::Document.generate "foo.pdf" do
|
42
|
-
# font "Times-Roman"
|
43
|
-
# text "Hello World", :at => [200,720], :size => 32
|
44
|
-
# end
|
45
|
-
#
|
46
|
-
# If you need to access your local and instance variables, use the explicit
|
47
|
-
# block form shown below. In this case, Prawn yields an instance of
|
48
|
-
# PDF::Document and the block is an ordinary closure:
|
49
|
-
#
|
50
|
-
# # Using explicit block form and rendering to a file
|
51
|
-
# content = "Hello World"
|
52
|
-
# Prawn::Document.generate "foo.pdf" do |pdf|
|
53
|
-
# pdf.font "Times-Roman"
|
54
|
-
# pdf.text content, :at => [200,720], :size => 32
|
55
|
-
# end
|
56
|
-
#
|
57
|
-
def self.generate(filename,options={},&block)
|
58
|
-
pdf = new(options,&block)
|
59
|
-
pdf.render_file(filename)
|
60
|
-
end
|
61
|
-
|
62
|
-
# Creates a new PDF Document. The following options are available:
|
63
|
-
#
|
64
|
-
# <tt>:page_size</tt>:: One of the Document::PageGeometry::SIZES [LETTER]
|
65
|
-
# <tt>:page_layout</tt>:: Either <tt>:portrait</tt> or <tt>:landscape</tt>
|
66
|
-
# <tt>:left_margin</tt>:: Sets the left margin in points [ 0.5 inch]
|
67
|
-
# <tt>:right_margin</tt>:: Sets the right margin in points [ 0.5 inch]
|
68
|
-
# <tt>:top_margin</tt>:: Sets the top margin in points [ 0.5 inch]
|
69
|
-
# <tt>:bottom_margin</tt>:: Sets the bottom margin in points [0.5 inch]
|
70
|
-
# <tt>:skip_page_creation</tt>:: Creates a document without starting the first page [false]
|
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]
|
73
|
-
#
|
74
|
-
# Usage:
|
75
|
-
#
|
76
|
-
# # New document, US Letter paper, portrait orientation
|
77
|
-
# pdf = Prawn::Document.new
|
78
|
-
#
|
79
|
-
# # New document, A4 paper, landscaped
|
80
|
-
# pdf = Prawn::Document.new(:page_size => "A4", :page_layout => :landscape)
|
81
|
-
#
|
82
|
-
# # New document, with background
|
83
|
-
# pdf = Prawn::Document.new(:background => "#{Prawn::BASEDIR}/data/images/pigs.jpg")
|
84
|
-
#
|
85
|
-
def initialize(options={},&block)
|
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
|
89
|
-
|
90
|
-
@objects = []
|
91
|
-
@info = ref(:Creator => "Prawn", :Producer => "Prawn")
|
92
|
-
@pages = ref(:Type => :Pages, :Count => 0, :Kids => [])
|
93
|
-
@root = ref(:Type => :Catalog, :Pages => @pages)
|
94
|
-
@page_size = options[:page_size] || "LETTER"
|
95
|
-
@page_layout = options[:page_layout] || :portrait
|
96
|
-
@compress = options[:compress] || false
|
97
|
-
@skip_encoding = options[:skip_encoding]
|
98
|
-
@background = options[:background]
|
99
|
-
@font_size = 12
|
100
|
-
|
101
|
-
text_options.update(options[:text_options] || {})
|
102
|
-
|
103
|
-
@margins = { :left => options[:left_margin] || 36,
|
104
|
-
:right => options[:right_margin] || 36,
|
105
|
-
:top => options[:top_margin] || 36,
|
106
|
-
:bottom => options[:bottom_margin] || 36 }
|
107
|
-
|
108
|
-
generate_margin_box
|
109
|
-
|
110
|
-
@bounding_box = @margin_box
|
111
|
-
|
112
|
-
start_new_page unless options[:skip_page_creation]
|
113
|
-
|
114
|
-
if block
|
115
|
-
block.arity < 1 ? instance_eval(&block) : block[self]
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
# Creates and advances to a new page in the document.
|
120
|
-
#
|
121
|
-
# Page size, margins, and layout can also be set when generating a
|
122
|
-
# new page. These values will become the new defaults for page creation
|
123
|
-
#
|
124
|
-
# pdf.start_new_page(:size => "LEGAL", :layout => :landscape)
|
125
|
-
# pdf.start_new_page(:left_margin => 50, :right_margin => 50)
|
126
|
-
#
|
127
|
-
def start_new_page(options = {})
|
128
|
-
@page_size = options[:size] if options[:size]
|
129
|
-
@page_layout = options[:layout] if options[:layout]
|
130
|
-
|
131
|
-
[:left,:right,:top,:bottom].each do |side|
|
132
|
-
if options[:"#{side}_margin"]
|
133
|
-
@margins[side] = options[:"#{side}_margin"]
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
finish_page_content if @page_content
|
138
|
-
build_new_page_content
|
139
|
-
|
140
|
-
@pages.data[:Kids] << @current_page
|
141
|
-
@pages.data[:Count] += 1
|
142
|
-
|
143
|
-
add_content "q"
|
144
|
-
|
145
|
-
@y = @bounding_box.absolute_top
|
146
|
-
|
147
|
-
image(@background, :at => [0,@y]) if @background
|
148
|
-
end
|
149
|
-
|
150
|
-
# Returns the number of pages in the document
|
151
|
-
#
|
152
|
-
# pdf = Prawn::Document.new
|
153
|
-
# pdf.page_count #=> 1
|
154
|
-
# 3.times { pdf.start_new_page }
|
155
|
-
# pdf.page_count #=> 4
|
156
|
-
#
|
157
|
-
def page_count
|
158
|
-
@pages.data[:Count]
|
159
|
-
end
|
160
|
-
|
161
|
-
# The current y drawing position relative to the innermost bounding box,
|
162
|
-
# or to the page margins at the top level.
|
163
|
-
#
|
164
|
-
def cursor
|
165
|
-
y - bounds.absolute_bottom
|
166
|
-
end
|
167
|
-
|
168
|
-
# Renders the PDF document to string
|
169
|
-
#
|
170
|
-
def render
|
171
|
-
output = StringIO.new
|
172
|
-
finish_page_content
|
173
|
-
|
174
|
-
render_header(output)
|
175
|
-
render_body(output)
|
176
|
-
render_xref(output)
|
177
|
-
render_trailer(output)
|
178
|
-
str = output.string
|
179
|
-
str.force_encoding("ASCII-8BIT") if str.respond_to?(:force_encoding)
|
180
|
-
str
|
181
|
-
end
|
182
|
-
|
183
|
-
# Renders the PDF document to file.
|
184
|
-
#
|
185
|
-
# pdf.render_file "foo.pdf"
|
186
|
-
#
|
187
|
-
def render_file(filename)
|
188
|
-
Kernel.const_defined?("Encoding") ? mode = "wb:ASCII-8BIT" : mode = "wb"
|
189
|
-
File.open(filename,mode) { |f| f << render }
|
190
|
-
end
|
191
|
-
|
192
|
-
# Returns the current BoundingBox object, which is by default
|
193
|
-
# the box represented by the margin box. When called from within
|
194
|
-
# a <tt>bounding_box</tt> block, the box defined by that call will
|
195
|
-
# be used.
|
196
|
-
#
|
197
|
-
def bounds
|
198
|
-
@bounding_box
|
199
|
-
end
|
200
|
-
|
201
|
-
# Sets Document#bounds to the BoundingBox provided. If you don't know
|
202
|
-
# why you'd need to do this, chances are, you can ignore this feature
|
203
|
-
#
|
204
|
-
def bounds=(bounding_box)
|
205
|
-
@bounding_box = bounding_box
|
206
|
-
end
|
207
|
-
|
208
|
-
# Moves up the document by n points
|
209
|
-
#
|
210
|
-
def move_up(n)
|
211
|
-
self.y += n
|
212
|
-
end
|
213
|
-
|
214
|
-
# Moves down the document by n point
|
215
|
-
#
|
216
|
-
def move_down(n)
|
217
|
-
self.y -= n
|
218
|
-
end
|
219
|
-
|
220
|
-
# Moves down the document and then executes a block.
|
221
|
-
#
|
222
|
-
# pdf.text "some text"
|
223
|
-
# pdf.pad_top(100) do
|
224
|
-
# pdf.text "This is 100 points below the previous line of text"
|
225
|
-
# end
|
226
|
-
# pdf.text "This text appears right below the previous line of text"
|
227
|
-
#
|
228
|
-
def pad_top(y)
|
229
|
-
move_down(y)
|
230
|
-
yield
|
231
|
-
end
|
232
|
-
|
233
|
-
# Executes a block then moves down the document
|
234
|
-
#
|
235
|
-
# pdf.text "some text"
|
236
|
-
# pdf.pad_bottom(100) do
|
237
|
-
# pdf.text "This text appears right below the previous line of text"
|
238
|
-
# end
|
239
|
-
# pdf.text "This is 100 points below the previous line of text"
|
240
|
-
#
|
241
|
-
def pad_bottom(y)
|
242
|
-
yield
|
243
|
-
move_down(y)
|
244
|
-
end
|
245
|
-
|
246
|
-
# Moves down the document by y, executes a block, then moves down the
|
247
|
-
# document by y again.
|
248
|
-
#
|
249
|
-
# pdf.text "some text"
|
250
|
-
# pdf.pad(100) do
|
251
|
-
# pdf.text "This is 100 points below the previous line of text"
|
252
|
-
# end
|
253
|
-
# pdf.text "This is 100 points below the previous line of text"
|
254
|
-
#
|
255
|
-
def pad(y)
|
256
|
-
move_down(y)
|
257
|
-
yield
|
258
|
-
move_down(y)
|
259
|
-
end
|
260
|
-
|
261
|
-
def mask(*fields) # :nodoc:
|
262
|
-
# Stores the current state of the named attributes, executes the block, and
|
263
|
-
# then restores the original values after the block has executed.
|
264
|
-
# -- I will remove the nodoc if/when this feature is a little less hacky
|
265
|
-
stored = {}
|
266
|
-
fields.each { |f| stored[f] = send(f) }
|
267
|
-
yield
|
268
|
-
fields.each { |f| send("#{f}=", stored[f]) }
|
269
|
-
end
|
270
|
-
|
271
|
-
# Returns true if content streams will be compressed before rendering,
|
272
|
-
# false otherwise
|
273
|
-
#
|
274
|
-
def compression_enabled?
|
275
|
-
!!@compress
|
276
|
-
end
|
277
|
-
|
278
|
-
private
|
279
|
-
|
280
|
-
# See Prawn::Document::Internals for low-level PDF functions
|
281
|
-
|
282
|
-
def build_new_page_content
|
283
|
-
generate_margin_box
|
284
|
-
@page_content = ref(:Length => 0)
|
285
|
-
|
286
|
-
@current_page = ref(:Type => :Page,
|
287
|
-
:Parent => @pages,
|
288
|
-
:MediaBox => page_dimensions,
|
289
|
-
:Contents => @page_content)
|
290
|
-
update_colors
|
291
|
-
end
|
292
|
-
|
293
|
-
def generate_margin_box
|
294
|
-
old_margin_box = @margin_box
|
295
|
-
@margin_box = BoundingBox.new(
|
296
|
-
self,
|
297
|
-
[ @margins[:left], page_dimensions[-1] - @margins[:top] ] ,
|
298
|
-
:width => page_dimensions[-2] - (@margins[:left] + @margins[:right]),
|
299
|
-
:height => page_dimensions[-1] - (@margins[:top] + @margins[:bottom])
|
300
|
-
)
|
301
|
-
|
302
|
-
# update bounding box if not flowing from the previous page
|
303
|
-
# FIXME: This may have a bug where the old margin is restored
|
304
|
-
# when the bounding box exits.
|
305
|
-
@bounding_box = @margin_box if old_margin_box == @bounding_box
|
306
|
-
end
|
307
|
-
|
308
|
-
end
|
309
|
-
end
|
@@ -1,63 +0,0 @@
|
|
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
|