prawn 0.13.0 → 2.4.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.
- checksums.yaml +5 -5
- checksums.yaml.gz.sig +0 -0
- data/.yardopts +10 -0
- data/GPLv2 +20 -21
- data/Gemfile +3 -16
- data/Rakefile +17 -39
- data/lib/prawn/document/bounding_box.rb +85 -42
- data/lib/prawn/document/column_box.rb +21 -11
- data/lib/prawn/document/internals.rb +40 -147
- data/lib/prawn/document/span.rb +25 -17
- data/lib/prawn/document.rb +286 -245
- data/lib/prawn/encoding.rb +68 -101
- data/lib/prawn/errors.rb +47 -43
- data/lib/prawn/font.rb +204 -155
- data/lib/prawn/font_metric_cache.rb +25 -21
- data/lib/prawn/fonts/afm.rb +292 -0
- data/lib/prawn/{font → fonts}/dfont.rb +7 -13
- data/lib/prawn/fonts/otf.rb +11 -0
- data/lib/prawn/fonts/ttc.rb +36 -0
- data/lib/prawn/{font → fonts}/ttf.rb +142 -80
- data/lib/prawn/graphics/blend_mode.rb +65 -0
- data/lib/prawn/graphics/cap_style.rb +6 -5
- data/lib/prawn/graphics/color.rb +47 -44
- data/lib/prawn/graphics/dash.rb +30 -13
- data/lib/prawn/graphics/join_style.rb +13 -6
- data/lib/prawn/graphics/patterns.rb +221 -90
- data/lib/prawn/graphics/transformation.rb +21 -12
- data/lib/prawn/graphics/transparency.rb +21 -17
- data/lib/prawn/graphics.rb +155 -128
- data/lib/prawn/{layout/grid.rb → grid.rb} +110 -47
- data/lib/prawn/image_handler.rb +16 -2
- data/lib/prawn/images/image.rb +4 -2
- data/lib/prawn/images/jpg.rb +39 -30
- data/lib/prawn/images/png.rb +132 -169
- data/lib/prawn/images.rb +70 -62
- data/lib/prawn/measurement_extensions.rb +15 -10
- data/lib/prawn/measurements.rb +22 -23
- data/lib/prawn/outline.rb +301 -13
- data/lib/prawn/repeater.rb +19 -17
- data/lib/prawn/security/arcfour.rb +54 -0
- data/lib/prawn/security.rb +108 -86
- data/lib/prawn/soft_mask.rb +40 -41
- data/lib/prawn/stamp.rb +29 -12
- data/lib/prawn/text/box.rb +27 -29
- data/lib/prawn/text/formatted/arranger.rb +110 -67
- data/lib/prawn/text/formatted/box.rb +233 -165
- data/lib/prawn/text/formatted/fragment.rb +27 -27
- data/lib/prawn/text/formatted/line_wrap.rb +137 -97
- data/lib/prawn/text/formatted/parser.rb +149 -127
- data/lib/prawn/text/formatted/wrap.rb +57 -37
- data/lib/prawn/text/formatted.rb +6 -4
- data/lib/prawn/text.rb +105 -73
- data/lib/prawn/transformation_stack.rb +44 -0
- data/lib/prawn/utilities.rb +11 -21
- data/lib/prawn/version.rb +5 -0
- data/lib/prawn/view.rb +101 -0
- data/lib/prawn.rb +42 -68
- data/{data/images/fractal.jpg → manual/absolute_position.pdf} +0 -0
- data/manual/basic_concepts/adding_pages.rb +9 -10
- data/manual/basic_concepts/basic_concepts.rb +33 -24
- data/manual/basic_concepts/creation.rb +10 -11
- data/manual/basic_concepts/cursor.rb +9 -10
- data/manual/basic_concepts/measurement.rb +10 -11
- data/manual/basic_concepts/origin.rb +8 -9
- data/manual/basic_concepts/other_cursor_helpers.rb +17 -18
- data/manual/basic_concepts/view.rb +48 -0
- data/manual/bounding_box/bounding_box.rb +31 -29
- data/manual/bounding_box/bounds.rb +17 -18
- data/manual/bounding_box/canvas.rb +8 -9
- data/manual/bounding_box/creation.rb +8 -9
- data/manual/bounding_box/indentation.rb +22 -23
- data/manual/bounding_box/nesting.rb +32 -25
- data/manual/bounding_box/russian_boxes.rb +19 -19
- data/manual/bounding_box/stretchy.rb +18 -20
- data/manual/contents.rb +35 -0
- data/manual/cover.rb +43 -0
- data/manual/document_and_page_options/background.rb +16 -14
- data/manual/document_and_page_options/document_and_page_options.rb +26 -23
- data/manual/document_and_page_options/metadata.rb +21 -19
- data/manual/document_and_page_options/page_margins.rb +20 -22
- data/manual/document_and_page_options/page_size.rb +15 -15
- data/manual/document_and_page_options/print_scaling.rb +23 -0
- data/manual/example_helper.rb +5 -408
- data/manual/graphics/blend_mode.rb +52 -0
- data/manual/graphics/circle_and_ellipse.rb +8 -9
- data/manual/graphics/color.rb +11 -13
- data/manual/graphics/common_lines.rb +13 -12
- data/manual/graphics/fill_and_stroke.rb +10 -11
- data/manual/graphics/fill_rules.rb +13 -12
- data/manual/graphics/gradients.rb +28 -22
- data/manual/graphics/graphics.rb +52 -46
- data/manual/graphics/helper.rb +20 -10
- data/manual/graphics/line_width.rb +13 -12
- data/manual/graphics/lines_and_curves.rb +13 -14
- data/manual/graphics/polygon.rb +10 -12
- data/manual/graphics/rectangle.rb +7 -8
- data/manual/graphics/rotate.rb +9 -12
- data/manual/graphics/scale.rb +19 -18
- data/manual/graphics/soft_masks.rb +5 -7
- data/manual/graphics/stroke_cap.rb +10 -11
- data/manual/graphics/stroke_dash.rb +16 -17
- data/manual/graphics/stroke_join.rb +10 -11
- data/manual/graphics/translate.rb +13 -13
- data/manual/graphics/transparency.rb +11 -13
- data/manual/{manual/how_to_read_this_manual.rb → how_to_read_this_manual.rb} +23 -25
- data/manual/images/absolute_position.rb +9 -10
- data/manual/images/fit.rb +9 -10
- data/manual/images/horizontal.rb +13 -14
- data/manual/images/images.rb +31 -30
- data/manual/images/plain_image.rb +6 -7
- data/manual/images/scale.rb +12 -13
- data/manual/images/vertical.rb +19 -17
- data/manual/images/width_and_height.rb +13 -14
- data/manual/layout/boxes.rb +14 -15
- data/manual/layout/content.rb +12 -13
- data/manual/layout/layout.rb +19 -20
- data/manual/layout/simple_grid.rb +8 -9
- data/manual/outline/add_subsection_to.rb +26 -27
- data/manual/outline/insert_section_after.rb +19 -20
- data/manual/outline/outline.rb +23 -22
- data/manual/outline/sections_and_pages.rb +24 -25
- data/manual/repeatable_content/alternate_page_numbering.rb +36 -0
- data/manual/repeatable_content/page_numbering.rb +20 -19
- data/manual/repeatable_content/repeatable_content.rb +26 -22
- data/manual/repeatable_content/repeater.rb +18 -19
- data/manual/repeatable_content/stamp.rb +18 -19
- data/manual/security/encryption.rb +8 -11
- data/manual/security/permissions.rb +20 -15
- data/manual/security/security.rb +20 -20
- data/manual/table.rb +16 -0
- data/manual/text/alignment.rb +17 -18
- data/manual/text/color.rb +13 -13
- data/manual/text/column_box.rb +10 -12
- data/manual/text/fallback_fonts.rb +29 -25
- data/manual/text/font.rb +17 -18
- data/manual/text/font_size.rb +21 -22
- data/manual/text/font_style.rb +12 -10
- data/manual/text/formatted_callbacks.rb +36 -26
- data/manual/text/formatted_text.rb +41 -34
- data/manual/text/free_flowing_text.rb +28 -29
- data/manual/text/inline.rb +23 -26
- data/manual/text/kerning_and_character_spacing.rb +20 -21
- data/manual/text/leading.rb +10 -11
- data/manual/text/line_wrapping.rb +40 -21
- data/manual/text/paragraph_indentation.rb +17 -12
- data/manual/text/positioned_text.rb +19 -20
- data/manual/text/registering_families.rb +33 -30
- data/manual/text/rendering_and_color.rb +11 -12
- data/manual/text/right_to_left_text.rb +31 -20
- data/manual/text/rotation.rb +36 -27
- data/manual/text/single_usage.rb +13 -14
- data/manual/text/text.rb +62 -62
- data/manual/text/text_box_excess.rb +22 -19
- data/manual/text/text_box_extensions.rb +21 -18
- data/manual/text/text_box_overflow.rb +28 -21
- data/manual/text/utf8.rb +16 -17
- data/manual/text/win_ansi_charset.rb +29 -26
- data/prawn.gemspec +45 -43
- data/spec/extensions/encoding_helpers.rb +4 -3
- data/spec/prawn/document/bounding_box_spec.rb +550 -0
- data/spec/prawn/document/column_box_spec.rb +75 -0
- data/spec/prawn/document/security_spec.rb +176 -0
- data/spec/prawn/document_annotations_spec.rb +76 -0
- data/spec/prawn/document_destinations_spec.rb +15 -0
- data/spec/prawn/document_grid_spec.rb +99 -0
- data/spec/prawn/document_reference_spec.rb +27 -0
- data/spec/prawn/document_span_spec.rb +44 -0
- data/spec/prawn/document_spec.rb +805 -0
- data/spec/prawn/font_metric_cache_spec.rb +54 -0
- data/spec/prawn/font_spec.rb +544 -0
- data/spec/prawn/graphics/blend_mode_spec.rb +63 -0
- data/spec/prawn/graphics/transparency_spec.rb +81 -0
- data/spec/prawn/graphics_spec.rb +872 -0
- data/spec/prawn/graphics_stroke_styles_spec.rb +229 -0
- data/spec/prawn/image_handler_spec.rb +53 -0
- data/spec/prawn/images/jpg_spec.rb +20 -0
- data/spec/prawn/images/png_spec.rb +283 -0
- data/spec/prawn/images_spec.rb +229 -0
- data/spec/prawn/measurements_extensions_spec.rb +24 -0
- data/spec/prawn/outline_spec.rb +512 -0
- data/spec/prawn/repeater_spec.rb +166 -0
- data/spec/prawn/soft_mask_spec.rb +74 -0
- data/spec/prawn/stamp_spec.rb +173 -0
- data/spec/prawn/text/box_spec.rb +1110 -0
- data/spec/prawn/text/formatted/arranger_spec.rb +466 -0
- data/spec/prawn/text/formatted/box_spec.rb +849 -0
- data/spec/prawn/text/formatted/fragment_spec.rb +343 -0
- data/spec/prawn/text/formatted/line_wrap_spec.rb +495 -0
- data/spec/prawn/text/formatted/parser_spec.rb +697 -0
- data/spec/prawn/text_draw_text_spec.rb +150 -0
- data/spec/prawn/text_rendering_mode_spec.rb +48 -0
- data/spec/prawn/text_spacing_spec.rb +95 -0
- data/spec/prawn/text_spec.rb +603 -0
- data/spec/prawn/text_with_inline_formatting_spec.rb +35 -0
- data/spec/prawn/transformation_stack_spec.rb +66 -0
- data/spec/prawn/view_spec.rb +63 -0
- data/spec/prawn_manual_spec.rb +35 -0
- data/spec/spec_helper.rb +22 -21
- data.tar.gz.sig +0 -0
- metadata +168 -307
- metadata.gz.sig +0 -0
- data/README.md +0 -109
- data/data/encodings/win_ansi.txt +0 -29
- 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/indexed_color.dat +0 -0
- data/data/images/indexed_color.png +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/prawn.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 +0 -1
- 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/form.pdf +1 -819
- data/data/pdfs/hexagon.pdf +0 -61
- data/data/pdfs/indirect_reference.pdf +0 -86
- data/data/pdfs/multipage_template.pdf +0 -127
- data/data/pdfs/nested_pages.pdf +0 -118
- data/data/pdfs/page_without_mediabox.pdf +0 -193
- data/data/pdfs/resources_as_indirect_object.pdf +0 -83
- data/data/pdfs/two_hexagons.pdf +0 -90
- data/data/pdfs/version_1_6.pdf +0 -61
- data/data/shift_jis_text.txt +0 -1
- data/lib/pdf/core/annotations.rb +0 -60
- data/lib/pdf/core/byte_string.rb +0 -9
- data/lib/pdf/core/destinations.rb +0 -90
- data/lib/pdf/core/document_state.rb +0 -78
- data/lib/pdf/core/filter_list.rb +0 -51
- data/lib/pdf/core/filters.rb +0 -36
- data/lib/pdf/core/graphics_state.rb +0 -68
- data/lib/pdf/core/literal_string.rb +0 -16
- data/lib/pdf/core/name_tree.rb +0 -177
- data/lib/pdf/core/object_store.rb +0 -320
- data/lib/pdf/core/outline.rb +0 -315
- data/lib/pdf/core/page.rb +0 -212
- data/lib/pdf/core/page_geometry.rb +0 -126
- data/lib/pdf/core/pdf_object.rb +0 -124
- data/lib/pdf/core/reference.rb +0 -103
- data/lib/pdf/core/stream.rb +0 -98
- data/lib/pdf/core/text.rb +0 -275
- data/lib/pdf/core.rb +0 -35
- data/lib/prawn/compatibility.rb +0 -91
- data/lib/prawn/document/graphics_state.rb +0 -73
- data/lib/prawn/document/snapshot.rb +0 -89
- data/lib/prawn/font/afm.rb +0 -203
- data/lib/prawn/layout.rb +0 -20
- data/lib/prawn/table/cell/image.rb +0 -70
- data/lib/prawn/table/cell/in_table.rb +0 -27
- data/lib/prawn/table/cell/span_dummy.rb +0 -92
- data/lib/prawn/table/cell/subtable.rb +0 -65
- data/lib/prawn/table/cell/text.rb +0 -153
- data/lib/prawn/table/cell.rb +0 -770
- data/lib/prawn/table/cells.rb +0 -295
- data/lib/prawn/table.rb +0 -643
- data/manual/example_file.rb +0 -116
- data/manual/example_package.rb +0 -53
- data/manual/example_section.rb +0 -46
- data/manual/manual/cover.rb +0 -35
- data/manual/manual/foreword.rb +0 -85
- data/manual/manual/manual.rb +0 -35
- data/manual/syntax_highlight.rb +0 -52
- data/manual/table/basic_block.rb +0 -53
- data/manual/table/before_rendering_page.rb +0 -26
- data/manual/table/cell_border_lines.rb +0 -24
- data/manual/table/cell_borders_and_bg.rb +0 -31
- data/manual/table/cell_dimensions.rb +0 -30
- data/manual/table/cell_text.rb +0 -38
- data/manual/table/column_widths.rb +0 -30
- data/manual/table/content_and_subtables.rb +0 -39
- data/manual/table/creation.rb +0 -27
- data/manual/table/filtering.rb +0 -36
- data/manual/table/flow_and_header.rb +0 -17
- data/manual/table/image_cells.rb +0 -33
- data/manual/table/position.rb +0 -29
- data/manual/table/row_colors.rb +0 -20
- data/manual/table/span.rb +0 -30
- data/manual/table/style.rb +0 -22
- data/manual/table/table.rb +0 -52
- data/manual/table/width.rb +0 -27
- data/manual/templates/full_template.rb +0 -25
- data/manual/templates/page_template.rb +0 -48
- data/manual/templates/templates.rb +0 -27
- data/manual/text/group.rb +0 -29
- data/spec/acceptance/png.rb +0 -23
- data/spec/annotations_spec.rb +0 -74
- data/spec/bounding_box_spec.rb +0 -493
- data/spec/cell_spec.rb +0 -628
- data/spec/column_box_spec.rb +0 -33
- data/spec/destinations_spec.rb +0 -15
- data/spec/document_spec.rb +0 -761
- data/spec/extensions/mocha.rb +0 -44
- data/spec/filters_spec.rb +0 -34
- data/spec/font_metric_cache_spec.rb +0 -52
- data/spec/font_spec.rb +0 -464
- data/spec/formatted_text_arranger_spec.rb +0 -421
- data/spec/formatted_text_box_spec.rb +0 -650
- data/spec/formatted_text_fragment_spec.rb +0 -298
- data/spec/graphics_spec.rb +0 -651
- data/spec/grid_spec.rb +0 -85
- data/spec/image_handler_spec.rb +0 -42
- data/spec/images_spec.rb +0 -157
- data/spec/inline_formatted_text_parser_spec.rb +0 -564
- data/spec/jpg_spec.rb +0 -25
- data/spec/line_wrap_spec.rb +0 -333
- data/spec/measurement_units_spec.rb +0 -23
- data/spec/name_tree_spec.rb +0 -112
- data/spec/object_store_spec.rb +0 -170
- data/spec/outline_spec.rb +0 -448
- data/spec/pdf_object_spec.rb +0 -172
- data/spec/png_spec.rb +0 -240
- data/spec/reference_spec.rb +0 -82
- data/spec/repeater_spec.rb +0 -158
- data/spec/security_spec.rb +0 -158
- data/spec/snapshot_spec.rb +0 -186
- data/spec/soft_mask_spec.rb +0 -117
- data/spec/span_spec.rb +0 -44
- data/spec/stamp_spec.rb +0 -158
- data/spec/stream_spec.rb +0 -58
- data/spec/stroke_styles_spec.rb +0 -211
- data/spec/table/span_dummy_spec.rb +0 -17
- data/spec/table_spec.rb +0 -1355
- data/spec/template_spec.rb +0 -351
- data/spec/text_at_spec.rb +0 -130
- data/spec/text_box_spec.rb +0 -1030
- data/spec/text_rendering_mode_spec.rb +0 -45
- data/spec/text_spacing_spec.rb +0 -93
- data/spec/text_spec.rb +0 -425
- data/spec/text_with_inline_formatting_spec.rb +0 -35
- data/spec/transparency_spec.rb +0 -89
data/lib/prawn.rb
CHANGED
@@ -1,32 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Welcome to Prawn, the best PDF Generation library ever.
|
2
4
|
# This documentation covers user level functionality.
|
3
5
|
#
|
4
|
-
|
5
|
-
# into the lib/prawn/core/* source tree.
|
6
|
-
#
|
7
|
-
%w[ttfunk/lib].each do |dep|
|
8
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__) + "/../../vendor/#{dep}")
|
9
|
-
end
|
10
|
-
|
11
|
-
begin
|
12
|
-
require 'ttfunk'
|
13
|
-
rescue LoadError
|
14
|
-
puts "Failed to load ttfunk. If you are running Prawn from git:"
|
15
|
-
puts " git submodule init"
|
16
|
-
puts " git submodule update"
|
17
|
-
exit
|
18
|
-
end
|
6
|
+
require 'set'
|
19
7
|
|
20
|
-
require
|
8
|
+
require 'ttfunk'
|
9
|
+
require 'pdf/core'
|
21
10
|
|
22
11
|
module Prawn
|
23
|
-
VERSION = "0.13.0"
|
24
|
-
|
25
|
-
extend self
|
26
|
-
|
27
12
|
file = __FILE__
|
28
13
|
file = File.readlink(file) if File.symlink?(file)
|
29
|
-
dir
|
14
|
+
dir = File.dirname(file)
|
30
15
|
|
31
16
|
# The base source directory for Prawn as installed on the system
|
32
17
|
#
|
@@ -34,7 +19,9 @@ module Prawn
|
|
34
19
|
BASEDIR = File.expand_path(File.join(dir, '..'))
|
35
20
|
DATADIR = File.expand_path(File.join(dir, '..', 'data'))
|
36
21
|
|
37
|
-
|
22
|
+
FLOAT_PRECISION = 1.0e-9
|
23
|
+
|
24
|
+
# When set to true, Prawn will verify hash options to ensure only valid keys
|
38
25
|
# are used. Off by default.
|
39
26
|
#
|
40
27
|
# Example:
|
@@ -43,62 +30,49 @@ module Prawn
|
|
43
30
|
# Detected unknown option(s): [:tomato]
|
44
31
|
# Accepted options are: [:page_size, :page_layout, :left_margin, ...]
|
45
32
|
#
|
33
|
+
# @private
|
46
34
|
attr_accessor :debug
|
47
35
|
|
48
|
-
|
36
|
+
module_function :debug, :debug=
|
37
|
+
|
38
|
+
module_function
|
39
|
+
|
40
|
+
# @private
|
41
|
+
def verify_options(accepted, actual)
|
49
42
|
return unless debug || $DEBUG
|
50
|
-
|
43
|
+
|
44
|
+
unless (act = Set[*actual.keys]).subset?(acc = Set[*accepted])
|
51
45
|
raise Prawn::Errors::UnknownOption,
|
52
|
-
"\nDetected unknown option(s): #{(act - acc).to_a.inspect}\n"
|
46
|
+
"\nDetected unknown option(s): #{(act - acc).to_a.inspect}\n" \
|
53
47
|
"Accepted options are: #{accepted.inspect}"
|
54
48
|
end
|
55
49
|
yield if block_given?
|
56
50
|
end
|
57
|
-
|
58
|
-
module Configurable #:nodoc:
|
59
|
-
def configuration(*args)
|
60
|
-
@config ||= Marshal.load(Marshal.dump(default_configuration))
|
61
|
-
if Hash === args[0]
|
62
|
-
@config.update(args[0])
|
63
|
-
elsif args.length > 1
|
64
|
-
@config.values_at(*args)
|
65
|
-
elsif args.length == 1
|
66
|
-
@config[args[0]]
|
67
|
-
else
|
68
|
-
@config
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
alias_method :C, :configuration
|
73
|
-
end
|
74
51
|
end
|
75
52
|
|
76
|
-
require_relative
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
require_relative
|
82
|
-
require_relative
|
83
|
-
require_relative
|
84
|
-
require_relative
|
85
|
-
require_relative
|
86
|
-
require_relative
|
87
|
-
require_relative
|
88
|
-
require_relative
|
89
|
-
require_relative
|
90
|
-
require_relative
|
91
|
-
require_relative
|
92
|
-
require_relative
|
93
|
-
require_relative
|
94
|
-
require_relative
|
95
|
-
require_relative
|
96
|
-
require_relative
|
97
|
-
require_relative
|
98
|
-
|
99
|
-
require_relative "prawn/image_handler"
|
100
|
-
|
101
|
-
|
53
|
+
require_relative 'prawn/version'
|
54
|
+
|
55
|
+
require_relative 'prawn/errors'
|
56
|
+
|
57
|
+
require_relative 'prawn/utilities'
|
58
|
+
require_relative 'prawn/text'
|
59
|
+
require_relative 'prawn/graphics'
|
60
|
+
require_relative 'prawn/images'
|
61
|
+
require_relative 'prawn/images/image'
|
62
|
+
require_relative 'prawn/images/jpg'
|
63
|
+
require_relative 'prawn/images/png'
|
64
|
+
require_relative 'prawn/stamp'
|
65
|
+
require_relative 'prawn/soft_mask'
|
66
|
+
require_relative 'prawn/security'
|
67
|
+
require_relative 'prawn/transformation_stack'
|
68
|
+
require_relative 'prawn/document'
|
69
|
+
require_relative 'prawn/font'
|
70
|
+
require_relative 'prawn/measurements'
|
71
|
+
require_relative 'prawn/repeater'
|
72
|
+
require_relative 'prawn/outline'
|
73
|
+
require_relative 'prawn/grid'
|
74
|
+
require_relative 'prawn/view'
|
75
|
+
require_relative 'prawn/image_handler'
|
102
76
|
|
103
77
|
Prawn.image_handler.register(Prawn::Images::PNG)
|
104
78
|
Prawn.image_handler.register(Prawn::Images::JPG)
|
Binary file
|
@@ -1,5 +1,5 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
3
|
# A PDF document is a collection of pages. When we create a new document be it
|
4
4
|
# with <code>Document.new</code> or on a <code>Document.generate</code> block
|
5
5
|
# one initial page is created for us.
|
@@ -12,16 +12,15 @@
|
|
12
12
|
#
|
13
13
|
# Just use the <code>start_new_page</code> method and a shiny new page will be
|
14
14
|
# created for you just like in the following snippet.
|
15
|
-
|
16
|
-
|
17
|
-
%w[.. example_helper]))
|
15
|
+
|
16
|
+
require_relative '../example_helper'
|
18
17
|
|
19
18
|
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
20
|
-
Prawn::Example.generate(filename) do
|
21
|
-
text "We are still on the initial page for this example. Now I'll ask "
|
22
|
-
|
23
|
-
|
19
|
+
Prawn::ManualBuilder::Example.generate(filename) do
|
20
|
+
text "We are still on the initial page for this example. Now I'll ask " \
|
21
|
+
'Prawn to gently start a new page. Please follow me to the next page.'
|
22
|
+
|
24
23
|
start_new_page
|
25
|
-
|
24
|
+
|
26
25
|
text "See. We've left the previous page behind."
|
27
26
|
end
|
@@ -1,34 +1,43 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
3
|
# Examples for Prawn basic concepts.
|
4
4
|
#
|
5
|
-
require File.expand_path(File.join(File.dirname(__FILE__),
|
6
|
-
%w[.. example_helper]))
|
7
5
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
p.example
|
14
|
-
p.example
|
15
|
-
p.example
|
16
|
-
p.example
|
17
|
-
p.example
|
18
|
-
|
6
|
+
require_relative '../example_helper'
|
7
|
+
|
8
|
+
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
9
|
+
Prawn::ManualBuilder::Example.generate(filename, page_size: 'FOLIO') do
|
10
|
+
package 'basic_concepts' do |p|
|
11
|
+
p.example 'creation', eval_source: false, full_source: true
|
12
|
+
p.example 'origin'
|
13
|
+
p.example 'cursor'
|
14
|
+
p.example 'other_cursor_helpers'
|
15
|
+
p.example 'adding_pages'
|
16
|
+
p.example 'measurement'
|
17
|
+
p.example 'view', eval_source: false, full_source: true
|
18
|
+
|
19
19
|
p.intro do
|
20
|
-
prose
|
20
|
+
prose <<-TEXT
|
21
|
+
This chapter covers the minimum amount of functionality you'll need to
|
22
|
+
start using Prawn.
|
21
23
|
|
22
|
-
|
24
|
+
If you are new to Prawn this is the first chapter to read. Once you are
|
25
|
+
comfortable with the concepts shown here you might want to check the
|
26
|
+
Basics section of the Graphics, Bounding Box and Text sections.
|
23
27
|
|
24
|
-
|
28
|
+
The examples show:
|
29
|
+
TEXT
|
25
30
|
|
26
|
-
list(
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
31
|
+
list(
|
32
|
+
'How to create new pdf documents in every possible way',
|
33
|
+
'Where the origin for the document coordinates is. What are Bounding '\
|
34
|
+
'Boxes and how they interact with the origin',
|
35
|
+
'How the cursor behaves',
|
36
|
+
'How to start new pages',
|
37
|
+
'What the base unit for measurement and coordinates is and how to use '\
|
38
|
+
'other convenient measures',
|
39
|
+
"How to build custom view objects that use Prawn's DSL"
|
40
|
+
)
|
32
41
|
end
|
33
42
|
end
|
34
43
|
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
3
|
# There are three ways to create a PDF Document in Prawn: creating a new
|
4
4
|
# <code>Prawn::Document</code> instance, or using the
|
5
5
|
# <code>Prawn::Document.generate</code> method with and without block arguments.
|
@@ -19,21 +19,20 @@
|
|
19
19
|
# The generate method without block arguments requires
|
20
20
|
# less typing and defines and renders the pdf document in one shot.
|
21
21
|
# Almost all of the examples are coded this way.
|
22
|
-
|
23
|
-
|
24
|
-
%w[.. example_helper]))
|
22
|
+
|
23
|
+
require_relative '../example_helper'
|
25
24
|
|
26
25
|
# Assignment
|
27
26
|
pdf = Prawn::Document.new
|
28
|
-
pdf.text
|
29
|
-
pdf.render_file
|
27
|
+
pdf.text 'Hello World'
|
28
|
+
pdf.render_file 'assignment.pdf'
|
30
29
|
|
31
30
|
# Implicit Block
|
32
|
-
Prawn::Document.generate(
|
33
|
-
text
|
31
|
+
Prawn::Document.generate('implicit.pdf') do
|
32
|
+
text 'Hello World'
|
34
33
|
end
|
35
34
|
|
36
35
|
# Explicit Block
|
37
|
-
Prawn::Document.generate(
|
38
|
-
pdf.text
|
36
|
+
Prawn::Document.generate('explicit.pdf') do |pdf|
|
37
|
+
pdf.text 'Hello World'
|
39
38
|
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
3
|
# We normally write our documents from top to bottom and it is no different with
|
4
4
|
# Prawn. Even if the origin is on the bottom left corner we still fill the page
|
5
5
|
# from the top to the bottom. In other words the cursor for inserting content
|
@@ -11,23 +11,22 @@
|
|
11
11
|
# The following snippet shows how the cursor behaves when we add some text to
|
12
12
|
# the page and demonstrates some of the helpers to manage the cursor position.
|
13
13
|
# The <code>cursor</code> method returns the current cursor position.
|
14
|
-
|
15
|
-
|
16
|
-
%w[.. example_helper]))
|
14
|
+
|
15
|
+
require_relative '../example_helper'
|
17
16
|
|
18
17
|
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
19
|
-
Prawn::Example.generate(filename) do
|
18
|
+
Prawn::ManualBuilder::Example.generate(filename) do
|
20
19
|
stroke_axis
|
21
|
-
|
20
|
+
|
22
21
|
text "the cursor is here: #{cursor}"
|
23
22
|
text "now it is here: #{cursor}"
|
24
|
-
|
23
|
+
|
25
24
|
move_down 200
|
26
25
|
text "on the first move the cursor went down to: #{cursor}"
|
27
|
-
|
26
|
+
|
28
27
|
move_up 100
|
29
28
|
text "on the second move the cursor went up to: #{cursor}"
|
30
|
-
|
29
|
+
|
31
30
|
move_cursor_to 50
|
32
31
|
text "on the last move the cursor went directly to: #{cursor}"
|
33
32
|
end
|
@@ -1,25 +1,24 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
3
|
# The base unit in Prawn is the PDF Point. One PDF Point is equal to 1/72 of
|
4
4
|
# an inch.
|
5
5
|
#
|
6
|
-
# There is no need to waste time converting this
|
6
|
+
# There is no need to waste time converting this measure. Prawn provides
|
7
7
|
# helpers for converting from other measurements
|
8
8
|
# to PDF Points.
|
9
9
|
#
|
10
10
|
# Just <code>require "prawn/measurement_extensions"</code> and it will mix some
|
11
11
|
# helpers onto <code>Numeric</code> for converting common measurement units to
|
12
12
|
# PDF Points.
|
13
|
-
|
14
|
-
|
15
|
-
%w[.. example_helper]))
|
13
|
+
|
14
|
+
require_relative '../example_helper'
|
16
15
|
|
17
16
|
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
18
|
-
Prawn::Example.generate(filename) do
|
19
|
-
require
|
20
|
-
|
21
|
-
[
|
22
|
-
text "1 #{measurement} in PDF Points: #{1.
|
17
|
+
Prawn::ManualBuilder::Example.generate(filename) do
|
18
|
+
require 'prawn/measurement_extensions'
|
19
|
+
|
20
|
+
%i[mm cm dm m in yd ft].each do |measurement|
|
21
|
+
text "1 #{measurement} in PDF Points: #{1.public_send(measurement)} pt"
|
23
22
|
move_down 5.mm
|
24
23
|
end
|
25
24
|
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
3
|
# This is the most important concept you need to learn about Prawn:
|
4
4
|
#
|
5
5
|
# PDF documents have the origin <code>[0,0]</code> at the bottom-left corner of
|
@@ -21,17 +21,16 @@
|
|
21
21
|
#
|
22
22
|
# The following snippet strokes a circle on the margin box origin. Then strokes
|
23
23
|
# the boundaries of a bounding box and a circle on its origin.
|
24
|
-
|
25
|
-
|
26
|
-
%w[.. example_helper]))
|
24
|
+
|
25
|
+
require_relative '../example_helper'
|
27
26
|
|
28
27
|
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
29
|
-
Prawn::Example.generate(filename) do
|
28
|
+
Prawn::ManualBuilder::Example.generate(filename) do
|
30
29
|
stroke_axis
|
31
|
-
|
30
|
+
|
32
31
|
stroke_circle [0, 0], 10
|
33
|
-
|
34
|
-
bounding_box([100, 300], :
|
32
|
+
|
33
|
+
bounding_box([100, 300], width: 300, height: 200) do
|
35
34
|
stroke_bounds
|
36
35
|
stroke_circle [0, 0], 10
|
37
36
|
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
3
|
# Another group of helpers for changing the cursor position are the pad methods.
|
4
4
|
# They accept a numeric value and a block. <code>pad</code> will use the numeric
|
5
5
|
# value to move the cursor down both before and after the block content.
|
@@ -8,33 +8,32 @@
|
|
8
8
|
#
|
9
9
|
# <code>float</code> is a method for not changing the cursor. Pass it a block
|
10
10
|
# and the cursor will remain on the same place when the block returns.
|
11
|
-
|
12
|
-
|
13
|
-
%w[.. example_helper]))
|
11
|
+
|
12
|
+
require_relative '../example_helper'
|
14
13
|
|
15
14
|
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
16
|
-
Prawn::Example.generate(filename) do
|
15
|
+
Prawn::ManualBuilder::Example.generate(filename) do
|
17
16
|
stroke_horizontal_rule
|
18
|
-
pad(20) { text
|
19
|
-
|
17
|
+
pad(20) { text 'Text padded both before and after.' }
|
18
|
+
|
20
19
|
stroke_horizontal_rule
|
21
|
-
pad_top(20) { text
|
22
|
-
|
20
|
+
pad_top(20) { text 'Text padded on the top.' }
|
21
|
+
|
23
22
|
stroke_horizontal_rule
|
24
|
-
pad_bottom(20) { text
|
25
|
-
|
23
|
+
pad_bottom(20) { text 'Text padded on the bottom.' }
|
24
|
+
|
26
25
|
stroke_horizontal_rule
|
27
26
|
move_down 30
|
28
|
-
|
29
|
-
text
|
30
|
-
|
27
|
+
|
28
|
+
text 'Text written before the float block.'
|
29
|
+
|
31
30
|
float do
|
32
31
|
move_down 30
|
33
|
-
bounding_box([0, cursor], :
|
34
|
-
text
|
32
|
+
bounding_box([0, cursor], width: 200) do
|
33
|
+
text 'Text written inside the float block.'
|
35
34
|
stroke_bounds
|
36
35
|
end
|
37
36
|
end
|
38
37
|
|
39
|
-
text
|
38
|
+
text 'Text written after the float block.'
|
40
39
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# The recommended way to extend Prawn's functionality is to include the
|
4
|
+
# <code>Prawn::View</code> mixin in your own class, which will make all
|
5
|
+
# <code>Prawn::Document</code> methods available to your custom objects.
|
6
|
+
#
|
7
|
+
# This approach is preferred over inheriting from
|
8
|
+
# <code>Prawn::Document</code>, as your state will be kept completely separate
|
9
|
+
# from <code>Prawn::Document</code>'s, thus avoiding accidental method
|
10
|
+
# collisions.
|
11
|
+
#
|
12
|
+
# Note that <code>Prawn::View</code> lazily instantiates a
|
13
|
+
# <code>Prawn::Document</code> with default initialization settings, such as
|
14
|
+
# page size, layout, margins, etc.
|
15
|
+
#
|
16
|
+
# By defining your own <code>document</code> method, as shown in the example,
|
17
|
+
# you will be able to override those settings and initialize a
|
18
|
+
# <code>Prawn::Document</code> to your heart's content. This method will be
|
19
|
+
# called repeatedly by <code>Prawn::View</code>, so be sure to memoize the
|
20
|
+
# object by assigning it to an instance variable via the <code>||=</code>
|
21
|
+
# operator.
|
22
|
+
|
23
|
+
require_relative '../example_helper'
|
24
|
+
|
25
|
+
class Greeter
|
26
|
+
include Prawn::View
|
27
|
+
|
28
|
+
def initialize(name)
|
29
|
+
@name = name
|
30
|
+
end
|
31
|
+
|
32
|
+
def say_hello
|
33
|
+
text "Hello, #{@name}!"
|
34
|
+
end
|
35
|
+
|
36
|
+
def say_goodbye
|
37
|
+
font('Courier') do
|
38
|
+
text "Goodbye, #{@name}!"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
greeter = Greeter.new('Gregory')
|
44
|
+
|
45
|
+
greeter.say_hello
|
46
|
+
greeter.say_goodbye
|
47
|
+
|
48
|
+
greeter.save_as('greetings.pdf')
|
@@ -1,39 +1,41 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
3
|
# Examples for bounding boxes.
|
4
|
-
#
|
5
|
-
require File.expand_path(File.join(File.dirname(__FILE__),
|
6
|
-
%w[.. example_helper]))
|
7
4
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
s.example
|
5
|
+
require_relative '../example_helper'
|
6
|
+
|
7
|
+
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
8
|
+
Prawn::ManualBuilder::Example.generate(filename, page_size: 'FOLIO') do
|
9
|
+
package 'bounding_box' do |p|
|
10
|
+
p.section 'Basics' do |s|
|
11
|
+
s.example 'creation'
|
12
|
+
s.example 'bounds'
|
15
13
|
end
|
16
|
-
|
17
|
-
p.section
|
18
|
-
s.example
|
19
|
-
s.example
|
20
|
-
s.example
|
21
|
-
s.example
|
22
|
-
s.example
|
14
|
+
|
15
|
+
p.section 'Advanced' do |s|
|
16
|
+
s.example 'stretchy'
|
17
|
+
s.example 'nesting'
|
18
|
+
s.example 'indentation'
|
19
|
+
s.example 'canvas'
|
20
|
+
s.example 'russian_boxes'
|
23
21
|
end
|
24
|
-
|
22
|
+
|
25
23
|
p.intro do
|
26
|
-
prose
|
24
|
+
prose <<-TEXT
|
25
|
+
Bounding boxes are the basic containers for structuring the content
|
26
|
+
flow. Even being low level building blocks sometimes their simplicity is
|
27
|
+
very welcome.
|
27
28
|
|
28
|
-
|
29
|
+
The examples show:
|
30
|
+
TEXT
|
29
31
|
|
30
|
-
list(
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
32
|
+
list(
|
33
|
+
'How to create bounding boxes with specific dimensions',
|
34
|
+
'How to inspect the current bounding box for its coordinates',
|
35
|
+
'Stretchy bounding boxes',
|
36
|
+
'Nested bounding boxes',
|
37
|
+
'Indent blocks'
|
38
|
+
)
|
36
39
|
end
|
37
|
-
|
38
40
|
end
|
39
41
|
end
|
@@ -1,7 +1,7 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
3
|
# The <code>bounds</code> method returns the current bounding box. This is
|
4
|
-
# useful because the <code>Prawn::
|
4
|
+
# useful because the <code>Prawn::BoundingBox</code> exposes some nice boundary
|
5
5
|
# helpers.
|
6
6
|
#
|
7
7
|
# <code>top</code>, <code>bottom</code>, <code>left</code> and
|
@@ -16,32 +16,31 @@
|
|
16
16
|
#
|
17
17
|
# The following snippet shows the boundaries for the margin box side by side
|
18
18
|
# with the boundaries for a custom bounding box.
|
19
|
-
|
20
|
-
|
21
|
-
%w[.. example_helper]))
|
19
|
+
|
20
|
+
require_relative '../example_helper'
|
22
21
|
|
23
22
|
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
24
|
-
Prawn::Example.generate(filename) do
|
23
|
+
Prawn::ManualBuilder::Example.generate(filename) do
|
25
24
|
def print_coordinates
|
26
25
|
text "top: #{bounds.top}"
|
27
26
|
text "bottom: #{bounds.bottom}"
|
28
27
|
text "left: #{bounds.left}"
|
29
28
|
text "right: #{bounds.right}"
|
30
|
-
|
29
|
+
|
31
30
|
move_down 10
|
32
|
-
|
33
|
-
text "absolute top: #{
|
34
|
-
text "absolute bottom: #{
|
35
|
-
text "absolute left: #{
|
36
|
-
text "absolute right: #{
|
31
|
+
|
32
|
+
text "absolute top: #{bounds.absolute_top.to_f.round(2)}"
|
33
|
+
text "absolute bottom: #{bounds.absolute_bottom.to_f.round(2)}"
|
34
|
+
text "absolute left: #{bounds.absolute_left.to_f.round(2)}"
|
35
|
+
text "absolute right: #{bounds.absolute_right.to_f.round(2)}"
|
37
36
|
end
|
38
|
-
|
39
|
-
text
|
37
|
+
|
38
|
+
text 'Margin box bounds:'
|
40
39
|
move_down 5
|
41
40
|
print_coordinates
|
42
|
-
|
43
|
-
bounding_box([250, cursor + 140], :
|
44
|
-
text
|
41
|
+
|
42
|
+
bounding_box([250, cursor + 140], width: 200, height: 150) do
|
43
|
+
text 'This bounding box bounds:'
|
45
44
|
move_down 5
|
46
45
|
print_coordinates
|
47
46
|
transparent(0.5) { stroke_bounds }
|
@@ -1,5 +1,5 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
3
|
# The origin example already mentions that a new document already comes with
|
4
4
|
# a margin box whose bottom left corner is used as the origin for calculating
|
5
5
|
# coordinates.
|
@@ -9,16 +9,15 @@
|
|
9
9
|
# box mapped to the absolute coordinates and evaluating the code inside it.
|
10
10
|
#
|
11
11
|
# The following snippet draws a circle on each of the four absolute corners.
|
12
|
-
|
13
|
-
|
14
|
-
%w[.. example_helper]))
|
12
|
+
|
13
|
+
require_relative '../example_helper'
|
15
14
|
|
16
15
|
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
17
|
-
Prawn::Example.generate(filename) do
|
16
|
+
Prawn::ManualBuilder::Example.generate(filename) do
|
18
17
|
canvas do
|
19
|
-
fill_circle [bounds.left, bounds.top],
|
20
|
-
fill_circle [bounds.right, bounds.top],
|
18
|
+
fill_circle [bounds.left, bounds.top], 30
|
19
|
+
fill_circle [bounds.right, bounds.top], 30
|
21
20
|
fill_circle [bounds.right, bounds.bottom], 30
|
22
|
-
fill_circle [0, 0],
|
21
|
+
fill_circle [0, 0], 30
|
23
22
|
end
|
24
23
|
end
|