prawn 1.1.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 +1 -0
- data/GPLv2 +20 -21
- data/Gemfile +3 -9
- data/Rakefile +9 -40
- data/lib/prawn/document/bounding_box.rb +54 -40
- data/lib/prawn/document/column_box.rb +8 -10
- data/lib/prawn/document/internals.rb +39 -146
- data/lib/prawn/document/span.rb +23 -17
- data/lib/prawn/document.rb +217 -182
- data/lib/prawn/encoding.rb +69 -101
- data/lib/prawn/errors.rb +47 -43
- data/lib/prawn/font.rb +124 -104
- data/lib/prawn/font_metric_cache.rb +23 -21
- data/lib/prawn/fonts/afm.rb +292 -0
- data/lib/prawn/{font → fonts}/dfont.rb +5 -12
- data/lib/prawn/fonts/otf.rb +11 -0
- data/lib/prawn/fonts/ttc.rb +36 -0
- data/lib/prawn/{font → fonts}/ttf.rb +140 -88
- data/lib/prawn/graphics/blend_mode.rb +65 -0
- data/lib/prawn/graphics/cap_style.rb +5 -5
- data/lib/prawn/graphics/color.rb +46 -44
- data/lib/prawn/graphics/dash.rb +27 -11
- data/lib/prawn/graphics/join_style.rb +11 -6
- data/lib/prawn/graphics/patterns.rb +220 -78
- data/lib/prawn/graphics/transformation.rb +20 -12
- data/lib/prawn/graphics/transparency.rb +20 -18
- data/lib/prawn/graphics.rb +153 -115
- data/lib/prawn/grid.rb +93 -50
- data/lib/prawn/image_handler.rb +4 -4
- data/lib/prawn/images/image.rb +3 -2
- data/lib/prawn/images/jpg.rb +31 -24
- data/lib/prawn/images/png.rb +101 -68
- data/lib/prawn/images.rb +64 -56
- data/lib/prawn/measurement_extensions.rb +10 -9
- data/lib/prawn/measurements.rb +20 -23
- data/lib/prawn/outline.rb +96 -75
- data/lib/prawn/repeater.rb +16 -16
- data/lib/prawn/security/arcfour.rb +2 -2
- data/lib/prawn/security.rb +100 -85
- data/lib/prawn/soft_mask.rb +37 -38
- data/lib/prawn/stamp.rb +28 -13
- data/lib/prawn/text/box.rb +24 -29
- data/lib/prawn/text/formatted/arranger.rb +108 -63
- data/lib/prawn/text/formatted/box.rb +187 -124
- data/lib/prawn/text/formatted/fragment.rb +24 -20
- data/lib/prawn/text/formatted/line_wrap.rb +133 -73
- data/lib/prawn/text/formatted/parser.rb +147 -127
- data/lib/prawn/text/formatted/wrap.rb +48 -35
- data/lib/prawn/text/formatted.rb +5 -5
- data/lib/prawn/text.rb +103 -68
- data/lib/prawn/transformation_stack.rb +44 -0
- data/lib/prawn/utilities.rb +10 -22
- data/lib/prawn/version.rb +5 -0
- data/lib/prawn/view.rb +101 -0
- data/lib/prawn.rb +39 -54
- data/manual/basic_concepts/adding_pages.rb +6 -7
- data/manual/basic_concepts/basic_concepts.rb +34 -25
- data/manual/basic_concepts/creation.rb +10 -11
- data/manual/basic_concepts/cursor.rb +4 -5
- data/manual/basic_concepts/measurement.rb +8 -9
- data/manual/basic_concepts/origin.rb +5 -6
- data/manual/basic_concepts/other_cursor_helpers.rb +11 -12
- data/manual/basic_concepts/view.rb +48 -0
- data/manual/bounding_box/bounding_box.rb +30 -28
- data/manual/bounding_box/bounds.rb +12 -13
- data/manual/bounding_box/canvas.rb +7 -8
- data/manual/bounding_box/creation.rb +6 -7
- data/manual/bounding_box/indentation.rb +14 -15
- data/manual/bounding_box/nesting.rb +25 -18
- data/manual/bounding_box/russian_boxes.rb +18 -18
- data/manual/bounding_box/stretchy.rb +12 -14
- data/manual/contents.rb +28 -22
- data/manual/cover.rb +33 -32
- data/manual/document_and_page_options/background.rb +15 -13
- data/manual/document_and_page_options/document_and_page_options.rb +24 -22
- data/manual/document_and_page_options/metadata.rb +20 -18
- data/manual/document_and_page_options/page_margins.rb +18 -20
- data/manual/document_and_page_options/page_size.rb +13 -13
- data/manual/document_and_page_options/print_scaling.rb +18 -15
- data/manual/example_helper.rb +5 -4
- data/manual/graphics/blend_mode.rb +52 -0
- data/manual/graphics/circle_and_ellipse.rb +4 -5
- data/manual/graphics/color.rb +7 -9
- data/manual/graphics/common_lines.rb +7 -8
- data/manual/graphics/fill_and_stroke.rb +5 -6
- data/manual/graphics/fill_rules.rb +12 -11
- data/manual/graphics/gradients.rb +27 -21
- data/manual/graphics/graphics.rb +46 -40
- data/manual/graphics/helper.rb +19 -9
- data/manual/graphics/line_width.rb +8 -7
- data/manual/graphics/lines_and_curves.rb +8 -9
- data/manual/graphics/polygon.rb +6 -8
- data/manual/graphics/rectangle.rb +4 -5
- data/manual/graphics/rotate.rb +6 -9
- data/manual/graphics/scale.rb +14 -13
- data/manual/graphics/soft_masks.rb +4 -6
- data/manual/graphics/stroke_cap.rb +7 -8
- data/manual/graphics/stroke_dash.rb +15 -16
- data/manual/graphics/stroke_join.rb +6 -7
- data/manual/graphics/translate.rb +10 -10
- data/manual/graphics/transparency.rb +7 -9
- data/manual/how_to_read_this_manual.rb +8 -9
- data/manual/images/absolute_position.rb +6 -7
- data/manual/images/fit.rb +7 -8
- data/manual/images/horizontal.rb +10 -11
- data/manual/images/images.rb +28 -27
- data/manual/images/plain_image.rb +5 -6
- data/manual/images/scale.rb +9 -10
- data/manual/images/vertical.rb +16 -14
- data/manual/images/width_and_height.rb +10 -11
- data/manual/layout/boxes.rb +10 -11
- data/manual/layout/content.rb +9 -10
- data/manual/layout/layout.rb +17 -18
- data/manual/layout/simple_grid.rb +6 -7
- data/manual/outline/add_subsection_to.rb +20 -21
- data/manual/outline/insert_section_after.rb +15 -16
- data/manual/outline/outline.rb +22 -21
- data/manual/outline/sections_and_pages.rb +17 -18
- data/manual/repeatable_content/alternate_page_numbering.rb +36 -0
- data/manual/repeatable_content/page_numbering.rb +17 -16
- data/manual/repeatable_content/repeatable_content.rb +27 -23
- data/manual/repeatable_content/repeater.rb +15 -16
- data/manual/repeatable_content/stamp.rb +14 -15
- data/manual/security/encryption.rb +8 -11
- data/manual/security/permissions.rb +20 -15
- data/manual/security/security.rb +18 -18
- data/manual/table.rb +16 -0
- data/manual/text/alignment.rb +16 -17
- data/manual/text/color.rb +12 -12
- data/manual/text/column_box.rb +9 -11
- data/manual/text/fallback_fonts.rb +25 -21
- data/manual/text/font.rb +11 -12
- data/manual/text/font_size.rb +13 -14
- data/manual/text/font_style.rb +10 -8
- data/manual/text/formatted_callbacks.rb +33 -23
- data/manual/text/formatted_text.rb +36 -25
- data/manual/text/free_flowing_text.rb +22 -23
- data/manual/text/inline.rb +18 -19
- data/manual/text/kerning_and_character_spacing.rb +14 -15
- data/manual/text/leading.rb +7 -8
- data/manual/text/line_wrapping.rb +37 -18
- data/manual/text/paragraph_indentation.rb +15 -10
- data/manual/text/positioned_text.rb +16 -17
- data/manual/text/registering_families.rb +27 -24
- data/manual/text/rendering_and_color.rb +9 -10
- data/manual/text/right_to_left_text.rb +30 -19
- data/manual/text/rotation.rb +33 -24
- data/manual/text/single_usage.rb +8 -9
- data/manual/text/text.rb +56 -54
- data/manual/text/text_box_excess.rb +20 -17
- data/manual/text/text_box_extensions.rb +18 -15
- data/manual/text/text_box_overflow.rb +24 -17
- data/manual/text/utf8.rb +12 -13
- data/manual/text/win_ansi_charset.rb +28 -25
- data/prawn.gemspec +45 -50
- data/spec/extensions/encoding_helpers.rb +3 -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 +19 -25
- data.tar.gz.sig +0 -0
- metadata +113 -276
- metadata.gz.sig +0 -0
- data/data/encodings/win_ansi.txt +0 -29
- data/data/images/16bit.alpha +0 -0
- data/data/images/16bit.color +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/dice.alpha +0 -0
- data/data/images/dice.color +0 -0
- data/data/images/dice.png +0 -0
- data/data/images/dice_interlaced.png +0 -0
- data/data/images/fractal.jpg +0 -0
- data/data/images/indexed_color.dat +0 -0
- data/data/images/indexed_color.png +0 -0
- data/data/images/letterhead.jpg +0 -0
- data/data/images/license.md +0 -8
- data/data/images/page_white_text.alpha +0 -0
- data/data/images/page_white_text.color +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/prawn/document/graphics_state.rb +0 -73
- data/lib/prawn/font/afm.rb +0 -247
- data/lib/prawn/table/cell/image.rb +0 -69
- data/lib/prawn/table/cell/in_table.rb +0 -33
- data/lib/prawn/table/cell/span_dummy.rb +0 -93
- data/lib/prawn/table/cell/subtable.rb +0 -66
- data/lib/prawn/table/cell/text.rb +0 -154
- data/lib/prawn/table/cell.rb +0 -772
- data/lib/prawn/table/cells.rb +0 -255
- data/lib/prawn/table/column_width_calculator.rb +0 -182
- data/lib/prawn/table.rb +0 -644
- 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/spec/acceptance/png.rb +0 -25
- data/spec/annotations_spec.rb +0 -74
- data/spec/bounding_box_spec.rb +0 -510
- data/spec/cell_spec.rb +0 -629
- data/spec/column_box_spec.rb +0 -65
- data/spec/destinations_spec.rb +0 -15
- data/spec/document_spec.rb +0 -730
- data/spec/extensions/mocha.rb +0 -46
- data/spec/font_metric_cache_spec.rb +0 -52
- data/spec/font_spec.rb +0 -449
- data/spec/formatted_text_arranger_spec.rb +0 -421
- data/spec/formatted_text_box_spec.rb +0 -639
- data/spec/formatted_text_fragment_spec.rb +0 -298
- data/spec/graphics_spec.rb +0 -669
- data/spec/grid_spec.rb +0 -96
- data/spec/image_handler_spec.rb +0 -54
- data/spec/images_spec.rb +0 -153
- data/spec/inline_formatted_text_parser_spec.rb +0 -564
- data/spec/jpg_spec.rb +0 -25
- data/spec/line_wrap_spec.rb +0 -344
- data/spec/measurement_units_spec.rb +0 -25
- data/spec/outline_spec.rb +0 -430
- data/spec/png_spec.rb +0 -237
- data/spec/reference_spec.rb +0 -25
- data/spec/repeater_spec.rb +0 -160
- data/spec/security_spec.rb +0 -158
- data/spec/soft_mask_spec.rb +0 -79
- data/spec/span_spec.rb +0 -44
- data/spec/stamp_spec.rb +0 -160
- data/spec/stroke_styles_spec.rb +0 -211
- data/spec/table/span_dummy_spec.rb +0 -17
- data/spec/table_spec.rb +0 -1527
- data/spec/text_at_spec.rb +0 -115
- data/spec/text_box_spec.rb +0 -1034
- data/spec/text_rendering_mode_spec.rb +0 -45
- data/spec/text_spacing_spec.rb +0 -93
- data/spec/text_spec.rb +0 -437
- data/spec/text_with_inline_formatting_spec.rb +0 -35
- data/spec/transparency_spec.rb +0 -91
data/lib/prawn/grid.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# grid.rb: Provides a basic grid layout system for Prawn
|
4
4
|
#
|
@@ -28,38 +28,43 @@ module Prawn
|
|
28
28
|
# or work with the grid system directly.
|
29
29
|
#
|
30
30
|
# @pdf.grid # Get the Grid directly
|
31
|
-
# @pdf.grid([0,1]) # Get the
|
31
|
+
# @pdf.grid([0,1]) # Get the GridBox at [0,1]
|
32
32
|
# @pdf.grid([0,1], [1,2]) # Get a multi-box spanning from [0,1] to [1,2]
|
33
33
|
#
|
34
34
|
def grid(*args)
|
35
35
|
@boxes ||= {}
|
36
|
-
@boxes[args] ||=
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
36
|
+
@boxes[args] ||=
|
37
|
+
begin
|
38
|
+
if args.empty?
|
39
|
+
@grid
|
40
|
+
else
|
41
|
+
g1, g2 = args
|
42
|
+
|
43
|
+
if g1.is_a?(Array) && g2.is_a?(Array) &&
|
44
|
+
g1.length == 2 && g2.length == 2
|
45
|
+
multi_box(single_box(*g1), single_box(*g2))
|
46
|
+
else
|
47
|
+
single_box(g1, g2)
|
48
|
+
end
|
49
|
+
end
|
45
50
|
end
|
46
|
-
end
|
47
51
|
end
|
48
52
|
|
49
53
|
# A Grid represents the entire grid system of a Page and calculates
|
50
54
|
# the column width and row height of the base box.
|
51
55
|
#
|
52
|
-
# @
|
56
|
+
# @group Experimental API
|
53
57
|
class Grid
|
54
58
|
attr_reader :pdf, :columns, :rows, :gutter, :row_gutter, :column_gutter
|
59
|
+
|
55
60
|
def initialize(pdf, options = {}) # :nodoc:
|
56
|
-
valid_options = [
|
61
|
+
valid_options = %i[columns rows gutter row_gutter column_gutter]
|
57
62
|
Prawn.verify_options valid_options, options
|
58
63
|
|
59
64
|
@pdf = pdf
|
60
65
|
@columns = options[:columns]
|
61
66
|
@rows = options[:rows]
|
62
|
-
|
67
|
+
apply_gutter(options)
|
63
68
|
end
|
64
69
|
|
65
70
|
# Calculates the base width of boxes.
|
@@ -69,14 +74,14 @@ module Prawn
|
|
69
74
|
|
70
75
|
# Calculates the base height of boxes.
|
71
76
|
def row_height
|
72
|
-
|
77
|
+
@row_height ||= subdivide(pdf.bounds.height, rows, row_gutter)
|
73
78
|
end
|
74
79
|
|
75
80
|
# Diagnostic tool to show all of the grids. Defaults to gray.
|
76
|
-
def show_all(color =
|
77
|
-
|
78
|
-
|
79
|
-
pdf.grid(
|
81
|
+
def show_all(color = 'CCCCCC')
|
82
|
+
rows.times do |row|
|
83
|
+
columns.times do |column|
|
84
|
+
pdf.grid(row, column).show(color)
|
80
85
|
end
|
81
86
|
end
|
82
87
|
end
|
@@ -87,12 +92,13 @@ module Prawn
|
|
87
92
|
(total.to_f - (gutter * (num - 1).to_f)) / num.to_f
|
88
93
|
end
|
89
94
|
|
90
|
-
def
|
91
|
-
if options.
|
95
|
+
def apply_gutter(options)
|
96
|
+
if options.key?(:gutter)
|
92
97
|
@gutter = options[:gutter].to_f
|
93
|
-
@row_gutter
|
98
|
+
@row_gutter = @gutter
|
99
|
+
@column_gutter = @gutter
|
94
100
|
else
|
95
|
-
@row_gutter
|
101
|
+
@row_gutter = options[:row_gutter].to_f
|
96
102
|
@column_gutter = options[:column_gutter].to_f
|
97
103
|
@gutter = 0
|
98
104
|
end
|
@@ -103,21 +109,21 @@ module Prawn
|
|
103
109
|
# A Grid object has methods that allow easy access to the coordinates of
|
104
110
|
# its corners, which can be plugged into most existing prawnmethods.
|
105
111
|
#
|
106
|
-
# @
|
112
|
+
# @group Experimental API
|
107
113
|
class GridBox
|
108
114
|
attr_reader :pdf
|
109
115
|
|
110
|
-
def initialize(pdf,
|
116
|
+
def initialize(pdf, rows, columns)
|
111
117
|
@pdf = pdf
|
112
|
-
@
|
113
|
-
@
|
118
|
+
@rows = rows
|
119
|
+
@columns = columns
|
114
120
|
end
|
115
121
|
|
116
122
|
# Mostly diagnostic method that outputs the name of a box as
|
117
123
|
# col_num, row_num
|
118
124
|
#
|
119
125
|
def name
|
120
|
-
"#{@
|
126
|
+
"#{@rows},#{@columns}"
|
121
127
|
end
|
122
128
|
|
123
129
|
# :nodoc
|
@@ -142,7 +148,7 @@ module Prawn
|
|
142
148
|
|
143
149
|
# x-coordinate of left side
|
144
150
|
def left
|
145
|
-
@left ||= (width + grid.column_gutter) * @
|
151
|
+
@left ||= (width + grid.column_gutter) * @columns.to_f
|
146
152
|
end
|
147
153
|
|
148
154
|
# x-coordinate of right side
|
@@ -152,7 +158,7 @@ module Prawn
|
|
152
158
|
|
153
159
|
# y-coordinate of the top
|
154
160
|
def top
|
155
|
-
@top ||= total_height - ((height + grid.row_gutter) * @
|
161
|
+
@top ||= total_height - ((height + grid.row_gutter) * @rows.to_f)
|
156
162
|
end
|
157
163
|
|
158
164
|
# y-coordinate of the bottom
|
@@ -182,16 +188,16 @@ module Prawn
|
|
182
188
|
|
183
189
|
# Creates a standard bounding box based on the grid box.
|
184
190
|
def bounding_box(&blk)
|
185
|
-
pdf.bounding_box(top_left, :
|
191
|
+
pdf.bounding_box(top_left, width: width, height: height, &blk)
|
186
192
|
end
|
187
193
|
|
188
194
|
# Diagnostic method
|
189
|
-
def show(grid_color =
|
190
|
-
|
195
|
+
def show(grid_color = 'CCCCCC')
|
196
|
+
bounding_box do
|
191
197
|
original_stroke_color = pdf.stroke_color
|
192
198
|
|
193
199
|
pdf.stroke_color = grid_color
|
194
|
-
pdf.text
|
200
|
+
pdf.text name
|
195
201
|
pdf.stroke_bounds
|
196
202
|
|
197
203
|
pdf.stroke_color = original_stroke_color
|
@@ -199,6 +205,7 @@ module Prawn
|
|
199
205
|
end
|
200
206
|
|
201
207
|
private
|
208
|
+
|
202
209
|
def grid
|
203
210
|
pdf.grid
|
204
211
|
end
|
@@ -206,19 +213,21 @@ module Prawn
|
|
206
213
|
|
207
214
|
# A MultiBox is specified by 2 Boxes and spans the areas between.
|
208
215
|
#
|
209
|
-
# @
|
210
|
-
class MultiBox
|
211
|
-
def initialize(pdf,
|
216
|
+
# @group Experimental API
|
217
|
+
class MultiBox
|
218
|
+
def initialize(pdf, box1, box2)
|
212
219
|
@pdf = pdf
|
213
|
-
@
|
220
|
+
@boxes = [box1, box2]
|
214
221
|
end
|
215
222
|
|
223
|
+
attr_reader :pdf
|
224
|
+
|
216
225
|
def name
|
217
|
-
@
|
226
|
+
@boxes.map(&:name).join(':')
|
218
227
|
end
|
219
228
|
|
220
229
|
def total_height
|
221
|
-
@
|
230
|
+
@boxes[0].total_height
|
222
231
|
end
|
223
232
|
|
224
233
|
def width
|
@@ -230,7 +239,7 @@ module Prawn
|
|
230
239
|
end
|
231
240
|
|
232
241
|
def gutter
|
233
|
-
@
|
242
|
+
@boxes[0].gutter
|
234
243
|
end
|
235
244
|
|
236
245
|
def left
|
@@ -249,31 +258,65 @@ module Prawn
|
|
249
258
|
bottom_box.bottom
|
250
259
|
end
|
251
260
|
|
261
|
+
def top_left
|
262
|
+
[left, top]
|
263
|
+
end
|
264
|
+
|
265
|
+
def top_right
|
266
|
+
[right, top]
|
267
|
+
end
|
268
|
+
|
269
|
+
def bottom_left
|
270
|
+
[left, bottom]
|
271
|
+
end
|
272
|
+
|
273
|
+
def bottom_right
|
274
|
+
[right, bottom]
|
275
|
+
end
|
276
|
+
|
277
|
+
def bounding_box(&blk)
|
278
|
+
pdf.bounding_box(top_left, width: width, height: height, &blk)
|
279
|
+
end
|
280
|
+
|
281
|
+
def show(grid_color = 'CCCCCC')
|
282
|
+
bounding_box do
|
283
|
+
original_stroke_color = pdf.stroke_color
|
284
|
+
|
285
|
+
pdf.stroke_color = grid_color
|
286
|
+
pdf.text name
|
287
|
+
pdf.stroke_bounds
|
288
|
+
|
289
|
+
pdf.stroke_color = original_stroke_color
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
252
293
|
private
|
294
|
+
|
253
295
|
def left_box
|
254
|
-
@left_box ||= @
|
296
|
+
@left_box ||= @boxes.min_by(&:left)
|
255
297
|
end
|
256
298
|
|
257
299
|
def right_box
|
258
|
-
@right_box ||= @
|
300
|
+
@right_box ||= @boxes.max_by(&:right)
|
259
301
|
end
|
260
302
|
|
261
303
|
def top_box
|
262
|
-
@top_box ||= @
|
304
|
+
@top_box ||= @boxes.max_by(&:top)
|
263
305
|
end
|
264
306
|
|
265
307
|
def bottom_box
|
266
|
-
@bottom_box ||= @
|
308
|
+
@bottom_box ||= @boxes.min_by(&:bottom)
|
267
309
|
end
|
268
310
|
end
|
269
311
|
|
270
312
|
private
|
271
|
-
|
272
|
-
|
313
|
+
|
314
|
+
def single_box(rows, columns)
|
315
|
+
GridBox.new(self, rows, columns)
|
273
316
|
end
|
274
317
|
|
275
|
-
def multi_box(
|
276
|
-
MultiBox.new(self,
|
318
|
+
def multi_box(box1, box2)
|
319
|
+
MultiBox.new(self, box1, box2)
|
277
320
|
end
|
278
321
|
end
|
279
322
|
end
|
data/lib/prawn/image_handler.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# ImageHandler provides a way to register image processors with Prawn
|
4
4
|
#
|
@@ -29,16 +29,16 @@ module Prawn
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def unregister(handler)
|
32
|
-
@handlers.reject!{ |h| h == handler }
|
32
|
+
@handlers.reject! { |h| h == handler }
|
33
33
|
end
|
34
34
|
|
35
35
|
def find(image_blob)
|
36
|
-
handler = @handlers.find{ |h| h.can_render? image_blob }
|
36
|
+
handler = @handlers.find { |h| h.can_render? image_blob }
|
37
37
|
|
38
38
|
return handler if handler
|
39
39
|
|
40
40
|
raise Prawn::Errors::UnsupportedImageType,
|
41
|
-
|
41
|
+
'image file is an unrecognised format'
|
42
42
|
end
|
43
43
|
end
|
44
44
|
end
|
data/lib/prawn/images/image.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
2
3
|
# image.rb : Base class for image info objects
|
3
4
|
#
|
4
5
|
# Copyright September 2011, Brad Ediger. All rights reserved.
|
@@ -42,7 +43,7 @@ module Prawn
|
|
42
43
|
self.scaled_width = w
|
43
44
|
self.scaled_height = h
|
44
45
|
|
45
|
-
[w,h]
|
46
|
+
[w, h]
|
46
47
|
end
|
47
48
|
end
|
48
49
|
end
|
data/lib/prawn/images/jpg.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# encoding: ASCII-8BIT
|
2
2
|
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
3
5
|
# jpg.rb : Extracts the data from a JPG that is needed for embedding
|
4
6
|
#
|
5
7
|
# Copyright April 2008, James Healy. All Rights Reserved.
|
@@ -10,20 +12,24 @@ require 'stringio'
|
|
10
12
|
|
11
13
|
module Prawn
|
12
14
|
module Images
|
13
|
-
|
14
15
|
# A convenience class that wraps the logic for extracting the parts
|
15
16
|
# of a JPG image that we need to embed them in a PDF
|
16
17
|
#
|
17
18
|
class JPG < Image
|
19
|
+
class FormatError < StandardError; end
|
20
|
+
|
18
21
|
# @group Extension API
|
19
22
|
|
20
23
|
attr_reader :width, :height, :bits, :channels
|
21
24
|
attr_accessor :scaled_width, :scaled_height
|
22
25
|
|
23
|
-
JPEG_SOF_BLOCKS = [
|
26
|
+
JPEG_SOF_BLOCKS = [
|
27
|
+
0xC0, 0xC1, 0xC2, 0xC3, 0xC5, 0xC6, 0xC7, 0xC9, 0xCA, 0xCB, 0xCD, 0xCE,
|
28
|
+
0xCF
|
29
|
+
].freeze
|
24
30
|
|
25
31
|
def self.can_render?(image_blob)
|
26
|
-
image_blob[0, 3].unpack(
|
32
|
+
image_blob[0, 3].unpack('C*') == [255, 216, 255]
|
27
33
|
end
|
28
34
|
|
29
35
|
# Process a new JPG image
|
@@ -31,18 +37,19 @@ module Prawn
|
|
31
37
|
# <tt>:data</tt>:: A binary string of JPEG data
|
32
38
|
#
|
33
39
|
def initialize(data)
|
40
|
+
super()
|
34
41
|
@data = data
|
35
42
|
d = StringIO.new(@data)
|
36
43
|
d.binmode
|
37
44
|
|
38
45
|
c_marker = 0xff # Section marker.
|
39
|
-
d.seek(2)
|
46
|
+
d.seek(2) # Skip the first two bytes of JPEG identifier.
|
40
47
|
loop do
|
41
48
|
marker, code, length = d.read(4).unpack('CCn')
|
42
|
-
raise
|
49
|
+
raise FormatError, 'JPEG marker not found!' if marker != c_marker
|
43
50
|
|
44
51
|
if JPEG_SOF_BLOCKS.include?(code)
|
45
|
-
@bits, @height, @width, @channels = d.read(6).unpack(
|
52
|
+
@bits, @height, @width, @channels = d.read(6).unpack('CnnC')
|
46
53
|
break
|
47
54
|
end
|
48
55
|
|
@@ -54,38 +61,38 @@ module Prawn
|
|
54
61
|
# a Reference to it.
|
55
62
|
#
|
56
63
|
def build_pdf_object(document)
|
57
|
-
color_space =
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
64
|
+
color_space =
|
65
|
+
case channels
|
66
|
+
when 1
|
67
|
+
:DeviceGray
|
68
|
+
when 3
|
69
|
+
:DeviceRGB
|
70
|
+
when 4
|
71
|
+
:DeviceCMYK
|
72
|
+
else
|
73
|
+
raise ArgumentError, 'JPG uses an unsupported number of channels'
|
74
|
+
end
|
67
75
|
|
68
76
|
obj = document.ref!(
|
69
|
-
:
|
70
|
-
:
|
71
|
-
:
|
72
|
-
:
|
73
|
-
:
|
74
|
-
:
|
77
|
+
Type: :XObject,
|
78
|
+
Subtype: :Image,
|
79
|
+
ColorSpace: color_space,
|
80
|
+
BitsPerComponent: bits,
|
81
|
+
Width: width,
|
82
|
+
Height: height
|
75
83
|
)
|
76
84
|
|
77
85
|
# add extra decode params for CMYK images. By swapping the
|
78
86
|
# min and max values from the default, we invert the colours. See
|
79
87
|
# section 4.8.4 of the spec.
|
80
88
|
if color_space == :DeviceCMYK
|
81
|
-
obj.data[:Decode] = [
|
89
|
+
obj.data[:Decode] = [1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0]
|
82
90
|
end
|
83
91
|
|
84
92
|
obj.stream << @data
|
85
93
|
obj.stream.filters << :DCTDecode
|
86
94
|
obj
|
87
95
|
end
|
88
|
-
|
89
96
|
end
|
90
97
|
end
|
91
98
|
end
|