alphasights-prawn 0.10.0
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/COPYING +340 -0
- data/HACKING +50 -0
- data/LICENSE +56 -0
- data/README +141 -0
- data/Rakefile +52 -0
- data/data/encodings/win_ansi.txt +29 -0
- 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 +342 -0
- data/data/fonts/Courier-BoldOblique.afm +342 -0
- data/data/fonts/Courier-Oblique.afm +342 -0
- data/data/fonts/Courier.afm +342 -0
- data/data/fonts/DejaVuSans.ttf +0 -0
- data/data/fonts/Dustismo_Roman.ttf +0 -0
- data/data/fonts/Helvetica-Bold.afm +2827 -0
- data/data/fonts/Helvetica-BoldOblique.afm +2827 -0
- data/data/fonts/Helvetica-Oblique.afm +3051 -0
- data/data/fonts/Helvetica.afm +3051 -0
- data/data/fonts/MustRead.html +19 -0
- data/data/fonts/Symbol.afm +213 -0
- data/data/fonts/Times-Bold.afm +2588 -0
- data/data/fonts/Times-BoldItalic.afm +2384 -0
- data/data/fonts/Times-Italic.afm +2667 -0
- data/data/fonts/Times-Roman.afm +2419 -0
- data/data/fonts/ZapfDingbats.afm +225 -0
- data/data/fonts/comicsans.ttf +0 -0
- data/data/fonts/gkai00mp.ttf +0 -0
- data/data/images/16bit.alpha +0 -0
- data/data/images/16bit.dat +0 -0
- data/data/images/16bit.png +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/dice_interlaced.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/tru256.bmp +0 -0
- data/data/images/web-links.dat +1 -0
- data/data/images/web-links.png +0 -0
- data/data/pdfs/complex_template.pdf +0 -0
- data/data/pdfs/contains_ttf_font.pdf +0 -0
- data/data/pdfs/encrypted.pdf +0 -0
- data/data/pdfs/hexagon.pdf +61 -0
- data/data/pdfs/indirect_reference.pdf +86 -0
- data/data/pdfs/nested_pages.pdf +118 -0
- data/data/pdfs/resources_as_indirect_object.pdf +83 -0
- data/data/pdfs/two_hexagons.pdf +90 -0
- data/data/pdfs/version_1_6.pdf +61 -0
- data/data/shift_jis_text.txt +1 -0
- data/examples/bounding_box/bounding_boxes.rb +43 -0
- data/examples/bounding_box/indentation.rb +34 -0
- data/examples/bounding_box/russian_boxes.rb +36 -0
- data/examples/bounding_box/stretched_nesting.rb +67 -0
- data/examples/builder/simple.rb +28 -0
- data/examples/example_helper.rb +4 -0
- data/examples/general/background.rb +23 -0
- data/examples/general/canvas.rb +15 -0
- data/examples/general/context_sensitive_headers.rb +37 -0
- data/examples/general/float.rb +11 -0
- data/examples/general/margin.rb +36 -0
- data/examples/general/measurement_units.rb +51 -0
- data/examples/general/metadata-info.rb +16 -0
- data/examples/general/multi_page_layout.rb +18 -0
- data/examples/general/outlines.rb +50 -0
- data/examples/general/page_geometry.rb +31 -0
- data/examples/general/page_numbering.rb +15 -0
- data/examples/general/repeaters.rb +47 -0
- data/examples/general/stamp.rb +41 -0
- data/examples/general/templates.rb +13 -0
- data/examples/graphics/basic_images.rb +23 -0
- data/examples/graphics/chunkable.rb +38 -0
- data/examples/graphics/cmyk.rb +12 -0
- data/examples/graphics/curves.rb +11 -0
- data/examples/graphics/hexagon.rb +13 -0
- data/examples/graphics/image_fit.rb +15 -0
- data/examples/graphics/image_flow.rb +37 -0
- data/examples/graphics/image_position.rb +17 -0
- data/examples/graphics/line.rb +32 -0
- data/examples/graphics/png_types.rb +22 -0
- data/examples/graphics/polygons.rb +16 -0
- data/examples/graphics/remote_images.rb +12 -0
- data/examples/graphics/rounded_polygons.rb +19 -0
- data/examples/graphics/rounded_rectangle.rb +20 -0
- data/examples/graphics/ruport_style_helpers.rb +19 -0
- data/examples/graphics/stroke_bounds.rb +20 -0
- data/examples/graphics/stroke_cap_and_join.rb +45 -0
- data/examples/graphics/stroke_dash.rb +42 -0
- data/examples/graphics/transformations.rb +52 -0
- data/examples/graphics/transparency.rb +26 -0
- data/examples/m17n/chinese_text_wrapping.rb +17 -0
- data/examples/m17n/euro.rb +15 -0
- data/examples/m17n/sjis.rb +28 -0
- data/examples/m17n/utf8.rb +13 -0
- data/examples/m17n/win_ansi_charset.rb +54 -0
- data/examples/security/hello_foo.rb +8 -0
- data/examples/table/bill.rb +53 -0
- data/examples/table/cell.rb +12 -0
- data/examples/table/checkerboard.rb +22 -0
- data/examples/table/header.rb +14 -0
- data/examples/table/inline_format_table.rb +12 -0
- data/examples/table/multi_page_table.rb +9 -0
- data/examples/table/simple_table.rb +24 -0
- data/examples/table/subtable.rb +12 -0
- data/examples/table/widths.rb +20 -0
- data/examples/text/alignment.rb +18 -0
- data/examples/text/character_spacing.rb +12 -0
- data/examples/text/dfont.rb +48 -0
- data/examples/text/family_based_styling.rb +24 -0
- data/examples/text/font_calculations.rb +91 -0
- data/examples/text/font_size.rb +33 -0
- data/examples/text/hyphenation.rb +45 -0
- data/examples/text/indent_paragraphs.rb +22 -0
- data/examples/text/inline_format.rb +103 -0
- data/examples/text/kerning.rb +30 -0
- data/examples/text/rotated.rb +98 -0
- data/examples/text/shaped_text_box.rb +31 -0
- data/examples/text/simple_text.rb +17 -0
- data/examples/text/simple_text_ttf.rb +17 -0
- data/examples/text/text_box.rb +88 -0
- data/examples/text/text_box_returning_excess.rb +51 -0
- data/examples/text/text_flow.rb +67 -0
- data/lib/prawn.rb +27 -0
- data/lib/prawn/canvas.rb +119 -0
- data/lib/prawn/chunkable.rb +37 -0
- data/lib/prawn/compatibility.rb +51 -0
- data/lib/prawn/core.rb +85 -0
- data/lib/prawn/core/annotations.rb +61 -0
- data/lib/prawn/core/byte_string.rb +9 -0
- data/lib/prawn/core/chunk.rb +36 -0
- data/lib/prawn/core/destinations.rb +90 -0
- data/lib/prawn/core/document_state.rb +78 -0
- data/lib/prawn/core/literal_string.rb +16 -0
- data/lib/prawn/core/name_tree.rb +165 -0
- data/lib/prawn/core/object_store.rb +236 -0
- data/lib/prawn/core/page.rb +179 -0
- data/lib/prawn/core/pdf_object.rb +108 -0
- data/lib/prawn/core/reference.rb +112 -0
- data/lib/prawn/core/text.rb +140 -0
- data/lib/prawn/core/text/formatted/arranger.rb +266 -0
- data/lib/prawn/core/text/formatted/line_wrap.rb +127 -0
- data/lib/prawn/core/text/formatted/wrap.rb +112 -0
- data/lib/prawn/core/text/line_wrap.rb +209 -0
- data/lib/prawn/core/text/wrap.rb +80 -0
- data/lib/prawn/document.rb +573 -0
- data/lib/prawn/document/bounding_box.rb +425 -0
- data/lib/prawn/document/graphics_state.rb +48 -0
- data/lib/prawn/document/internals.rb +170 -0
- data/lib/prawn/document/page_geometry.rb +136 -0
- data/lib/prawn/document/snapshot.rb +87 -0
- data/lib/prawn/document_builder.rb +51 -0
- data/lib/prawn/document_builder/command.rb +38 -0
- data/lib/prawn/document_builder/constructs.rb +2 -0
- data/lib/prawn/document_builder/constructs/flowing_text_construct.rb +18 -0
- data/lib/prawn/document_builder/constructs/path_construct.rb +9 -0
- data/lib/prawn/document_builder/layout.rb +25 -0
- data/lib/prawn/document_builder/modifications.rb +2 -0
- data/lib/prawn/document_builder/modifications/layout_modification.rb +9 -0
- data/lib/prawn/document_builder/modifications/path_modification.rb +9 -0
- data/lib/prawn/encoding.rb +121 -0
- data/lib/prawn/errors.rb +94 -0
- data/lib/prawn/font.rb +341 -0
- data/lib/prawn/font/afm.rb +225 -0
- data/lib/prawn/font/dfont.rb +42 -0
- data/lib/prawn/font/ttf.rb +350 -0
- data/lib/prawn/graphics.rb +325 -0
- data/lib/prawn/graphics/cap_style.rb +38 -0
- data/lib/prawn/graphics/color.rb +205 -0
- data/lib/prawn/graphics/dash.rb +71 -0
- data/lib/prawn/graphics/join_style.rb +38 -0
- data/lib/prawn/graphics/transformation.rb +156 -0
- data/lib/prawn/graphics/transparency.rb +99 -0
- data/lib/prawn/images.rb +348 -0
- data/lib/prawn/images/jpg.rb +46 -0
- data/lib/prawn/images/png.rb +226 -0
- data/lib/prawn/measurement_extensions.rb +46 -0
- data/lib/prawn/measurements.rb +71 -0
- data/lib/prawn/outline.rb +278 -0
- data/lib/prawn/repeater.rb +129 -0
- data/lib/prawn/security.rb +262 -0
- data/lib/prawn/security/arcfour.rb +51 -0
- data/lib/prawn/stamp.rb +126 -0
- data/lib/prawn/table.rb +421 -0
- data/lib/prawn/table/accessors.rb +180 -0
- data/lib/prawn/table/cell.rb +350 -0
- data/lib/prawn/table/cell/in_table.rb +27 -0
- data/lib/prawn/table/cell/subtable.rb +65 -0
- data/lib/prawn/table/cell/text.rb +125 -0
- data/lib/prawn/text.rb +449 -0
- data/lib/prawn/text/box.rb +392 -0
- data/lib/prawn/text/formatted.rb +4 -0
- data/lib/prawn/text/formatted/box.rb +228 -0
- data/lib/prawn/text/formatted/fragment.rb +181 -0
- data/lib/prawn/text/formatted/parser.rb +213 -0
- data/spec/annotations_spec.rb +90 -0
- data/spec/bounding_box_spec.rb +190 -0
- data/spec/cell_spec.rb +348 -0
- data/spec/destinations_spec.rb +15 -0
- data/spec/document_spec.rb +473 -0
- data/spec/font_spec.rb +324 -0
- data/spec/formatted_text_arranger_spec.rb +426 -0
- data/spec/formatted_text_box_spec.rb +756 -0
- data/spec/formatted_text_fragment_spec.rb +211 -0
- data/spec/graphics_spec.rb +446 -0
- data/spec/images_spec.rb +96 -0
- data/spec/inline_formatted_text_parser_spec.rb +502 -0
- data/spec/jpg_spec.rb +25 -0
- data/spec/line_wrap_spec.rb +341 -0
- data/spec/measurement_units_spec.rb +23 -0
- data/spec/name_tree_spec.rb +112 -0
- data/spec/object_store_spec.rb +160 -0
- data/spec/outline_spec.rb +269 -0
- data/spec/pdf_object_spec.rb +170 -0
- data/spec/png_spec.rb +237 -0
- data/spec/reference_spec.rb +82 -0
- data/spec/repeater_spec.rb +96 -0
- data/spec/security_spec.rb +120 -0
- data/spec/snapshot_spec.rb +138 -0
- data/spec/spec_helper.rb +26 -0
- data/spec/stamp_spec.rb +108 -0
- data/spec/stroke_styles_spec.rb +163 -0
- data/spec/table_spec.rb +598 -0
- data/spec/template_spec.rb +158 -0
- data/spec/text_at_spec.rb +119 -0
- data/spec/text_box_spec.rb +742 -0
- data/spec/text_spacing_spec.rb +75 -0
- data/spec/text_spec.rb +333 -0
- data/spec/text_with_inline_formatting_spec.rb +193 -0
- data/spec/transparency_spec.rb +89 -0
- metadata +331 -0
|
@@ -0,0 +1,170 @@
|
|
|
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
|
+
|
|
9
|
+
module Prawn
|
|
10
|
+
class Document
|
|
11
|
+
|
|
12
|
+
# This module exposes a few low-level PDF features for those who want
|
|
13
|
+
# to extend Prawn's core functionality. If you are not comfortable with
|
|
14
|
+
# low level PDF functionality as defined by Adobe's specification, chances
|
|
15
|
+
# are you won't need anything you find here.
|
|
16
|
+
#
|
|
17
|
+
module Internals
|
|
18
|
+
|
|
19
|
+
# Creates a new Prawn::Reference and adds it to the Document's object
|
|
20
|
+
# list. The +data+ argument is anything that Prawn::PdfObject() can convert.
|
|
21
|
+
#
|
|
22
|
+
# Returns the identifier which points to the reference in the ObjectStore
|
|
23
|
+
#
|
|
24
|
+
def ref(data)
|
|
25
|
+
ref!(data).identifier
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Like ref, but returns the actual reference instead of its identifier.
|
|
29
|
+
#
|
|
30
|
+
# While you can use this to build up nested references within the object
|
|
31
|
+
# tree, it is recommended to persist only identifiers, and them provide
|
|
32
|
+
# helper methods to look up the actual references in the ObjectStore
|
|
33
|
+
# if needed. If you take this approach, Prawn::Document::Snapshot
|
|
34
|
+
# will probably work with your extension
|
|
35
|
+
#
|
|
36
|
+
def ref!(data)
|
|
37
|
+
state.store.ref(data)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# At any stage in the object tree an object can be replaced with an
|
|
41
|
+
# indirect reference. To get access to the object safely, regardless
|
|
42
|
+
# of if it's hidden behind a Prawn::Reference, wrap it in deref().
|
|
43
|
+
#
|
|
44
|
+
def deref(obj)
|
|
45
|
+
obj.is_a?(Prawn::Core::Reference) ? obj.data : obj
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Appends a raw string to the current page content.
|
|
49
|
+
#
|
|
50
|
+
# # Raw line drawing example:
|
|
51
|
+
# x1,y1,x2,y2 = 100,500,300,550
|
|
52
|
+
# pdf.add_content("%.3f %.3f m" % [ x1, y1 ]) # move
|
|
53
|
+
# pdf.add_content("%.3f %.3f l" % [ x2, y2 ]) # draw path
|
|
54
|
+
# pdf.add_content("S") # stroke
|
|
55
|
+
#
|
|
56
|
+
def add_content(str)
|
|
57
|
+
state.page.content << str << "\n"
|
|
58
|
+
end
|
|
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
|
+
#
|
|
64
|
+
def names
|
|
65
|
+
state.store.root.data[:Names] ||= ref!(:Type => :Names)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Returns true if the Names dictionary is in use for this document.
|
|
69
|
+
#
|
|
70
|
+
def names?
|
|
71
|
+
state.store.root.data[:Names]
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Defines a block to be called just before the document is rendered.
|
|
75
|
+
#
|
|
76
|
+
def before_render(&block)
|
|
77
|
+
state.before_render_callbacks << block
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Defines a block to be called just before a new page is started.
|
|
81
|
+
#
|
|
82
|
+
def on_page_create(&block)
|
|
83
|
+
if block_given?
|
|
84
|
+
state.on_page_create_callback = block
|
|
85
|
+
else
|
|
86
|
+
state.on_page_create_callback = nil
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
private
|
|
91
|
+
|
|
92
|
+
# adds a new, empty content stream to each page. Used in templating so
|
|
93
|
+
# that imported content streams can be left pristine
|
|
94
|
+
#
|
|
95
|
+
def fresh_content_streams(options={})
|
|
96
|
+
(1..page_count).each do |i|
|
|
97
|
+
go_to_page i
|
|
98
|
+
state.page.new_content_stream
|
|
99
|
+
apply_margin_options(options)
|
|
100
|
+
use_graphic_settings
|
|
101
|
+
save_graphics_state
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def finalize_all_page_contents
|
|
106
|
+
(1..page_count).each do |i|
|
|
107
|
+
go_to_page i
|
|
108
|
+
repeaters.each { |r| r.run(i) }
|
|
109
|
+
restore_graphics_state
|
|
110
|
+
state.page.finalize
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# raise the PDF version of the file we're going to generate.
|
|
115
|
+
# A private method, designed for internal use when the user adds a feature
|
|
116
|
+
# to their document that requires a particular version.
|
|
117
|
+
#
|
|
118
|
+
def min_version(min)
|
|
119
|
+
state.version = min if min > state.version
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Write out the PDF Header, as per spec 3.4.1
|
|
123
|
+
#
|
|
124
|
+
def render_header(output)
|
|
125
|
+
state.before_render_actions(self)
|
|
126
|
+
|
|
127
|
+
# pdf version
|
|
128
|
+
output << "%PDF-#{state.version}\n"
|
|
129
|
+
|
|
130
|
+
# 4 binary chars, as recommended by the spec
|
|
131
|
+
output << "%\xFF\xFF\xFF\xFF\n"
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Write out the PDF Body, as per spec 3.4.2
|
|
135
|
+
#
|
|
136
|
+
def render_body(output)
|
|
137
|
+
state.render_body(output)
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# Write out the PDF Cross Reference Table, as per spec 3.4.3
|
|
141
|
+
#
|
|
142
|
+
def render_xref(output)
|
|
143
|
+
@xref_offset = output.size
|
|
144
|
+
output << "xref\n"
|
|
145
|
+
output << "0 #{state.store.size + 1}\n"
|
|
146
|
+
output << "0000000000 65535 f \n"
|
|
147
|
+
state.store.each do |ref|
|
|
148
|
+
output.printf("%010d", ref.offset)
|
|
149
|
+
output << " 00000 n \n"
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
# Write out the PDF Trailer, as per spec 3.4.4
|
|
154
|
+
#
|
|
155
|
+
def render_trailer(output)
|
|
156
|
+
trailer_hash = {:Size => state.store.size + 1,
|
|
157
|
+
:Root => state.store.root,
|
|
158
|
+
:Info => state.store.info}
|
|
159
|
+
trailer_hash.merge!(state.trailer) if state.trailer
|
|
160
|
+
|
|
161
|
+
output << "trailer\n"
|
|
162
|
+
output << Prawn::Core::PdfObject(trailer_hash) << "\n"
|
|
163
|
+
output << "startxref\n"
|
|
164
|
+
output << @xref_offset << "\n"
|
|
165
|
+
output << "%%EOF" << "\n"
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
end
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
# page_geometry.rb : Describes PDF page geometries
|
|
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
|
+
module Prawn
|
|
10
|
+
class Document
|
|
11
|
+
|
|
12
|
+
# Dimensions pulled from PDF::Writer, rubyforge.org/projects/ruby-pdf
|
|
13
|
+
#
|
|
14
|
+
# All of these dimensions are in PDF Points, see Prawn::Measurements for
|
|
15
|
+
# conversion utilities.
|
|
16
|
+
#
|
|
17
|
+
# Additionally, if the size you are after is not listed below, you can always
|
|
18
|
+
# specify your size by passing an array of width and height to Prawn::Document.new
|
|
19
|
+
# like:
|
|
20
|
+
#
|
|
21
|
+
# Prawn::Document.new(:page_size => [1000, 20000])
|
|
22
|
+
#
|
|
23
|
+
# The sizes below can be used by passing the appropriate string to :size:
|
|
24
|
+
#
|
|
25
|
+
# Prawn::Document.new(:page_size => '2A0')
|
|
26
|
+
#
|
|
27
|
+
# ===Inbuilt Sizes:
|
|
28
|
+
#
|
|
29
|
+
#
|
|
30
|
+
# 4A0:: => 4767.87 x 6740.79
|
|
31
|
+
# 2A0:: => 3370.39 x 4767.87
|
|
32
|
+
# A0:: => 2383.94 x 3370.39
|
|
33
|
+
# A1:: => 1683.78 x 2383.94
|
|
34
|
+
# A2:: => 1190.55 x 1683.78
|
|
35
|
+
# A3:: => 841.89 x 1190.55
|
|
36
|
+
# A4:: => 595.28 x 841.89
|
|
37
|
+
# A5:: => 419.53 x 595.28
|
|
38
|
+
# A6:: => 297.64 x 419.53
|
|
39
|
+
# A7:: => 209.76 x 297.64
|
|
40
|
+
# A8:: => 147.40 x 209.76
|
|
41
|
+
# A9:: => 104.88 x 147.40
|
|
42
|
+
# A10:: => 73.70 x 104.88
|
|
43
|
+
# B0:: => 2834.65 x 4008.19
|
|
44
|
+
# B1:: => 2004.09 x 2834.65
|
|
45
|
+
# B2:: => 1417.32 x 2004.09
|
|
46
|
+
# B3:: => 1000.63 x 1417.32
|
|
47
|
+
# B4:: => 708.66 x 1000.63
|
|
48
|
+
# B5:: => 498.90 x 708.66
|
|
49
|
+
# B6:: => 354.33 x 498.90
|
|
50
|
+
# B7:: => 249.45 x 354.33
|
|
51
|
+
# B8:: => 175.75 x 249.45
|
|
52
|
+
# B9:: => 124.72 x 175.75
|
|
53
|
+
# B10:: => 87.87 x 124.72
|
|
54
|
+
# C0:: => 2599.37 x 3676.54
|
|
55
|
+
# C1:: => 1836.85 x 2599.37
|
|
56
|
+
# C2:: => 1298.27 x 1836.85
|
|
57
|
+
# C3:: => 918.43 x 1298.27
|
|
58
|
+
# C4:: => 649.13 x 918.43
|
|
59
|
+
# C5:: => 459.21 x 649.13
|
|
60
|
+
# C6:: => 323.15 x 459.21
|
|
61
|
+
# C7:: => 229.61 x 323.15
|
|
62
|
+
# C8:: => 161.57 x 229.61
|
|
63
|
+
# C9:: => 113.39 x 161.57
|
|
64
|
+
# C10:: => 79.37 x 113.39
|
|
65
|
+
# RA0:: => 2437.80 x 3458.27
|
|
66
|
+
# RA1:: => 1729.13 x 2437.80
|
|
67
|
+
# RA2:: => 1218.90 x 1729.13
|
|
68
|
+
# RA3:: => 864.57 x 1218.90
|
|
69
|
+
# RA4:: => 609.45 x 864.57
|
|
70
|
+
# SRA0:: => 2551.18 x 3628.35
|
|
71
|
+
# SRA1:: => 1814.17 x 2551.18
|
|
72
|
+
# SRA2:: => 1275.59 x 1814.17
|
|
73
|
+
# SRA3:: => 907.09 x 1275.59
|
|
74
|
+
# SRA4:: => 637.80 x 907.09
|
|
75
|
+
# EXECUTIVE:: => 521.86 x 756.00
|
|
76
|
+
# FOLIO:: => 612.00 x 936.00
|
|
77
|
+
# LEGAL:: => 612.00 x 1008.00
|
|
78
|
+
# LETTER:: => 612.00 x 792.00
|
|
79
|
+
# TABLOID:: => 792.00 x 1224.00
|
|
80
|
+
#
|
|
81
|
+
module PageGeometry
|
|
82
|
+
|
|
83
|
+
SIZES = { "4A0" => [4767.87, 6740.79],
|
|
84
|
+
"2A0" => [3370.39, 4767.87],
|
|
85
|
+
"A0" => [2383.94, 3370.39],
|
|
86
|
+
"A1" => [1683.78, 2383.94],
|
|
87
|
+
"A2" => [1190.55, 1683.78],
|
|
88
|
+
"A3" => [841.89, 1190.55],
|
|
89
|
+
"A4" => [595.28, 841.89],
|
|
90
|
+
"A5" => [419.53, 595.28],
|
|
91
|
+
"A6" => [297.64, 419.53],
|
|
92
|
+
"A7" => [209.76, 297.64],
|
|
93
|
+
"A8" => [147.40, 209.76],
|
|
94
|
+
"A9" => [104.88, 147.40],
|
|
95
|
+
"A10" => [73.70, 104.88],
|
|
96
|
+
"B0" => [2834.65, 4008.19],
|
|
97
|
+
"B1" => [2004.09, 2834.65],
|
|
98
|
+
"B2" => [1417.32, 2004.09],
|
|
99
|
+
"B3" => [1000.63, 1417.32],
|
|
100
|
+
"B4" => [708.66, 1000.63],
|
|
101
|
+
"B5" => [498.90, 708.66],
|
|
102
|
+
"B6" => [354.33, 498.90],
|
|
103
|
+
"B7" => [249.45, 354.33],
|
|
104
|
+
"B8" => [175.75, 249.45],
|
|
105
|
+
"B9" => [124.72, 175.75],
|
|
106
|
+
"B10" => [87.87, 124.72],
|
|
107
|
+
"C0" => [2599.37, 3676.54],
|
|
108
|
+
"C1" => [1836.85, 2599.37],
|
|
109
|
+
"C2" => [1298.27, 1836.85],
|
|
110
|
+
"C3" => [918.43, 1298.27],
|
|
111
|
+
"C4" => [649.13, 918.43],
|
|
112
|
+
"C5" => [459.21, 649.13],
|
|
113
|
+
"C6" => [323.15, 459.21],
|
|
114
|
+
"C7" => [229.61, 323.15],
|
|
115
|
+
"C8" => [161.57, 229.61],
|
|
116
|
+
"C9" => [113.39, 161.57],
|
|
117
|
+
"C10" => [79.37, 113.39],
|
|
118
|
+
"RA0" => [2437.80, 3458.27],
|
|
119
|
+
"RA1" => [1729.13, 2437.80],
|
|
120
|
+
"RA2" => [1218.90, 1729.13],
|
|
121
|
+
"RA3" => [864.57, 1218.90],
|
|
122
|
+
"RA4" => [609.45, 864.57],
|
|
123
|
+
"SRA0" => [2551.18, 3628.35],
|
|
124
|
+
"SRA1" => [1814.17, 2551.18],
|
|
125
|
+
"SRA2" => [1275.59, 1814.17],
|
|
126
|
+
"SRA3" => [907.09, 1275.59],
|
|
127
|
+
"SRA4" => [637.80, 907.09],
|
|
128
|
+
"EXECUTIVE" => [521.86, 756.00],
|
|
129
|
+
"FOLIO" => [612.00, 936.00],
|
|
130
|
+
"LEGAL" => [612.00, 1008.00],
|
|
131
|
+
"LETTER" => [612.00, 792.00],
|
|
132
|
+
"TABLOID" => [792.00, 1224.00] }
|
|
133
|
+
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
# snapshot.rb : Implements transactional rendering for Prawn
|
|
4
|
+
#
|
|
5
|
+
# Copyright August 2009, Brad Ediger. All Rights Reserved.
|
|
6
|
+
#
|
|
7
|
+
# This is free software. Please see the LICENSE and COPYING files for details.
|
|
8
|
+
|
|
9
|
+
require 'delegate'
|
|
10
|
+
|
|
11
|
+
module Prawn
|
|
12
|
+
class Document
|
|
13
|
+
module Snapshot
|
|
14
|
+
|
|
15
|
+
RollbackTransaction = Class.new(StandardError)
|
|
16
|
+
|
|
17
|
+
# Call this within a +transaction+ block to roll back the transaction and
|
|
18
|
+
# prevent any of its data from being rendered. You must reset the
|
|
19
|
+
# y-position yourself if you have performed any drawing operations that
|
|
20
|
+
# modify it.
|
|
21
|
+
#
|
|
22
|
+
def rollback
|
|
23
|
+
raise RollbackTransaction
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Run a block of drawing operations, to be completed atomically. If
|
|
27
|
+
# +rollback+ is called or a RollbackTransaction exception is raised
|
|
28
|
+
# inside the block, all actions taken inside the block will be rolled
|
|
29
|
+
# back (with the exception of y-position, which you must restore
|
|
30
|
+
# yourself).
|
|
31
|
+
#
|
|
32
|
+
# Returns true on success, or false if the transaction was rolled back.
|
|
33
|
+
#
|
|
34
|
+
def transaction
|
|
35
|
+
snap = take_snapshot
|
|
36
|
+
yield
|
|
37
|
+
true
|
|
38
|
+
rescue RollbackTransaction
|
|
39
|
+
restore_snapshot(snap)
|
|
40
|
+
false
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
private
|
|
44
|
+
|
|
45
|
+
# Takes a current snapshot of the document's state, sufficient to
|
|
46
|
+
# reconstruct it after it was amended.
|
|
47
|
+
#
|
|
48
|
+
def take_snapshot
|
|
49
|
+
# current_page holds a ref to the Pages dictionary which grows
|
|
50
|
+
# monotonically as data is added to the document, so we share that
|
|
51
|
+
# between the old and new copies.
|
|
52
|
+
{:page_content => state.page.content.deep_copy,
|
|
53
|
+
:current_page => state.page.dictionary.deep_copy(share=[:Parent]),
|
|
54
|
+
:page_number => page_number,
|
|
55
|
+
:page_kids => state.store.pages.data[:Kids].map{|kid| kid.identifier},
|
|
56
|
+
:dests => names? &&
|
|
57
|
+
Marshal.load(Marshal.dump(names.data[:Dests]))}
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Rolls the page state back to the state of the given snapshot.
|
|
61
|
+
#
|
|
62
|
+
def restore_snapshot(shot)
|
|
63
|
+
page = state.page
|
|
64
|
+
# Because these objects are referenced by identifier from the Pages
|
|
65
|
+
# dictionary, we can't just restore them over the current refs in
|
|
66
|
+
# page_content and current_page. We have to restore them over the old
|
|
67
|
+
# ones.
|
|
68
|
+
page.content = shot[:page_content].identifier
|
|
69
|
+
page.content.replace shot[:page_content]
|
|
70
|
+
|
|
71
|
+
page.dictionary = shot[:current_page].identifier
|
|
72
|
+
page.dictionary.replace shot[:current_page]
|
|
73
|
+
page.dictionary.data[:Contents] = page.content
|
|
74
|
+
|
|
75
|
+
self.page_number = shot[:page_number]
|
|
76
|
+
|
|
77
|
+
state.store.pages.data[:Kids] = shot[:page_kids].map{|id| state.store[id]}
|
|
78
|
+
state.store.pages.data[:Count] = shot[:page_kids].size
|
|
79
|
+
|
|
80
|
+
if shot[:dests]
|
|
81
|
+
names.data[:Dests] = shot[:dests]
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
require "prawn/document_builder/command"
|
|
2
|
+
require "prawn/document_builder/constructs"
|
|
3
|
+
require "prawn/document_builder/modifications"
|
|
4
|
+
require "prawn/document_builder/layout"
|
|
5
|
+
|
|
6
|
+
module Prawn
|
|
7
|
+
class DocumentBuilder
|
|
8
|
+
def initialize
|
|
9
|
+
@commands = []
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
attr_accessor :commands
|
|
13
|
+
|
|
14
|
+
def compile
|
|
15
|
+
document = ::Prawn::Document.new
|
|
16
|
+
layout = ::Prawn::DocumentBuilder::Layout.new(self, document)
|
|
17
|
+
|
|
18
|
+
original_commands = commands.dup
|
|
19
|
+
|
|
20
|
+
while c = commands.shift
|
|
21
|
+
c.execute(document, layout)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
self.commands = original_commands
|
|
25
|
+
|
|
26
|
+
document
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
extendable_features = Module.new do
|
|
30
|
+
def start_new_page(options={})
|
|
31
|
+
commands << LayoutModification.new(:new_page, options)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def line(point1, point2)
|
|
35
|
+
commands << PathConstruct.new(:line, :point1 => point1,
|
|
36
|
+
:point2 => point2)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def text(contents, options={})
|
|
40
|
+
options = options.merge(:contents => contents)
|
|
41
|
+
commands << FlowingTextConstruct.new(:text, options)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def stroke
|
|
45
|
+
commands << PathModification.new(:stroke)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
include extendable_features
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module Prawn
|
|
2
|
+
class DocumentBuilder
|
|
3
|
+
class Command
|
|
4
|
+
def initialize(name, params={})
|
|
5
|
+
@name = name
|
|
6
|
+
@params = params
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
attr_reader :name
|
|
10
|
+
attr_accessor :params
|
|
11
|
+
attr_accessor :box
|
|
12
|
+
|
|
13
|
+
def setup
|
|
14
|
+
# stub, replace in your subclasses
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def execute(document, layout)
|
|
18
|
+
save_params
|
|
19
|
+
setup
|
|
20
|
+
send(name, document, layout)
|
|
21
|
+
teardown
|
|
22
|
+
restore_params
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def teardown
|
|
26
|
+
# stub, replace in your subclasses
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def save_params
|
|
30
|
+
@original_params = @params.dup
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def restore_params
|
|
34
|
+
@params = @original_params
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|