prawn 0.12.0 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/COPYING +2 -2
- data/Gemfile +18 -0
- data/LICENSE +1 -1
- data/README.md +17 -4
- data/Rakefile +18 -22
- data/data/images/indexed_color.dat +0 -0
- data/data/images/indexed_color.png +0 -0
- data/data/pdfs/nested_pages.pdf +13 -13
- data/lib/pdf/core.rb +35 -0
- data/lib/{prawn → pdf}/core/annotations.rb +6 -7
- data/lib/{prawn → pdf}/core/byte_string.rb +1 -1
- data/lib/{prawn → pdf}/core/destinations.rb +23 -23
- data/lib/{prawn → pdf}/core/document_state.rb +8 -8
- data/lib/pdf/core/filter_list.rb +51 -0
- data/lib/pdf/core/filters.rb +36 -0
- data/lib/pdf/core/graphics_state.rb +68 -0
- data/lib/{prawn → pdf}/core/literal_string.rb +1 -1
- data/lib/{prawn → pdf}/core/name_tree.rb +14 -2
- data/lib/{prawn → pdf}/core/object_store.rb +80 -24
- data/lib/pdf/core/outline.rb +315 -0
- data/lib/{prawn → pdf}/core/page.rb +23 -26
- data/lib/{prawn/document → pdf/core}/page_geometry.rb +11 -21
- data/lib/{prawn → pdf}/core/pdf_object.rb +48 -32
- data/lib/{prawn → pdf}/core/reference.rb +35 -44
- data/lib/pdf/core/stream.rb +98 -0
- data/lib/{prawn → pdf}/core/text.rb +24 -17
- data/lib/prawn.rb +95 -17
- data/lib/prawn/compatibility.rb +66 -26
- data/lib/prawn/document.rb +48 -30
- data/lib/prawn/document/bounding_box.rb +3 -3
- data/lib/prawn/document/column_box.rb +46 -8
- data/lib/prawn/document/graphics_state.rb +10 -73
- data/lib/prawn/document/internals.rb +24 -23
- data/lib/prawn/document/snapshot.rb +6 -7
- data/lib/prawn/document/span.rb +10 -10
- data/lib/prawn/encoding.rb +7 -7
- data/lib/prawn/errors.rb +18 -29
- data/lib/prawn/font.rb +64 -28
- data/lib/prawn/font/afm.rb +32 -74
- data/lib/prawn/font/dfont.rb +2 -2
- data/lib/prawn/font/ttf.rb +28 -57
- data/lib/prawn/font_metric_cache.rb +45 -0
- data/lib/prawn/graphics.rb +307 -41
- data/lib/prawn/graphics/cap_style.rb +3 -3
- data/lib/prawn/graphics/color.rb +12 -5
- data/lib/prawn/graphics/dash.rb +52 -31
- data/lib/prawn/graphics/join_style.rb +7 -7
- data/lib/prawn/graphics/patterns.rb +137 -0
- data/lib/prawn/graphics/transformation.rb +9 -9
- data/lib/prawn/graphics/transparency.rb +1 -1
- data/lib/prawn/image_handler.rb +30 -0
- data/lib/prawn/images.rb +86 -105
- data/lib/prawn/images/image.rb +48 -0
- data/lib/prawn/images/jpg.rb +14 -10
- data/lib/prawn/images/png.rb +50 -37
- data/lib/prawn/layout.rb +2 -2
- data/lib/prawn/layout/grid.rb +51 -51
- data/lib/prawn/measurement_extensions.rb +5 -5
- data/lib/prawn/measurements.rb +25 -21
- data/lib/prawn/outline.rb +4 -308
- data/lib/prawn/repeater.rb +8 -8
- data/lib/prawn/security.rb +50 -36
- data/lib/prawn/soft_mask.rb +94 -0
- data/lib/prawn/stamp.rb +3 -3
- data/lib/prawn/table.rb +292 -118
- data/lib/prawn/table/cell.rb +272 -45
- data/lib/prawn/table/cell/image.rb +70 -0
- data/lib/prawn/table/cell/in_table.rb +2 -2
- data/lib/prawn/table/cell/span_dummy.rb +92 -0
- data/lib/prawn/table/cell/subtable.rb +2 -2
- data/lib/prawn/table/cell/text.rb +42 -24
- data/lib/prawn/table/cells.rb +137 -48
- data/lib/prawn/text.rb +35 -23
- data/lib/prawn/text/box.rb +18 -5
- data/lib/prawn/text/formatted.rb +5 -4
- data/lib/prawn/text/formatted/arranger.rb +292 -0
- data/lib/prawn/text/formatted/box.rb +52 -13
- data/lib/prawn/text/formatted/fragment.rb +37 -22
- data/lib/prawn/text/formatted/line_wrap.rb +286 -0
- data/lib/prawn/text/formatted/parser.rb +14 -6
- data/lib/prawn/text/formatted/wrap.rb +151 -0
- data/lib/prawn/utilities.rb +44 -0
- data/manual/basic_concepts/adding_pages.rb +27 -0
- data/manual/basic_concepts/basic_concepts.rb +34 -0
- data/manual/basic_concepts/creation.rb +39 -0
- data/manual/basic_concepts/cursor.rb +33 -0
- data/manual/basic_concepts/measurement.rb +25 -0
- data/manual/basic_concepts/origin.rb +38 -0
- data/manual/basic_concepts/other_cursor_helpers.rb +40 -0
- data/manual/bounding_box/bounding_box.rb +39 -0
- data/manual/bounding_box/bounds.rb +49 -0
- data/manual/bounding_box/canvas.rb +24 -0
- data/manual/bounding_box/creation.rb +23 -0
- data/manual/bounding_box/indentation.rb +46 -0
- data/manual/bounding_box/nesting.rb +45 -0
- data/manual/bounding_box/russian_boxes.rb +40 -0
- data/manual/bounding_box/stretchy.rb +31 -0
- data/manual/document_and_page_options/background.rb +27 -0
- data/manual/document_and_page_options/document_and_page_options.rb +31 -0
- data/manual/document_and_page_options/metadata.rb +23 -0
- data/manual/document_and_page_options/page_margins.rb +38 -0
- data/manual/document_and_page_options/page_size.rb +34 -0
- data/manual/example_file.rb +116 -0
- data/manual/example_helper.rb +411 -0
- data/manual/example_package.rb +53 -0
- data/manual/example_section.rb +46 -0
- data/manual/graphics/circle_and_ellipse.rb +22 -0
- data/manual/graphics/color.rb +24 -0
- data/manual/graphics/common_lines.rb +28 -0
- data/manual/graphics/fill_and_stroke.rb +42 -0
- data/manual/graphics/fill_rules.rb +37 -0
- data/manual/graphics/gradients.rb +37 -0
- data/manual/graphics/graphics.rb +58 -0
- data/manual/graphics/helper.rb +24 -0
- data/manual/graphics/line_width.rb +35 -0
- data/manual/graphics/lines_and_curves.rb +41 -0
- data/manual/graphics/polygon.rb +29 -0
- data/manual/graphics/rectangle.rb +21 -0
- data/manual/graphics/rotate.rb +28 -0
- data/manual/graphics/scale.rb +41 -0
- data/manual/graphics/soft_masks.rb +46 -0
- data/manual/graphics/stroke_cap.rb +31 -0
- data/manual/graphics/stroke_dash.rb +48 -0
- data/manual/graphics/stroke_join.rb +30 -0
- data/manual/graphics/translate.rb +29 -0
- data/manual/graphics/transparency.rb +35 -0
- data/manual/images/absolute_position.rb +23 -0
- data/manual/images/fit.rb +21 -0
- data/manual/images/horizontal.rb +25 -0
- data/manual/images/images.rb +40 -0
- data/manual/images/plain_image.rb +18 -0
- data/manual/images/scale.rb +22 -0
- data/manual/images/vertical.rb +28 -0
- data/manual/images/width_and_height.rb +25 -0
- data/manual/layout/boxes.rb +27 -0
- data/manual/layout/content.rb +25 -0
- data/manual/layout/layout.rb +28 -0
- data/manual/layout/simple_grid.rb +23 -0
- data/manual/manual/cover.rb +35 -0
- data/manual/manual/foreword.rb +85 -0
- data/manual/manual/how_to_read_this_manual.rb +41 -0
- data/manual/manual/manual.rb +35 -0
- data/manual/outline/add_subsection_to.rb +61 -0
- data/manual/outline/insert_section_after.rb +47 -0
- data/manual/outline/outline.rb +32 -0
- data/manual/outline/sections_and_pages.rb +67 -0
- data/manual/repeatable_content/page_numbering.rb +54 -0
- data/manual/repeatable_content/repeatable_content.rb +31 -0
- data/manual/repeatable_content/repeater.rb +55 -0
- data/manual/repeatable_content/stamp.rb +41 -0
- data/manual/security/encryption.rb +31 -0
- data/manual/security/permissions.rb +38 -0
- data/manual/security/security.rb +28 -0
- data/manual/syntax_highlight.rb +52 -0
- data/manual/table/basic_block.rb +53 -0
- data/manual/table/before_rendering_page.rb +26 -0
- data/manual/table/cell_border_lines.rb +24 -0
- data/manual/table/cell_borders_and_bg.rb +31 -0
- data/manual/table/cell_dimensions.rb +30 -0
- data/manual/table/cell_text.rb +38 -0
- data/manual/table/column_widths.rb +30 -0
- data/manual/table/content_and_subtables.rb +39 -0
- data/manual/table/creation.rb +27 -0
- data/manual/table/filtering.rb +36 -0
- data/manual/table/flow_and_header.rb +17 -0
- data/manual/table/image_cells.rb +33 -0
- data/manual/table/position.rb +29 -0
- data/manual/table/row_colors.rb +20 -0
- data/manual/table/span.rb +30 -0
- data/manual/table/style.rb +22 -0
- data/manual/table/table.rb +52 -0
- data/manual/table/width.rb +27 -0
- data/manual/templates/full_template.rb +25 -0
- data/manual/templates/page_template.rb +48 -0
- data/manual/templates/templates.rb +27 -0
- data/manual/text/alignment.rb +44 -0
- data/manual/text/color.rb +24 -0
- data/manual/text/column_box.rb +32 -0
- data/manual/text/fallback_fonts.rb +37 -0
- data/manual/text/font.rb +41 -0
- data/manual/text/font_size.rb +45 -0
- data/manual/text/font_style.rb +23 -0
- data/manual/text/formatted_callbacks.rb +60 -0
- data/manual/text/formatted_text.rb +54 -0
- data/manual/text/free_flowing_text.rb +51 -0
- data/manual/text/group.rb +29 -0
- data/manual/text/inline.rb +43 -0
- data/manual/text/kerning_and_character_spacing.rb +39 -0
- data/manual/text/leading.rb +25 -0
- data/manual/text/line_wrapping.rb +41 -0
- data/manual/text/paragraph_indentation.rb +26 -0
- data/manual/text/positioned_text.rb +38 -0
- data/manual/text/registering_families.rb +48 -0
- data/manual/text/rendering_and_color.rb +37 -0
- data/manual/text/right_to_left_text.rb +43 -0
- data/manual/text/rotation.rb +43 -0
- data/manual/text/single_usage.rb +37 -0
- data/manual/text/text.rb +75 -0
- data/manual/text/text_box_excess.rb +32 -0
- data/manual/text/text_box_extensions.rb +45 -0
- data/manual/text/text_box_overflow.rb +44 -0
- data/manual/text/utf8.rb +28 -0
- data/{examples/m17n → manual/text}/win_ansi_charset.rb +14 -10
- data/prawn.gemspec +18 -12
- data/spec/acceptance/png.rb +23 -0
- data/spec/annotations_spec.rb +16 -32
- data/spec/bounding_box_spec.rb +128 -15
- data/spec/cell_spec.rb +169 -38
- data/spec/column_box_spec.rb +33 -0
- data/spec/destinations_spec.rb +5 -5
- data/spec/document_spec.rb +150 -104
- data/spec/extensions/encoding_helpers.rb +10 -0
- data/spec/extensions/mocha.rb +1 -0
- data/spec/filters_spec.rb +34 -0
- data/spec/font_metric_cache_spec.rb +52 -0
- data/spec/font_spec.rb +183 -97
- data/spec/formatted_text_arranger_spec.rb +43 -43
- data/spec/formatted_text_box_spec.rb +30 -20
- data/spec/formatted_text_fragment_spec.rb +8 -8
- data/spec/graphics_spec.rb +158 -69
- data/spec/grid_spec.rb +15 -15
- data/spec/image_handler_spec.rb +42 -0
- data/spec/images_spec.rb +49 -24
- data/spec/inline_formatted_text_parser_spec.rb +73 -19
- data/spec/jpg_spec.rb +4 -4
- data/spec/line_wrap_spec.rb +26 -26
- data/spec/measurement_units_spec.rb +6 -6
- data/spec/name_tree_spec.rb +21 -21
- data/spec/object_store_spec.rb +39 -39
- data/spec/outline_spec.rb +93 -53
- data/spec/pdf_object_spec.rb +88 -86
- data/spec/png_spec.rb +31 -28
- data/spec/reference_spec.rb +32 -32
- data/spec/repeater_spec.rb +25 -11
- data/spec/security_spec.rb +44 -12
- data/spec/snapshot_spec.rb +8 -9
- data/spec/soft_mask_spec.rb +117 -0
- data/spec/span_spec.rb +10 -15
- data/spec/spec_helper.rb +25 -8
- data/spec/stamp_spec.rb +29 -30
- data/spec/stream_spec.rb +58 -0
- data/spec/stroke_styles_spec.rb +36 -18
- data/spec/table/span_dummy_spec.rb +17 -0
- data/spec/table_spec.rb +697 -105
- data/spec/template_spec.rb +108 -54
- data/spec/text_at_spec.rb +18 -17
- data/spec/text_box_spec.rb +111 -62
- data/spec/text_rendering_mode_spec.rb +5 -5
- data/spec/text_spacing_spec.rb +4 -4
- data/spec/text_spec.rb +57 -49
- data/spec/transparency_spec.rb +5 -5
- metadata +421 -213
- 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/DejaVuSans.ttf +0 -0
- data/data/fonts/Dustismo_Roman.ttf +0 -0
- data/data/fonts/comicsans.ttf +0 -0
- data/data/fonts/gkai00mp.ttf +0 -0
- data/data/images/rails.dat +0 -0
- data/data/images/rails.png +0 -0
- data/examples/bounding_box/russian_boxes.rb +0 -37
- data/examples/example_helper.rb +0 -11
- data/examples/general/context_sensitive_headers.rb +0 -38
- data/examples/graphics/cmyk.rb +0 -13
- data/examples/graphics/gradient.rb +0 -23
- data/examples/graphics/png_types.rb +0 -23
- data/examples/graphics/remote_images.rb +0 -13
- data/examples/m17n/full_win_ansi_character_list.rb +0 -20
- data/examples/m17n/sjis.rb +0 -29
- data/examples/table/bill.rb +0 -54
- data/examples/table/header.rb +0 -15
- data/examples/text/font_calculations.rb +0 -92
- data/examples/text/hyphenation.rb +0 -45
- data/examples/text/indent_paragraphs.rb +0 -24
- data/lib/prawn/core.rb +0 -85
- data/lib/prawn/core/text/formatted/arranger.rb +0 -294
- data/lib/prawn/core/text/formatted/line_wrap.rb +0 -273
- data/lib/prawn/core/text/formatted/wrap.rb +0 -153
- data/lib/prawn/graphics/gradient.rb +0 -84
- data/lib/prawn/security/arcfour.rb +0 -51
data/lib/prawn/document.rb
CHANGED
@@ -7,7 +7,6 @@
|
|
7
7
|
# This is free software. Please see the LICENSE and COPYING files for details.
|
8
8
|
|
9
9
|
require "stringio"
|
10
|
-
require "prawn/document/page_geometry"
|
11
10
|
require "prawn/document/bounding_box"
|
12
11
|
require "prawn/document/column_box"
|
13
12
|
require "prawn/document/internals"
|
@@ -52,8 +51,8 @@ module Prawn
|
|
52
51
|
#
|
53
52
|
class Document
|
54
53
|
include Prawn::Document::Internals
|
55
|
-
include
|
56
|
-
include
|
54
|
+
include PDF::Core::Annotations
|
55
|
+
include PDF::Core::Destinations
|
57
56
|
include Prawn::Document::Snapshot
|
58
57
|
include Prawn::Document::GraphicsState
|
59
58
|
include Prawn::Document::Security
|
@@ -61,6 +60,7 @@ module Prawn
|
|
61
60
|
include Prawn::Graphics
|
62
61
|
include Prawn::Images
|
63
62
|
include Prawn::Stamp
|
63
|
+
include Prawn::SoftMask
|
64
64
|
|
65
65
|
# Any module added to this array will be included into instances of
|
66
66
|
# Prawn::Document at the per-object level. These will also be inherited by
|
@@ -136,8 +136,10 @@ module Prawn
|
|
136
136
|
# <tt>:compress</tt>:: Compresses content streams before rendering them [false]
|
137
137
|
# <tt>:optimize_objects</tt>:: Reduce number of PDF objects in output, at expense of render time [false]
|
138
138
|
# <tt>:background</tt>:: An image path to be used as background on all pages [nil]
|
139
|
+
# <tt>:background_scale</tt>:: Backgound image scale [1] [nil]
|
139
140
|
# <tt>:info</tt>:: Generic hash allowing for custom metadata properties [nil]
|
140
141
|
# <tt>:template</tt>:: The path to an existing PDF file to use as a template [nil]
|
142
|
+
# <tt>:text_formatter</tt>: The text formatter to use for <tt>:inline_format</tt>ted text [Prawn::Text::Formatted::Parser]
|
141
143
|
#
|
142
144
|
# Setting e.g. the :margin to 100 points and the :left_margin to 50 will result in margins
|
143
145
|
# of 100 points on every side except for the left, where it will be 50.
|
@@ -166,7 +168,7 @@ module Prawn
|
|
166
168
|
# pdf = Prawn::Document.new(:page_size => [200, 300])
|
167
169
|
#
|
168
170
|
# # New document, with background
|
169
|
-
# pdf = Prawn::Document.new(:background => "#{Prawn::
|
171
|
+
# pdf = Prawn::Document.new(:background => "#{Prawn::DATADIR}/images/pigs.jpg")
|
170
172
|
#
|
171
173
|
def initialize(options={},&block)
|
172
174
|
options = options.dup
|
@@ -174,17 +176,18 @@ module Prawn
|
|
174
176
|
Prawn.verify_options [:page_size, :page_layout, :margin, :left_margin,
|
175
177
|
:right_margin, :top_margin, :bottom_margin, :skip_page_creation,
|
176
178
|
:compress, :skip_encoding, :background, :info,
|
177
|
-
:optimize_objects, :template], options
|
179
|
+
:optimize_objects, :template, :text_formatter], options
|
178
180
|
|
179
181
|
# need to fix, as the refactoring breaks this
|
180
182
|
# raise NotImplementedError if options[:skip_page_creation]
|
181
183
|
|
182
184
|
self.class.extensions.reverse_each { |e| extend e }
|
183
|
-
@internal_state =
|
185
|
+
@internal_state = PDF::Core::DocumentState.new(options)
|
184
186
|
@internal_state.populate_pages_from_store(self)
|
185
187
|
min_version(state.store.min_version) if state.store.min_version
|
186
188
|
|
187
189
|
@background = options[:background]
|
190
|
+
@background_scale = options[:background_scale] || 1
|
188
191
|
@font_size = 12
|
189
192
|
|
190
193
|
@bounding_box = nil
|
@@ -192,6 +195,8 @@ module Prawn
|
|
192
195
|
|
193
196
|
@page_number = 0
|
194
197
|
|
198
|
+
@text_formatter = options.delete(:text_formatter) || Text::Formatted::Parser
|
199
|
+
|
195
200
|
options[:size] = options.delete(:page_size)
|
196
201
|
options[:layout] = options.delete(:page_layout)
|
197
202
|
|
@@ -217,6 +222,7 @@ module Prawn
|
|
217
222
|
attr_reader :margins, :y
|
218
223
|
attr_writer :font_size
|
219
224
|
attr_accessor :page_number
|
225
|
+
attr_accessor :text_formatter
|
220
226
|
|
221
227
|
def state
|
222
228
|
@internal_state
|
@@ -241,6 +247,9 @@ module Prawn
|
|
241
247
|
#
|
242
248
|
# pdf.start_new_page(:template => multipage_template.pdf, :template_page => 2)
|
243
249
|
#
|
250
|
+
# Note: templates get indexed by either the object_id of the filename or stream
|
251
|
+
# entered so that if you reuse the same template multiple times be sure to use the
|
252
|
+
# same instance for more efficient use of resources and smaller rendered pdfs.
|
244
253
|
def start_new_page(options = {})
|
245
254
|
if last_page = state.page
|
246
255
|
last_page_size = last_page.size
|
@@ -252,14 +261,14 @@ module Prawn
|
|
252
261
|
:layout => options[:layout] || last_page_layout,
|
253
262
|
:margins => last_page_margins}
|
254
263
|
if last_page
|
255
|
-
new_graphic_state = last_page.graphic_state.dup
|
264
|
+
new_graphic_state = last_page.graphic_state.dup if last_page.graphic_state
|
256
265
|
#erase the color space so that it gets reset on new page for fussy pdf-readers
|
257
|
-
new_graphic_state.color_space = {}
|
266
|
+
new_graphic_state.color_space = {} if new_graphic_state
|
258
267
|
page_options.merge!(:graphic_state => new_graphic_state)
|
259
268
|
end
|
260
269
|
merge_template_options(page_options, options) if options[:template]
|
261
270
|
|
262
|
-
state.page =
|
271
|
+
state.page = PDF::Core::Page.new(self, page_options)
|
263
272
|
|
264
273
|
apply_margin_options(options)
|
265
274
|
generate_margin_box
|
@@ -272,12 +281,13 @@ module Prawn
|
|
272
281
|
|
273
282
|
state.page.new_content_stream if options[:template]
|
274
283
|
use_graphic_settings(options[:template])
|
284
|
+
forget_text_rendering_mode! if options[:template]
|
275
285
|
|
276
286
|
unless options[:orphan]
|
277
287
|
state.insert_page(state.page, @page_number)
|
278
288
|
@page_number += 1
|
279
289
|
|
280
|
-
canvas { image(@background, :at => bounds.top_left) } if @background
|
290
|
+
canvas { image(@background, :scale => @background_scale, :at => bounds.top_left) } if @background
|
281
291
|
@y = @bounding_box.absolute_top
|
282
292
|
|
283
293
|
float do
|
@@ -348,19 +358,23 @@ module Prawn
|
|
348
358
|
self.y = original_y
|
349
359
|
end
|
350
360
|
|
351
|
-
# Renders the PDF document to string
|
361
|
+
# Renders the PDF document to string.
|
362
|
+
# Pass an open file descriptor to render to file.
|
352
363
|
#
|
353
|
-
def render
|
354
|
-
output = StringIO.new
|
364
|
+
def render(output = StringIO.new)
|
355
365
|
finalize_all_page_contents
|
356
366
|
|
357
367
|
render_header(output)
|
358
368
|
render_body(output)
|
359
369
|
render_xref(output)
|
360
370
|
render_trailer(output)
|
361
|
-
|
362
|
-
|
363
|
-
|
371
|
+
if output.instance_of?(StringIO)
|
372
|
+
str = output.string
|
373
|
+
str.force_encoding("ASCII-8BIT") if str.respond_to?(:force_encoding)
|
374
|
+
return str
|
375
|
+
else
|
376
|
+
return nil
|
377
|
+
end
|
364
378
|
end
|
365
379
|
|
366
380
|
# Renders the PDF document to file.
|
@@ -369,7 +383,7 @@ module Prawn
|
|
369
383
|
#
|
370
384
|
def render_file(filename)
|
371
385
|
Kernel.const_defined?("Encoding") ? mode = "wb:ASCII-8BIT" : mode = "wb"
|
372
|
-
File.open(filename,mode) { |f| f
|
386
|
+
File.open(filename,mode) { |f| render(f) }
|
373
387
|
end
|
374
388
|
|
375
389
|
# The bounds method returns the current bounding box you are currently in,
|
@@ -539,15 +553,15 @@ module Prawn
|
|
539
553
|
# through existing pages after they are created.
|
540
554
|
#
|
541
555
|
# Parameters are:
|
542
|
-
#
|
543
|
-
# <tt>string</tt>:: Template string for page number wording.
|
556
|
+
#
|
557
|
+
# <tt>string</tt>:: Template string for page number wording.
|
544
558
|
# Should include '<page>' and, optionally, '<total>'.
|
545
559
|
# <tt>options</tt>:: A hash for page numbering and text box options.
|
546
|
-
# <tt>:page_filter</tt>:: A filter to specify which pages to place page numbers on.
|
560
|
+
# <tt>:page_filter</tt>:: A filter to specify which pages to place page numbers on.
|
547
561
|
# Refer to the method 'page_match?'
|
548
562
|
# <tt>:start_count_at</tt>:: The starting count to increment pages from.
|
549
563
|
# <tt>:total_pages</tt>:: If provided, will replace <total> with the value given.
|
550
|
-
# Useful to override the total number of pages when using
|
564
|
+
# Useful to override the total number of pages when using
|
551
565
|
# the start_count_at option.
|
552
566
|
# <tt>:color</tt>:: Text fill color.
|
553
567
|
#
|
@@ -558,7 +572,7 @@ module Prawn
|
|
558
572
|
# five.
|
559
573
|
#
|
560
574
|
# Prawn::Document.generate("page_with_numbering.pdf") do
|
561
|
-
# number_pages "<page> in a total of <total>",
|
575
|
+
# number_pages "<page> in a total of <total>",
|
562
576
|
# {:start_count_at => 5,
|
563
577
|
# :page_filter => lambda{ |pg| pg != 1 },
|
564
578
|
# :at => [bounds.right - 50, 0],
|
@@ -577,8 +591,8 @@ module Prawn
|
|
577
591
|
total_pages = opts.delete(:total_pages)
|
578
592
|
txtcolor = opts.delete(:color)
|
579
593
|
# An explicit height so that we can draw page numbers in the margins
|
580
|
-
opts[:height] = 50
|
581
|
-
|
594
|
+
opts[:height] = 50 unless opts.has_key?(:height)
|
595
|
+
|
582
596
|
start_count = false
|
583
597
|
pseudopage = 0
|
584
598
|
(1..page_count).each do |p|
|
@@ -589,7 +603,7 @@ module Prawn
|
|
589
603
|
else
|
590
604
|
start_count_at.to_i
|
591
605
|
end
|
592
|
-
end
|
606
|
+
end
|
593
607
|
if page_match?(page_filter, p)
|
594
608
|
go_to_page(p)
|
595
609
|
# have to use fill_color here otherwise text reverts back to default fill color
|
@@ -598,13 +612,13 @@ module Prawn
|
|
598
612
|
str = string.gsub("<page>","#{pseudopage}").gsub("<total>","#{total_pages}")
|
599
613
|
text_box str, opts
|
600
614
|
start_count = true # increment page count as soon as first match found
|
601
|
-
end
|
615
|
+
end
|
602
616
|
pseudopage += 1 if start_count
|
603
617
|
end
|
604
618
|
end
|
605
619
|
|
606
620
|
# Provides a way to execute a block of code repeatedly based on a
|
607
|
-
# page_filter.
|
621
|
+
# page_filter.
|
608
622
|
#
|
609
623
|
# Available page filters are:
|
610
624
|
# :all repeats on every page
|
@@ -612,7 +626,7 @@ module Prawn
|
|
612
626
|
# :even repeats on even pages
|
613
627
|
# some_array repeats on every page listed in the array
|
614
628
|
# some_range repeats on every page included in the range
|
615
|
-
# some_lambda yields page number and repeats for true return values
|
629
|
+
# some_lambda yields page number and repeats for true return values
|
616
630
|
def page_match?(page_filter, page_number)
|
617
631
|
case page_filter
|
618
632
|
when :all
|
@@ -626,7 +640,7 @@ module Prawn
|
|
626
640
|
when Proc
|
627
641
|
page_filter.call(page_number)
|
628
642
|
end
|
629
|
-
end
|
643
|
+
end
|
630
644
|
|
631
645
|
|
632
646
|
# Returns true if content streams will be compressed before rendering,
|
@@ -640,7 +654,7 @@ module Prawn
|
|
640
654
|
|
641
655
|
def merge_template_options(page_options, options)
|
642
656
|
object_id = state.store.import_page(options[:template], options[:template_page] || 1)
|
643
|
-
page_options.merge!(:object_id => object_id )
|
657
|
+
page_options.merge!(:object_id => object_id, :page_template => true)
|
644
658
|
end
|
645
659
|
|
646
660
|
# setting override_settings to true ensures that a new graphic state does not end up using
|
@@ -697,5 +711,9 @@ module Prawn
|
|
697
711
|
end
|
698
712
|
end
|
699
713
|
end
|
714
|
+
|
715
|
+
def font_metric_cache #:nodoc:
|
716
|
+
@font_metric_cache ||= FontMetricCache.new( self )
|
717
|
+
end
|
700
718
|
end
|
701
719
|
end
|
@@ -154,10 +154,10 @@ module Prawn
|
|
154
154
|
# Of course, if you use canvas, you will be responsible for ensuring that
|
155
155
|
# you remain within the printable area of your document.
|
156
156
|
#
|
157
|
-
def bounding_box(*args, &block)
|
157
|
+
def bounding_box(pt, *args, &block)
|
158
158
|
init_bounding_box(block) do |parent_box|
|
159
|
-
map_to_absolute
|
160
|
-
@bounding_box = BoundingBox.new(self, parent_box, *args)
|
159
|
+
pt = map_to_absolute(pt)
|
160
|
+
@bounding_box = BoundingBox.new(self, parent_box, pt, *args)
|
161
161
|
end
|
162
162
|
end
|
163
163
|
|
@@ -17,9 +17,9 @@ module Prawn
|
|
17
17
|
# number of :columns and a :spacer (in points) between columns.
|
18
18
|
#
|
19
19
|
# Defaults are :columns = 3 and :spacer = font_size
|
20
|
-
#
|
20
|
+
#
|
21
21
|
# Under PDF::Writer, "spacer" was known as "gutter"
|
22
|
-
#
|
22
|
+
#
|
23
23
|
def column_box(*args, &block)
|
24
24
|
init_column_box(block) do |parent_box|
|
25
25
|
map_to_absolute!(args[0])
|
@@ -40,7 +40,7 @@ module Prawn
|
|
40
40
|
|
41
41
|
@bounding_box = parent_box
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
# Implements the necessary functionality to allow Document#column_box to
|
45
45
|
# work.
|
46
46
|
#
|
@@ -53,17 +53,23 @@ module Prawn
|
|
53
53
|
@current_column = 0
|
54
54
|
end
|
55
55
|
|
56
|
-
# The column width, not the width of the whole box
|
57
|
-
#
|
56
|
+
# The column width, not the width of the whole box,
|
57
|
+
# before left and/or right padding
|
58
|
+
def bare_column_width
|
59
|
+
(@width - @spacer * (@columns - 1)) / @columns
|
60
|
+
end
|
61
|
+
|
62
|
+
# The column width after padding.
|
63
|
+
# Used to calculate how long a line of text can be.
|
58
64
|
#
|
59
65
|
def width
|
60
|
-
|
66
|
+
bare_column_width - (@total_left_padding + @total_right_padding)
|
61
67
|
end
|
62
68
|
|
63
69
|
# Column width including the spacer.
|
64
70
|
#
|
65
71
|
def width_of_column
|
66
|
-
|
72
|
+
bare_column_width + @spacer
|
67
73
|
end
|
68
74
|
|
69
75
|
# x coordinate of the left edge of the current column
|
@@ -72,6 +78,12 @@ module Prawn
|
|
72
78
|
absolute_left + (width_of_column * @current_column)
|
73
79
|
end
|
74
80
|
|
81
|
+
# Relative position of the left edge of the current column
|
82
|
+
#
|
83
|
+
def left
|
84
|
+
width_of_column * @current_column
|
85
|
+
end
|
86
|
+
|
75
87
|
# x co-orordinate of the right edge of the current column
|
76
88
|
#
|
77
89
|
def right_side
|
@@ -79,9 +91,15 @@ module Prawn
|
|
79
91
|
absolute_right - (width_of_column * columns_from_right)
|
80
92
|
end
|
81
93
|
|
94
|
+
# Relative position of the right edge of the current column.
|
95
|
+
#
|
96
|
+
def right
|
97
|
+
left + width
|
98
|
+
end
|
99
|
+
|
82
100
|
# Moves to the next column or starts a new page if currently positioned at
|
83
101
|
# the rightmost column.
|
84
|
-
def move_past_bottom
|
102
|
+
def move_past_bottom
|
85
103
|
@current_column = (@current_column + 1) % @columns
|
86
104
|
@document.y = @y
|
87
105
|
if 0 == @current_column
|
@@ -89,6 +107,26 @@ module Prawn
|
|
89
107
|
end
|
90
108
|
end
|
91
109
|
|
110
|
+
# Override the padding functions so as not to split the padding amount
|
111
|
+
# between all columns on the page.
|
112
|
+
|
113
|
+
def add_left_padding(left_padding)
|
114
|
+
@total_left_padding += left_padding
|
115
|
+
@x += left_padding
|
116
|
+
end
|
117
|
+
|
118
|
+
def subtract_left_padding(left_padding)
|
119
|
+
@total_left_padding -= left_padding
|
120
|
+
@x -= left_padding
|
121
|
+
end
|
122
|
+
|
123
|
+
def add_right_padding(right_padding)
|
124
|
+
@total_right_padding += right_padding
|
125
|
+
end
|
126
|
+
|
127
|
+
def subtract_right_padding(right_padding)
|
128
|
+
@total_right_padding -= right_padding
|
129
|
+
end
|
92
130
|
end
|
93
131
|
end
|
94
132
|
end
|
@@ -8,69 +8,6 @@
|
|
8
8
|
#
|
9
9
|
|
10
10
|
module Prawn
|
11
|
-
class GraphicStateStack
|
12
|
-
attr_accessor :stack
|
13
|
-
|
14
|
-
def initialize(previous_state = nil)
|
15
|
-
self.stack = [GraphicState.new(previous_state)]
|
16
|
-
end
|
17
|
-
|
18
|
-
def save_graphic_state(graphic_state = nil)
|
19
|
-
stack.push(GraphicState.new(graphic_state || current_state))
|
20
|
-
end
|
21
|
-
|
22
|
-
def restore_graphic_state
|
23
|
-
if stack.empty?
|
24
|
-
raise Prawn::Errors::EmptyGraphicStateStack,
|
25
|
-
"\n You have reached the end of the graphic state stack"
|
26
|
-
end
|
27
|
-
stack.pop
|
28
|
-
end
|
29
|
-
|
30
|
-
def current_state
|
31
|
-
stack.last
|
32
|
-
end
|
33
|
-
|
34
|
-
def present?
|
35
|
-
stack.size > 0
|
36
|
-
end
|
37
|
-
|
38
|
-
def empty?
|
39
|
-
stack.empty?
|
40
|
-
end
|
41
|
-
|
42
|
-
end
|
43
|
-
|
44
|
-
class GraphicState
|
45
|
-
attr_accessor :color_space, :dash, :cap_style, :join_style, :line_width, :fill_color, :stroke_color
|
46
|
-
|
47
|
-
def initialize(previous_state = nil)
|
48
|
-
@color_space = previous_state ? previous_state.color_space.dup : {}
|
49
|
-
@fill_color = previous_state ? previous_state.fill_color : "000000"
|
50
|
-
@stroke_color = previous_state ? previous_state.stroke_color : "000000"
|
51
|
-
@dash = previous_state ? previous_state.dash : { :dash => nil, :space => nil, :phase => 0 }
|
52
|
-
@cap_style = previous_state ? previous_state.cap_style : :butt
|
53
|
-
@join_style = previous_state ? previous_state.join_style : :miter
|
54
|
-
@line_width = previous_state ? previous_state.line_width : 1
|
55
|
-
end
|
56
|
-
|
57
|
-
def dash_setting
|
58
|
-
"[#{@dash[:dash]} #{@dash[:space]}] #{@dash[:phase]} d"
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
module Core
|
63
|
-
class Page
|
64
|
-
module GraphicsState
|
65
|
-
|
66
|
-
def graphic_state
|
67
|
-
stack.current_state
|
68
|
-
end
|
69
|
-
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
11
|
class Document
|
75
12
|
module GraphicsState
|
76
13
|
|
@@ -93,15 +30,15 @@ module Prawn
|
|
93
30
|
# text "rotated text"
|
94
31
|
# end
|
95
32
|
#
|
96
|
-
|
33
|
+
|
97
34
|
def open_graphics_state
|
98
35
|
add_content "q"
|
99
36
|
end
|
100
|
-
|
37
|
+
|
101
38
|
def close_graphics_state
|
102
39
|
add_content "Q"
|
103
40
|
end
|
104
|
-
|
41
|
+
|
105
42
|
def save_graphics_state(graphic_state = nil)
|
106
43
|
graphic_stack.save_graphic_state(graphic_state)
|
107
44
|
open_graphics_state
|
@@ -115,22 +52,22 @@ module Prawn
|
|
115
52
|
# restores the state to those values
|
116
53
|
def restore_graphics_state
|
117
54
|
if graphic_stack.empty?
|
118
|
-
raise
|
119
|
-
"\n You have reached the end of the graphic state stack"
|
55
|
+
raise PDF::Core::Errors::EmptyGraphicStateStack,
|
56
|
+
"\n You have reached the end of the graphic state stack"
|
120
57
|
end
|
121
|
-
close_graphics_state
|
58
|
+
close_graphics_state
|
122
59
|
graphic_stack.restore_graphic_state
|
123
60
|
end
|
124
|
-
|
61
|
+
|
125
62
|
def graphic_stack
|
126
63
|
state.page.stack
|
127
64
|
end
|
128
|
-
|
65
|
+
|
129
66
|
def graphic_state
|
130
67
|
save_graphics_state unless graphic_stack.current_state
|
131
|
-
graphic_stack.current_state
|
68
|
+
graphic_stack.current_state
|
132
69
|
end
|
133
|
-
|
70
|
+
|
134
71
|
end
|
135
72
|
end
|
136
73
|
end
|