prawn 0.11.1 → 0.15.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.yardopts +10 -0
- data/COPYING +2 -2
- data/GPLv2 +340 -0
- data/GPLv3 +674 -0
- data/Gemfile +11 -0
- data/LICENSE +1 -1
- data/Rakefile +29 -38
- data/data/images/16bit.alpha +0 -0
- data/data/images/16bit.color +0 -0
- data/data/images/dice.alpha +0 -0
- data/data/images/dice.color +0 -0
- data/data/images/indexed_color.dat +0 -0
- data/data/images/indexed_color.png +0 -0
- data/data/images/page_white_text.alpha +0 -0
- data/data/images/page_white_text.color +0 -0
- data/data/pdfs/nested_pages.pdf +13 -13
- data/lib/prawn/document/bounding_box.rb +87 -12
- data/lib/prawn/document/column_box.rb +57 -28
- data/lib/prawn/document/graphics_state.rb +11 -74
- data/lib/prawn/document/internals.rb +25 -23
- data/lib/prawn/document/snapshot.rb +11 -8
- data/lib/prawn/document/span.rb +12 -10
- data/lib/prawn/document.rb +250 -194
- data/lib/prawn/encoding.rb +9 -10
- data/lib/prawn/errors.rb +18 -29
- data/lib/prawn/font/afm.rb +52 -41
- data/lib/prawn/font/dfont.rb +4 -3
- data/lib/prawn/font/ttf.rb +44 -48
- data/lib/prawn/font.rb +138 -88
- data/lib/prawn/font_metric_cache.rb +47 -0
- data/lib/prawn/graphics/cap_style.rb +4 -3
- data/lib/prawn/graphics/color.rb +13 -5
- data/lib/prawn/graphics/dash.rb +53 -31
- data/lib/prawn/graphics/join_style.rb +9 -7
- data/lib/prawn/graphics/patterns.rb +138 -0
- data/lib/prawn/graphics/transformation.rb +10 -9
- data/lib/prawn/graphics/transparency.rb +3 -1
- data/lib/prawn/graphics.rb +316 -61
- data/lib/prawn/image_handler.rb +36 -0
- data/lib/prawn/images/image.rb +49 -0
- data/lib/prawn/images/jpg.rb +21 -15
- data/lib/prawn/images/png.rb +62 -119
- data/lib/prawn/images.rb +89 -108
- data/lib/prawn/layout/grid.rb +66 -54
- data/lib/prawn/layout.rb +10 -15
- data/lib/prawn/measurement_extensions.rb +10 -6
- data/lib/prawn/measurements.rb +27 -21
- data/lib/prawn/outline.rb +6 -308
- data/lib/prawn/repeater.rb +11 -9
- data/lib/prawn/security/arcfour.rb +1 -0
- data/lib/prawn/security.rb +55 -33
- data/lib/prawn/soft_mask.rb +96 -0
- data/lib/prawn/stamp.rb +5 -3
- data/lib/prawn/table/cell/image.rb +69 -0
- data/lib/prawn/table/cell/in_table.rb +4 -2
- data/lib/prawn/table/cell/span_dummy.rb +93 -0
- data/lib/prawn/table/cell/subtable.rb +2 -2
- data/lib/prawn/table/cell/text.rb +44 -26
- data/lib/prawn/table/cell.rb +302 -50
- data/lib/prawn/table/cells.rb +147 -49
- data/lib/prawn/table/column_width_calculator.rb +61 -0
- data/lib/prawn/table.rb +297 -118
- data/lib/prawn/text/box.rb +21 -5
- data/lib/prawn/text/formatted/arranger.rb +290 -0
- data/lib/prawn/text/formatted/box.rb +103 -59
- data/lib/prawn/text/formatted/fragment.rb +34 -23
- data/lib/prawn/text/formatted/line_wrap.rb +266 -0
- data/lib/prawn/text/formatted/parser.rb +15 -5
- data/lib/prawn/text/formatted/wrap.rb +150 -0
- data/lib/prawn/text/formatted.rb +5 -4
- data/lib/prawn/text.rb +38 -24
- data/lib/prawn/utilities.rb +46 -0
- data/lib/prawn.rb +85 -20
- 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 +32 -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/document_and_page_options/print_scaling.rb +20 -0
- data/manual/example_file.rb +111 -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 +30 -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 +36 -0
- data/manual/manual/foreword.rb +85 -0
- data/manual/manual/how_to_read_this_manual.rb +41 -0
- data/manual/manual/manual.rb +34 -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/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 +31 -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 +27 -17
- data/spec/acceptance/png.rb +23 -0
- data/spec/annotations_spec.rb +16 -32
- data/spec/bounding_box_spec.rb +284 -2
- data/spec/cell_spec.rb +169 -38
- data/spec/column_box_spec.rb +65 -0
- data/spec/data/curves.pdf +66 -0
- data/spec/destinations_spec.rb +5 -5
- data/spec/document_spec.rb +212 -113
- data/spec/extensions/encoding_helpers.rb +9 -0
- data/spec/extensions/mocha.rb +2 -3
- data/spec/font_metric_cache_spec.rb +52 -0
- data/spec/font_spec.rb +205 -95
- data/spec/formatted_text_arranger_spec.rb +43 -43
- data/spec/formatted_text_box_spec.rb +63 -24
- data/spec/formatted_text_fragment_spec.rb +8 -8
- data/spec/graphics_spec.rb +175 -68
- data/spec/grid_spec.rb +26 -15
- data/spec/image_handler_spec.rb +54 -0
- data/spec/images_spec.rb +58 -30
- data/spec/inline_formatted_text_parser_spec.rb +73 -19
- data/spec/jpg_spec.rb +4 -4
- data/spec/line_wrap_spec.rb +28 -28
- data/spec/measurement_units_spec.rb +6 -6
- data/spec/object_store_spec.rb +17 -106
- data/spec/outline_spec.rb +103 -63
- data/spec/png_spec.rb +25 -25
- data/spec/reference_spec.rb +8 -65
- data/spec/repeater_spec.rb +25 -11
- data/spec/security_spec.rb +44 -12
- data/spec/snapshot_spec.rb +38 -6
- data/spec/soft_mask_spec.rb +117 -0
- data/spec/span_spec.rb +10 -15
- data/spec/spec_helper.rb +32 -8
- data/spec/stamp_spec.rb +29 -30
- data/spec/stroke_styles_spec.rb +36 -18
- data/spec/table/span_dummy_spec.rb +17 -0
- data/spec/table_spec.rb +850 -104
- data/spec/text_at_spec.rb +19 -33
- data/spec/text_box_spec.rb +117 -64
- data/spec/text_rendering_mode_spec.rb +5 -5
- data/spec/text_spacing_spec.rb +20 -2
- data/spec/text_spec.rb +111 -59
- data/spec/transparency_spec.rb +5 -5
- metadata +477 -328
- data/HACKING +0 -50
- data/README +0 -141
- 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/16bit.dat +0 -0
- data/data/images/dice.dat +0 -0
- data/data/images/page_white_text.dat +0 -0
- data/data/images/rails.dat +0 -0
- data/data/images/rails.png +0 -0
- data/examples/bounding_box/bounding_boxes.rb +0 -44
- data/examples/bounding_box/indentation.rb +0 -35
- data/examples/bounding_box/russian_boxes.rb +0 -37
- data/examples/bounding_box/stretched_nesting.rb +0 -68
- data/examples/example_helper.rb +0 -8
- data/examples/general/background.rb +0 -24
- data/examples/general/canvas.rb +0 -16
- data/examples/general/context_sensitive_headers.rb +0 -38
- data/examples/general/float.rb +0 -12
- data/examples/general/margin.rb +0 -37
- data/examples/general/measurement_units.rb +0 -52
- data/examples/general/metadata-info.rb +0 -17
- data/examples/general/multi_page_layout.rb +0 -19
- data/examples/general/outlines.rb +0 -67
- data/examples/general/page_geometry.rb +0 -32
- data/examples/general/page_numbering.rb +0 -40
- data/examples/general/page_templates.rb +0 -20
- data/examples/general/repeaters.rb +0 -48
- data/examples/general/stamp.rb +0 -42
- data/examples/general/templates.rb +0 -14
- data/examples/graphics/basic_images.rb +0 -24
- data/examples/graphics/cmyk.rb +0 -13
- data/examples/graphics/curves.rb +0 -12
- data/examples/graphics/gradient.rb +0 -23
- 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 -13
- data/examples/graphics/rounded_polygons.rb +0 -20
- data/examples/graphics/rounded_rectangle.rb +0 -21
- data/examples/graphics/ruport_style_helpers.rb +0 -20
- data/examples/graphics/stroke_bounds.rb +0 -21
- data/examples/graphics/stroke_cap_and_join.rb +0 -46
- data/examples/graphics/stroke_dash.rb +0 -43
- data/examples/graphics/transformations.rb +0 -53
- data/examples/graphics/transparency.rb +0 -27
- data/examples/grid/bounding_boxes.rb +0 -22
- data/examples/grid/column_gutter_grid.rb +0 -21
- data/examples/grid/multi_boxes.rb +0 -52
- data/examples/grid/show_grid.rb +0 -14
- data/examples/grid/simple_grid.rb +0 -21
- data/examples/m17n/chinese_text_wrapping.rb +0 -18
- data/examples/m17n/euro.rb +0 -16
- data/examples/m17n/full_win_ansi_character_list.rb +0 -20
- data/examples/m17n/sjis.rb +0 -29
- data/examples/m17n/utf8.rb +0 -14
- data/examples/security/hello_foo.rb +0 -9
- data/examples/table/bill.rb +0 -54
- data/examples/table/borders.rb +0 -25
- data/examples/table/cell.rb +0 -13
- data/examples/table/checkerboard.rb +0 -23
- data/examples/table/header.rb +0 -15
- data/examples/table/inline_format_table.rb +0 -13
- data/examples/table/multi_page_table.rb +0 -10
- data/examples/table/simple_table.rb +0 -25
- data/examples/table/subtable.rb +0 -13
- data/examples/table/widths.rb +0 -21
- data/examples/text/alignment.rb +0 -19
- data/examples/text/character_spacing.rb +0 -13
- data/examples/text/dfont.rb +0 -49
- data/examples/text/family_based_styling.rb +0 -25
- data/examples/text/font_calculations.rb +0 -92
- data/examples/text/font_size.rb +0 -34
- data/examples/text/hyphenation.rb +0 -45
- data/examples/text/indent_paragraphs.rb +0 -24
- data/examples/text/inline_format.rb +0 -104
- data/examples/text/kerning.rb +0 -31
- data/examples/text/rendering_mode.rb +0 -21
- data/examples/text/rotated.rb +0 -99
- data/examples/text/shaped_text_box.rb +0 -32
- 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 -90
- data/examples/text/text_box_returning_excess.rb +0 -52
- data/examples/text/text_flow.rb +0 -68
- data/lib/prawn/compatibility.rb +0 -51
- data/lib/prawn/core/annotations.rb +0 -61
- data/lib/prawn/core/byte_string.rb +0 -9
- data/lib/prawn/core/destinations.rb +0 -90
- data/lib/prawn/core/document_state.rb +0 -78
- data/lib/prawn/core/literal_string.rb +0 -16
- data/lib/prawn/core/name_tree.rb +0 -165
- data/lib/prawn/core/object_store.rb +0 -264
- data/lib/prawn/core/page.rb +0 -213
- data/lib/prawn/core/pdf_object.rb +0 -108
- data/lib/prawn/core/reference.rb +0 -112
- data/lib/prawn/core/text/formatted/arranger.rb +0 -293
- data/lib/prawn/core/text/formatted/line_wrap.rb +0 -272
- data/lib/prawn/core/text/formatted/wrap.rb +0 -149
- data/lib/prawn/core/text.rb +0 -268
- data/lib/prawn/core.rb +0 -85
- data/lib/prawn/document/page_geometry.rb +0 -136
- data/lib/prawn/graphics/gradient.rb +0 -84
- data/spec/name_tree_spec.rb +0 -112
- data/spec/pdf_object_spec.rb +0 -170
- data/spec/template_spec.rb +0 -291
@@ -0,0 +1,28 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# To set the vertical position of an image use the <code>:vposition</code>
|
4
|
+
# option.
|
5
|
+
#
|
6
|
+
# It may be <code>:top</code>, <code>:center</code>, <code>:bottom</code> or a
|
7
|
+
# number representing the y-offset from the top boundary.
|
8
|
+
#
|
9
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
10
|
+
%w[.. example_helper]))
|
11
|
+
|
12
|
+
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
13
|
+
Prawn::Example.generate(filename) do
|
14
|
+
bounding_box([0, cursor], :width => 500, :height => 450) do
|
15
|
+
stroke_bounds
|
16
|
+
|
17
|
+
[:top, :center, :bottom].each do |vposition|
|
18
|
+
text "Image vertically aligned to the #{vposition}.", :valign => vposition
|
19
|
+
image "#{Prawn::DATADIR}/images/stef.jpg", :position => 250,
|
20
|
+
:vposition => vposition
|
21
|
+
end
|
22
|
+
|
23
|
+
text_box "The next image has a 100 point offset from the top boundary",
|
24
|
+
:at => [bounds.width - 110, bounds.top - 10], :width => 100
|
25
|
+
image "#{Prawn::DATADIR}/images/stef.jpg", :position => :right,
|
26
|
+
:vposition => 100
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# The image size can be set with the <code>:width</code> and
|
4
|
+
# <code>:height</code> options.
|
5
|
+
#
|
6
|
+
# If only one of those is provided, the image will be scaled proportionally.
|
7
|
+
# When both are provided, the image will be stretched to fit the dimensions
|
8
|
+
# without maintaining the aspect ratio.
|
9
|
+
#
|
10
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
11
|
+
%w[.. example_helper]))
|
12
|
+
|
13
|
+
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
14
|
+
Prawn::Example.generate(filename) do
|
15
|
+
text "Scale by setting only the width"
|
16
|
+
image "#{Prawn::DATADIR}/images/pigs.jpg", :width => 150
|
17
|
+
move_down 20
|
18
|
+
|
19
|
+
text "Scale by setting only the height"
|
20
|
+
image "#{Prawn::DATADIR}/images/pigs.jpg", :height => 100
|
21
|
+
move_down 20
|
22
|
+
|
23
|
+
text "Stretch to fit the width and height provided"
|
24
|
+
image "#{Prawn::DATADIR}/images/pigs.jpg", :width => 500, :height => 100
|
25
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# After defined the grid is there but nothing happens. To start taking effect
|
4
|
+
# we need to use the grid boxes.
|
5
|
+
#
|
6
|
+
# <code>grid</code> has three different return values based on the arguments
|
7
|
+
# received. With no arguments it will return the grid itself. With integers it
|
8
|
+
# will return the grid box at those indices. With two arrays it will return a
|
9
|
+
# multi-box spanning the region of the two grid boxes at the arrays indices.
|
10
|
+
#
|
11
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
12
|
+
%w[.. example_helper]))
|
13
|
+
|
14
|
+
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
15
|
+
Prawn::Example.generate(filename) do
|
16
|
+
# The grid only need to be defined once, but since all the examples should be
|
17
|
+
# able to run alone we are repeating it on every example
|
18
|
+
define_grid(:columns => 5, :rows => 8, :gutter => 10)
|
19
|
+
|
20
|
+
grid(4,0).show
|
21
|
+
grid(5,1).show
|
22
|
+
|
23
|
+
grid([6,2], [7,3]).show
|
24
|
+
|
25
|
+
grid([4,4], [7,4]).show
|
26
|
+
grid([7,0], [7,1]).show
|
27
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Now that we know how to access the boxes we might as well add some content
|
4
|
+
# to them.
|
5
|
+
#
|
6
|
+
# This can be done by taping into the bounding box for a given grid box or
|
7
|
+
# multi-box with the <code>bounding_box</code> method.
|
8
|
+
#
|
9
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
10
|
+
%w[.. example_helper]))
|
11
|
+
|
12
|
+
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
13
|
+
Prawn::Example.generate(filename) do
|
14
|
+
# The grid only need to be defined once, but since all the examples should be
|
15
|
+
# able to run alone we are repeating it on every example
|
16
|
+
define_grid(:columns => 5, :rows => 8, :gutter => 10)
|
17
|
+
|
18
|
+
grid([5,0], [7,1]).bounding_box do
|
19
|
+
text "Adding some content to this multi_box.\n" + " _ " * 200
|
20
|
+
end
|
21
|
+
|
22
|
+
grid(6,3).bounding_box do
|
23
|
+
text "Just a little snippet here.\n" + " _ " * 10
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Examples for using grid layouts.
|
4
|
+
#
|
5
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
6
|
+
%w[.. example_helper]))
|
7
|
+
|
8
|
+
Prawn::Example.generate("layout.pdf", :page_size => "FOLIO") do
|
9
|
+
|
10
|
+
package "layout" do |p|
|
11
|
+
|
12
|
+
p.example "simple_grid"
|
13
|
+
p.example "boxes"
|
14
|
+
p.example "content"
|
15
|
+
|
16
|
+
p.intro do
|
17
|
+
prose("Prawn has support for two-dimensional grid based layouts out of the box.
|
18
|
+
|
19
|
+
The examples show:")
|
20
|
+
|
21
|
+
list( "How to define the document grid",
|
22
|
+
"How to configure the grid rows and columns gutters",
|
23
|
+
"How to create boxes according to the grid"
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# The document grid on Prawn is just a table-like structure with a defined
|
4
|
+
# number of rows and columns. There are some helpers to create boxes of content
|
5
|
+
# based on the grid coordinates.
|
6
|
+
#
|
7
|
+
# <code>define_grid</code> accepts the following options which are pretty much
|
8
|
+
# self-explanatory: <code>:rows</code>, <code>:columns</code>,
|
9
|
+
# <code>:gutter</code>, <code>:row_gutter</code>, <code>:column_gutter</code>
|
10
|
+
#
|
11
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
12
|
+
%w[.. example_helper]))
|
13
|
+
|
14
|
+
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
15
|
+
Prawn::Example.generate(filename) do
|
16
|
+
# The grid only need to be defined once, but since all the examples should be
|
17
|
+
# able to run alone we are repeating it on every example
|
18
|
+
define_grid(:columns => 5, :rows => 8, :gutter => 10)
|
19
|
+
text "We defined the grid, roll over to the next page to see its outline"
|
20
|
+
|
21
|
+
start_new_page
|
22
|
+
grid.show_all
|
23
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Prawn manual how to read this manual page.
|
4
|
+
#
|
5
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
6
|
+
%w[.. example_helper]))
|
7
|
+
|
8
|
+
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
9
|
+
Prawn::Example.generate(filename) do
|
10
|
+
move_down 200
|
11
|
+
|
12
|
+
image "#{Prawn::DATADIR}/images/prawn.png",
|
13
|
+
:scale => 0.9,
|
14
|
+
:at => [10, cursor]
|
15
|
+
|
16
|
+
formatted_text_box([ {:text => "Prawn\n",
|
17
|
+
:styles => [:bold],
|
18
|
+
:size => 100}
|
19
|
+
], :at => [170, cursor - 50])
|
20
|
+
|
21
|
+
formatted_text_box([ {:text => "by example",
|
22
|
+
:font => 'Courier',
|
23
|
+
:size => 60}
|
24
|
+
], :at => [170, cursor - 160])
|
25
|
+
|
26
|
+
#long git commit hash
|
27
|
+
#commit = `git show --pretty=%H`
|
28
|
+
#short git commit hash
|
29
|
+
commit = `git show --pretty=%h`
|
30
|
+
formatted_text_box([ {:text => "Last Update: #{Time.now.strftime("%Y-%m-%d")}\n"+
|
31
|
+
"Prawn Version: #{Prawn::VERSION}\n"+
|
32
|
+
"git commit: #{commit}",
|
33
|
+
:size => 12}
|
34
|
+
], :at => [390, cursor - 620])
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Prawn manual foreword page.
|
4
|
+
#
|
5
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
6
|
+
%w[.. example_helper]))
|
7
|
+
|
8
|
+
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
9
|
+
Prawn::Example.generate(filename) do
|
10
|
+
header("Foreword, by Gregory Brown")
|
11
|
+
prose %{
|
12
|
+
Back in 2008, the state of PDF generation in
|
13
|
+
Ruby was grim. The best general purpose tool that existed was
|
14
|
+
Austin Ziegler's PDF::Writer, which was an ambitious but
|
15
|
+
painfully unsustainable project. Despite years of hard work
|
16
|
+
from Austin, the code was slow, buggy, and hard to
|
17
|
+
understand. All of those things made it very difficult
|
18
|
+
to extend with the many features that its users needed,
|
19
|
+
and so it gradually turned into abandonware.
|
20
|
+
|
21
|
+
Because I had a lot of work that depended on PDF generation
|
22
|
+
I eventually volunteered to become the new maintainer of
|
23
|
+
PDF::Writer. In the first couple months after I got commit bit, I
|
24
|
+
managed to get out a couple minor releases that fixed
|
25
|
+
known issues that had been left unresolved for years,
|
26
|
+
and that made some people happy. However, the cliff
|
27
|
+
ahead of me was far too steep to climb: without a
|
28
|
+
major redesign, PDF::Writer would never support proper
|
29
|
+
internationalization, would not easily be ported to
|
30
|
+
Ruby 1.9, and would remain painfully slow for many
|
31
|
+
ordinary tasks.
|
32
|
+
|
33
|
+
Against my better judgement, but out of desperation, I
|
34
|
+
was convinced that the only way forward was to attempt the
|
35
|
+
big rewrite. It is good that I didn't realize
|
36
|
+
how impossible that task would be, because otherwise,
|
37
|
+
I would have never started working
|
38
|
+
on Prawn. But with the support of dozens of Ruby community
|
39
|
+
members who had graciously crowd-funded this project
|
40
|
+
so that I could take a few months off of work to
|
41
|
+
kick start it (long before Kickstarter existed!), Prawn
|
42
|
+
was born.
|
43
|
+
|
44
|
+
The PDF specification is over 1300 pages long, and despite
|
45
|
+
being the original author and lead maintainer of this
|
46
|
+
project from 2008-2011, I still know relatively little
|
47
|
+
about the intricacies of the format. I relied heavily
|
48
|
+
on the insights of our core team and casual contributors
|
49
|
+
to educate me on various issues, and to help develop
|
50
|
+
nearly every feature of this project. From day one,
|
51
|
+
Prawn was a stone soup in which virtually all of the
|
52
|
+
tasty bits were provided by the community at large --
|
53
|
+
my most significant contribution was to simply
|
54
|
+
keep stirring the pot. Now, the pot mostly stirs itself,
|
55
|
+
with the occasional nudge from one of the core
|
56
|
+
team members (usually Brad or James, but everyone
|
57
|
+
has pitched in at one time or the other.)
|
58
|
+
|
59
|
+
Although Prawn bears no resemblance to PDF::Writer, this library
|
60
|
+
is most certainly its spiritual successor. That means that between
|
61
|
+
Austin's efforts and that of the Prawn team, we've been
|
62
|
+
trying to solve the PDF problem comfortably in Ruby for
|
63
|
+
nearly a decade now. This manual will help you decide for
|
64
|
+
yourself whether we've managed to finally overcome that
|
65
|
+
challenge or not.
|
66
|
+
|
67
|
+
I sincerely hope that a few years down the line, someone else
|
68
|
+
comes along and makes something brand new and exciting that
|
69
|
+
blows Prawn out of the water and onto the barbeque. But until
|
70
|
+
that happens, what you'll find here is a very powerful
|
71
|
+
PDF generation library that has a great team supporting it,
|
72
|
+
and I suspect it will stay that way for the forseeable future.
|
73
|
+
|
74
|
+
Happy Hacking!
|
75
|
+
|
76
|
+
-greg
|
77
|
+
|
78
|
+
PS: I cannot be possibly be more grateful for the time, money,
|
79
|
+
code, and knowledge that the Ruby community has invested in
|
80
|
+
this project. Whether you're a core team member or someone
|
81
|
+
who filed a single thoughtful bug report, your efforts are
|
82
|
+
what kept me motivated throughout the years that I spent working
|
83
|
+
on this project.
|
84
|
+
}
|
85
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Prawn manual how to read this manual page.
|
4
|
+
#
|
5
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
6
|
+
%w[.. example_helper]))
|
7
|
+
|
8
|
+
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
9
|
+
Prawn::Example.generate(filename) do
|
10
|
+
header("How to read this manual")
|
11
|
+
|
12
|
+
prose <<-END_TEXT
|
13
|
+
This manual is a collection of examples categorized by theme and organized from the least to the most complex. While it covers most of the common use cases it is not a comprehensive guide.
|
14
|
+
|
15
|
+
The best way to read it depends on your previous knowledge of Prawn and what you need to accomplish.
|
16
|
+
|
17
|
+
If you are beginning with Prawn the first chapter will teach you the most basic concepts and how to create pdf documents. For an overview of the other features each chapter beyond the first either has a Basics section (which offer enough insight on the feature without showing all the advanced stuff you might never use) or is simple enough with only a few examples.
|
18
|
+
|
19
|
+
Once you understand the basics you might want to come back to this manual looking for examples that accomplish tasks you need.
|
20
|
+
|
21
|
+
Advanced users are encouraged to go beyond this manual and read the source code directly if any doubt is not directly covered on this manual.
|
22
|
+
END_TEXT
|
23
|
+
|
24
|
+
move_down(BOX_MARGIN)
|
25
|
+
header("Reading the examples")
|
26
|
+
|
27
|
+
prose <<-END_TEXT
|
28
|
+
The title of each example is the relative path from the Prawn source manual/ folder.
|
29
|
+
|
30
|
+
The first body of text is the introductory text for the example. Generaly it is a short description of the features illustrated by the example.
|
31
|
+
|
32
|
+
Next comes the example source code block in fixed width font.
|
33
|
+
|
34
|
+
Most of the example snippets illustrate features that alter the page in place. The effect of these snippets is shown right below a dashed line. If it doesn't make sense to evaluate the snippet inline, a box with the link for the example file is shown instead.
|
35
|
+
|
36
|
+
Note that the <code>stroke_axis</code> method, used occasionally in the manual, is not part of standard Prawn and is used for demonstrative purposes. It is defined in this file:
|
37
|
+
|
38
|
+
https://github.com/prawnpdf/prawn/blob/master/manual/example_helper.rb
|
39
|
+
END_TEXT
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Generates the Prawn by example manual.
|
4
|
+
#
|
5
|
+
|
6
|
+
Encoding.default_external = Encoding::UTF_8
|
7
|
+
|
8
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
9
|
+
%w[.. example_helper]))
|
10
|
+
|
11
|
+
Prawn::Example.generate("manual.pdf",
|
12
|
+
:optimize_objects => true,
|
13
|
+
:skip_page_creation => true,
|
14
|
+
:page_size => "FOLIO") do
|
15
|
+
|
16
|
+
load_page "cover"
|
17
|
+
load_page "foreword"
|
18
|
+
load_page "how_to_read_this_manual"
|
19
|
+
|
20
|
+
# Core chapters
|
21
|
+
load_package "basic_concepts"
|
22
|
+
load_package "graphics"
|
23
|
+
load_package "text"
|
24
|
+
load_package "bounding_box"
|
25
|
+
|
26
|
+
# Remaining chapters
|
27
|
+
load_package "layout"
|
28
|
+
load_package "images"
|
29
|
+
load_package "table"
|
30
|
+
load_package "document_and_page_options"
|
31
|
+
load_package "outline"
|
32
|
+
load_package "repeatable_content"
|
33
|
+
load_package "security"
|
34
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# We have already seen how to define an outline tree sequentially.
|
4
|
+
#
|
5
|
+
# If you'd like to add nodes to the middle of an outline tree the
|
6
|
+
# <code>add_subsection_to</code> may help you.
|
7
|
+
#
|
8
|
+
# It allows you to insert sections to the outline tree at any point. Just
|
9
|
+
# provide the <code>title</code> of the parent section, the
|
10
|
+
# <code>position</code> you want the new subsection to be inserted
|
11
|
+
# <code>:first</code> or <code>:last</code> (defaults to <code>:last</code>)
|
12
|
+
# and a block to declare the subsection.
|
13
|
+
#
|
14
|
+
# The <code>add_subsection_to</code> block doesn't necessarily create new
|
15
|
+
# sections, it may also create new pages.
|
16
|
+
#
|
17
|
+
# If the parent title provided is the title of a page. The page will be
|
18
|
+
# converted into a section to receive the subsection created.
|
19
|
+
#
|
20
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
21
|
+
%w[.. example_helper]))
|
22
|
+
|
23
|
+
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
24
|
+
Prawn::Example.generate(filename) do
|
25
|
+
# First we create 10 pages and some default outline
|
26
|
+
(1..10).each do |index|
|
27
|
+
text "Page #{index}"
|
28
|
+
start_new_page
|
29
|
+
end
|
30
|
+
|
31
|
+
outline.define do
|
32
|
+
section("Section 1", :destination => 1) do
|
33
|
+
page :title => "Page 2", :destination => 2
|
34
|
+
page :title => "Page 3", :destination => 3
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Now we will start adding nodes to the previous outline
|
39
|
+
outline.add_subsection_to("Section 1", :first) do
|
40
|
+
outline.section("Added later - first position") do
|
41
|
+
outline.page :title => "Page 4", :destination => 4
|
42
|
+
outline.page :title => "Page 5", :destination => 5
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
outline.add_subsection_to("Section 1") do
|
47
|
+
outline.page :title => "Added later - last position",
|
48
|
+
:destination => 6
|
49
|
+
end
|
50
|
+
|
51
|
+
outline.add_subsection_to("Added later - first position") do
|
52
|
+
outline.page :title => "Another page added later",
|
53
|
+
:destination => 7
|
54
|
+
end
|
55
|
+
|
56
|
+
# The title provided is for a page which will be converted into a section
|
57
|
+
outline.add_subsection_to("Page 3") do
|
58
|
+
outline.page :title => "Last page added",
|
59
|
+
:destination => 8
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Another way to insert nodes into an existing outline is the
|
4
|
+
# <code>insert_section_after</code> method.
|
5
|
+
#
|
6
|
+
# It accepts the title of the node that the new section will go after and a
|
7
|
+
# block declaring the new section.
|
8
|
+
#
|
9
|
+
# As is the case with <code>add_subsection_to</code> the section added
|
10
|
+
# doesn't need to be a section, it may be just a page.
|
11
|
+
#
|
12
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
13
|
+
%w[.. example_helper]))
|
14
|
+
|
15
|
+
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
16
|
+
Prawn::Example.generate(filename) do
|
17
|
+
# First we create 10 pages and some default outline
|
18
|
+
(1..10).each do |index|
|
19
|
+
text "Page #{index}"
|
20
|
+
start_new_page
|
21
|
+
end
|
22
|
+
|
23
|
+
outline.define do
|
24
|
+
section("Section 1", :destination => 1) do
|
25
|
+
page :title => "Page 2", :destination => 2
|
26
|
+
page :title => "Page 3", :destination => 3
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Now we will start adding nodes to the previous outline
|
31
|
+
outline.insert_section_after("Page 2") do
|
32
|
+
outline.section("Section after Page 2") do
|
33
|
+
outline.page :title => "Page 4", :destination => 4
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
outline.insert_section_after("Section 1") do
|
38
|
+
outline.section("Section after Section 1") do
|
39
|
+
outline.page :title => "Page 5", :destination => 5
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Adding just a page
|
44
|
+
outline.insert_section_after("Page 3") do
|
45
|
+
outline.page :title => "Page after Page 3", :destination => 6
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Examples for defining the document outline.
|
4
|
+
#
|
5
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
6
|
+
%w[.. example_helper]))
|
7
|
+
|
8
|
+
Prawn::Example.generate("outline.pdf", :page_size => "FOLIO") do
|
9
|
+
|
10
|
+
package "outline" do |p|
|
11
|
+
|
12
|
+
p.section "Basics" do |s|
|
13
|
+
s.example "sections_and_pages", :eval_source => false
|
14
|
+
end
|
15
|
+
|
16
|
+
p.section "Adding nodes later" do |s|
|
17
|
+
s.example "add_subsection_to", :eval_source => false
|
18
|
+
s.example "insert_section_after", :eval_source => false
|
19
|
+
end
|
20
|
+
|
21
|
+
p.intro do
|
22
|
+
prose("The outline of a PDF document is the table of contents tab you see to the right or left of your PDF viewer.
|
23
|
+
|
24
|
+
The examples include:")
|
25
|
+
|
26
|
+
list( "How to define sections and pages",
|
27
|
+
"How to insert sections and/or pages to a previously defined outline structure"
|
28
|
+
)
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# The document outline tree is the set of links used to navigate through the
|
4
|
+
# various document sections and pages.
|
5
|
+
#
|
6
|
+
# To define the document outline we first use the <code>outline</code>
|
7
|
+
# method to lazily instantiate an outline object. Then we use the
|
8
|
+
# <code>define</code> method with a block to start the outline tree.
|
9
|
+
#
|
10
|
+
# The basic methods for creating outline nodes are <code>section</code> and
|
11
|
+
# <code>page</code>. The only difference between the two is that
|
12
|
+
# <code>page</code> doesn't accept a block and will only create leaf nodes
|
13
|
+
# while <code>section</code> accepts a block to create nested nodes.
|
14
|
+
#
|
15
|
+
# <code>section</code> accepts the title of the section and two options:
|
16
|
+
# <code>:destination</code> - a page number to link and <code>:closed</code> -
|
17
|
+
# a boolean value that defines if the nested outline nodes are shown when the
|
18
|
+
# document is open (defaults to true).
|
19
|
+
#
|
20
|
+
# <code>page</code> is very similar to section. It requires a
|
21
|
+
# <code>:title</code> option to be set and accepts a <code>:destination</code>.
|
22
|
+
#
|
23
|
+
# <code>section</code> and <code>page</code> may also be used without the
|
24
|
+
# <code>define</code> method but they will need to instantiate the
|
25
|
+
# <code>outline</code> object every time.
|
26
|
+
#
|
27
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
28
|
+
%w[.. example_helper]))
|
29
|
+
|
30
|
+
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
31
|
+
Prawn::Example.generate(filename) do
|
32
|
+
# First we create 10 pages just to have something to link to
|
33
|
+
(1..10).each do |index|
|
34
|
+
text "Page #{index}"
|
35
|
+
start_new_page
|
36
|
+
end
|
37
|
+
|
38
|
+
outline.define do
|
39
|
+
section("Section 1", :destination => 1) do
|
40
|
+
page :title => "Page 2", :destination => 2
|
41
|
+
page :title => "Page 3", :destination => 3
|
42
|
+
end
|
43
|
+
|
44
|
+
section("Section 2", :destination => 4) do
|
45
|
+
page :title => "Page 5", :destination => 5
|
46
|
+
|
47
|
+
section("Subsection 2.1", :destination => 6, :closed => true) do
|
48
|
+
page :title => "Page 7", :destination => 7
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# Outside of the define block
|
54
|
+
outline.section("Section 3", :destination => 8) do
|
55
|
+
outline.page :title => "Page 9", :destination => 9
|
56
|
+
end
|
57
|
+
|
58
|
+
outline.page :title => "Page 10", :destination => 10
|
59
|
+
|
60
|
+
# Section and Pages without links. While a section without a link may be
|
61
|
+
# useful to group some pages, a page without a link is useless
|
62
|
+
outline.update do # update is an alias to define
|
63
|
+
section("Section without link") do
|
64
|
+
page :title => "Page without link"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# The <code>number_pages</code> method is a simple way to number the pages of
|
4
|
+
# your document. It should be called towards the end of the document since
|
5
|
+
# pages created after the call won't be numbered.
|
6
|
+
#
|
7
|
+
# It accepts a string and a hash of options:
|
8
|
+
#
|
9
|
+
# <code>start_count_at</code> is the value from which to start numbering pages
|
10
|
+
#
|
11
|
+
# <code>total_pages</code> If provided, will replace <code>total</code> with
|
12
|
+
# the value given. Useful for overriding the total number of pages when using
|
13
|
+
# the start_count_at option.
|
14
|
+
#
|
15
|
+
# <code>page_filter</code>, which is one of: <code>:all</code>,
|
16
|
+
# <code>:odd</code>, <code>:even</code>, an array, a range, or a Proc that
|
17
|
+
# receives the page number as an argument and should return true if the page
|
18
|
+
# number should be printed on that page.
|
19
|
+
#
|
20
|
+
# <code>color</code> which accepts the same values as <code>fill_color</code>
|
21
|
+
#
|
22
|
+
# As well as any option accepted by <code>text_box</code>
|
23
|
+
#
|
24
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
25
|
+
%w[.. example_helper]))
|
26
|
+
|
27
|
+
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
28
|
+
Prawn::Example.generate(filename) do
|
29
|
+
text "This is the first page!"
|
30
|
+
|
31
|
+
10.times do
|
32
|
+
start_new_page
|
33
|
+
text "Here comes yet another page."
|
34
|
+
end
|
35
|
+
|
36
|
+
string = "page <page> of <total>"
|
37
|
+
# Green page numbers 1 to 7
|
38
|
+
options = { :at => [bounds.right - 150, 0],
|
39
|
+
:width => 150,
|
40
|
+
:align => :right,
|
41
|
+
:page_filter => (1..7),
|
42
|
+
:start_count_at => 1,
|
43
|
+
:color => "007700" }
|
44
|
+
number_pages string, options
|
45
|
+
|
46
|
+
# Gray page numbers from 8 on up
|
47
|
+
options[:page_filter] = lambda{ |pg| pg > 7}
|
48
|
+
options[:start_count_at] = 8
|
49
|
+
options[:color] = "333333"
|
50
|
+
number_pages string, options
|
51
|
+
|
52
|
+
start_new_page
|
53
|
+
text "See. This page isn't numbered and doesn't count towards the total."
|
54
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Examples for stamps and repeaters.
|
4
|
+
#
|
5
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
6
|
+
%w[.. example_helper]))
|
7
|
+
|
8
|
+
Prawn::Example.generate("repeatable_content.pdf", :page_size => "FOLIO") do
|
9
|
+
|
10
|
+
package "repeatable_content" do |p|
|
11
|
+
|
12
|
+
p.example "repeater", :eval_source => false
|
13
|
+
p.example "stamp"
|
14
|
+
p.example "page_numbering", :eval_source => false
|
15
|
+
|
16
|
+
p.intro do
|
17
|
+
prose("Prawn offers two ways to handle repeatable content blocks. Repeater is useful for content that gets repeated at well defined intervals while Stamp is more appropriate if you need better control of when to repeat it.
|
18
|
+
|
19
|
+
There is also one very specific helper for numbering pages.
|
20
|
+
|
21
|
+
The examples show:")
|
22
|
+
|
23
|
+
list( "How to repeat content on several pages with a single invocation",
|
24
|
+
"How to create a new Stamp",
|
25
|
+
'How to "stamp" the content block on the page',
|
26
|
+
"How to number the document pages with one simple call"
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|