hexapdf 0.32.1 → 0.33.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +76 -1
- data/README.md +9 -0
- data/examples/002-graphics.rb +15 -17
- data/examples/003-arcs.rb +9 -9
- data/examples/009-text_layouter_alignment.rb +1 -1
- data/examples/010-text_layouter_inline_boxes.rb +2 -2
- data/examples/011-text_layouter_line_wrapping.rb +1 -1
- data/examples/012-text_layouter_styling.rb +7 -7
- data/examples/013-text_layouter_shapes.rb +1 -1
- data/examples/014-text_in_polygon.rb +1 -1
- data/examples/015-boxes.rb +8 -7
- data/examples/016-frame_automatic_box_placement.rb +2 -2
- data/examples/017-frame_text_flow.rb +2 -1
- data/examples/018-composer.rb +1 -1
- data/examples/020-column_box.rb +2 -1
- data/examples/025-table_box.rb +46 -0
- data/lib/hexapdf/cli/command.rb +5 -2
- data/lib/hexapdf/cli/form.rb +5 -5
- data/lib/hexapdf/cli/inspect.rb +3 -3
- data/lib/hexapdf/cli.rb +4 -0
- data/lib/hexapdf/composer.rb +104 -52
- data/lib/hexapdf/configuration.rb +44 -39
- data/lib/hexapdf/content/canvas.rb +393 -267
- data/lib/hexapdf/content/color_space.rb +72 -25
- data/lib/hexapdf/content/graphic_object/arc.rb +57 -24
- data/lib/hexapdf/content/graphic_object/endpoint_arc.rb +66 -23
- data/lib/hexapdf/content/graphic_object/geom2d.rb +47 -6
- data/lib/hexapdf/content/graphic_object/solid_arc.rb +58 -36
- data/lib/hexapdf/content/graphic_object.rb +6 -7
- data/lib/hexapdf/content/graphics_state.rb +54 -45
- data/lib/hexapdf/content/operator.rb +52 -54
- data/lib/hexapdf/content/parser.rb +2 -2
- data/lib/hexapdf/content/processor.rb +15 -15
- data/lib/hexapdf/content/transformation_matrix.rb +1 -1
- data/lib/hexapdf/content.rb +5 -0
- data/lib/hexapdf/dictionary.rb +6 -5
- data/lib/hexapdf/dictionary_fields.rb +42 -14
- data/lib/hexapdf/digital_signature/cms_handler.rb +2 -2
- data/lib/hexapdf/digital_signature/handler.rb +1 -1
- data/lib/hexapdf/digital_signature/pkcs1_handler.rb +2 -3
- data/lib/hexapdf/digital_signature/signature.rb +6 -6
- data/lib/hexapdf/digital_signature/signatures.rb +13 -12
- data/lib/hexapdf/digital_signature/signing/default_handler.rb +14 -5
- data/lib/hexapdf/digital_signature/signing/signed_data_creator.rb +2 -4
- data/lib/hexapdf/digital_signature/signing/timestamp_handler.rb +4 -4
- data/lib/hexapdf/digital_signature/signing.rb +4 -0
- data/lib/hexapdf/digital_signature/verification_result.rb +2 -2
- data/lib/hexapdf/digital_signature.rb +7 -2
- data/lib/hexapdf/document/destinations.rb +12 -11
- data/lib/hexapdf/document/files.rb +1 -1
- data/lib/hexapdf/document/fonts.rb +1 -1
- data/lib/hexapdf/document/layout.rb +167 -39
- data/lib/hexapdf/document/pages.rb +3 -2
- data/lib/hexapdf/document.rb +89 -55
- data/lib/hexapdf/encryption/aes.rb +5 -5
- data/lib/hexapdf/encryption/arc4.rb +1 -1
- data/lib/hexapdf/encryption/fast_aes.rb +2 -2
- data/lib/hexapdf/encryption/fast_arc4.rb +1 -1
- data/lib/hexapdf/encryption/identity.rb +1 -1
- data/lib/hexapdf/encryption/ruby_aes.rb +1 -1
- data/lib/hexapdf/encryption/ruby_arc4.rb +1 -1
- data/lib/hexapdf/encryption/security_handler.rb +31 -24
- data/lib/hexapdf/encryption/standard_security_handler.rb +45 -36
- data/lib/hexapdf/encryption.rb +7 -2
- data/lib/hexapdf/error.rb +18 -0
- data/lib/hexapdf/filter/ascii85_decode.rb +1 -1
- data/lib/hexapdf/filter/ascii_hex_decode.rb +1 -1
- data/lib/hexapdf/filter/flate_decode.rb +1 -1
- data/lib/hexapdf/filter/lzw_decode.rb +1 -1
- data/lib/hexapdf/filter/pass_through.rb +1 -1
- data/lib/hexapdf/filter/predictor.rb +1 -1
- data/lib/hexapdf/filter/run_length_decode.rb +1 -1
- data/lib/hexapdf/filter.rb +55 -6
- data/lib/hexapdf/font/cmap/parser.rb +2 -2
- data/lib/hexapdf/font/cmap.rb +1 -1
- data/lib/hexapdf/font/encoding/difference_encoding.rb +1 -1
- data/lib/hexapdf/font/encoding/mac_expert_encoding.rb +1 -1
- data/lib/hexapdf/font/encoding/mac_roman_encoding.rb +2 -2
- data/lib/hexapdf/font/encoding/standard_encoding.rb +1 -1
- data/lib/hexapdf/font/encoding/symbol_encoding.rb +1 -1
- data/lib/hexapdf/font/encoding/win_ansi_encoding.rb +3 -3
- data/lib/hexapdf/font/encoding/zapf_dingbats_encoding.rb +1 -1
- data/lib/hexapdf/font/invalid_glyph.rb +3 -0
- data/lib/hexapdf/font/true_type_wrapper.rb +17 -4
- data/lib/hexapdf/font/type1_wrapper.rb +19 -4
- data/lib/hexapdf/font_loader/from_configuration.rb +5 -2
- data/lib/hexapdf/font_loader/from_file.rb +5 -5
- data/lib/hexapdf/font_loader/standard14.rb +3 -3
- data/lib/hexapdf/font_loader.rb +3 -0
- data/lib/hexapdf/image_loader/jpeg.rb +2 -2
- data/lib/hexapdf/image_loader/pdf.rb +1 -1
- data/lib/hexapdf/image_loader/png.rb +2 -2
- data/lib/hexapdf/image_loader.rb +1 -1
- data/lib/hexapdf/importer.rb +13 -0
- data/lib/hexapdf/layout/box.rb +9 -2
- data/lib/hexapdf/layout/box_fitter.rb +2 -2
- data/lib/hexapdf/layout/column_box.rb +18 -4
- data/lib/hexapdf/layout/frame.rb +30 -12
- data/lib/hexapdf/layout/image_box.rb +5 -0
- data/lib/hexapdf/layout/inline_box.rb +1 -0
- data/lib/hexapdf/layout/list_box.rb +17 -1
- data/lib/hexapdf/layout/page_style.rb +4 -4
- data/lib/hexapdf/layout/style.rb +18 -3
- data/lib/hexapdf/layout/table_box.rb +682 -0
- data/lib/hexapdf/layout/text_box.rb +5 -3
- data/lib/hexapdf/layout/text_fragment.rb +1 -1
- data/lib/hexapdf/layout/text_layouter.rb +12 -4
- data/lib/hexapdf/layout.rb +1 -0
- data/lib/hexapdf/name_tree_node.rb +1 -1
- data/lib/hexapdf/number_tree_node.rb +1 -1
- data/lib/hexapdf/object.rb +18 -7
- data/lib/hexapdf/parser.rb +8 -8
- data/lib/hexapdf/pdf_array.rb +1 -1
- data/lib/hexapdf/rectangle.rb +1 -1
- data/lib/hexapdf/reference.rb +1 -1
- data/lib/hexapdf/revision.rb +1 -1
- data/lib/hexapdf/revisions.rb +3 -3
- data/lib/hexapdf/serializer.rb +15 -15
- data/lib/hexapdf/stream.rb +4 -2
- data/lib/hexapdf/tokenizer.rb +14 -14
- data/lib/hexapdf/type/acro_form/appearance_generator.rb +22 -22
- data/lib/hexapdf/type/acro_form/button_field.rb +1 -1
- data/lib/hexapdf/type/acro_form/choice_field.rb +1 -1
- data/lib/hexapdf/type/acro_form/field.rb +2 -2
- data/lib/hexapdf/type/acro_form/form.rb +1 -1
- data/lib/hexapdf/type/acro_form/signature_field.rb +4 -4
- data/lib/hexapdf/type/acro_form/text_field.rb +1 -1
- data/lib/hexapdf/type/acro_form/variable_text_field.rb +1 -1
- data/lib/hexapdf/type/acro_form.rb +1 -1
- data/lib/hexapdf/type/action.rb +1 -1
- data/lib/hexapdf/type/actions/go_to.rb +1 -1
- data/lib/hexapdf/type/actions/go_to_r.rb +1 -1
- data/lib/hexapdf/type/actions/launch.rb +1 -1
- data/lib/hexapdf/type/actions/uri.rb +1 -1
- data/lib/hexapdf/type/actions.rb +1 -1
- data/lib/hexapdf/type/annotation.rb +3 -3
- data/lib/hexapdf/type/annotations/link.rb +1 -1
- data/lib/hexapdf/type/annotations/markup_annotation.rb +1 -1
- data/lib/hexapdf/type/annotations/text.rb +1 -1
- data/lib/hexapdf/type/annotations/widget.rb +2 -2
- data/lib/hexapdf/type/annotations.rb +1 -1
- data/lib/hexapdf/type/catalog.rb +1 -1
- data/lib/hexapdf/type/cid_font.rb +3 -3
- data/lib/hexapdf/type/embedded_file.rb +1 -1
- data/lib/hexapdf/type/file_specification.rb +2 -2
- data/lib/hexapdf/type/font_descriptor.rb +1 -1
- data/lib/hexapdf/type/font_simple.rb +2 -2
- data/lib/hexapdf/type/font_type0.rb +3 -3
- data/lib/hexapdf/type/font_type3.rb +1 -1
- data/lib/hexapdf/type/form.rb +1 -1
- data/lib/hexapdf/type/graphics_state_parameter.rb +1 -1
- data/lib/hexapdf/type/icon_fit.rb +1 -1
- data/lib/hexapdf/type/image.rb +1 -1
- data/lib/hexapdf/type/info.rb +1 -1
- data/lib/hexapdf/type/mark_information.rb +1 -1
- data/lib/hexapdf/type/names.rb +2 -2
- data/lib/hexapdf/type/object_stream.rb +7 -3
- data/lib/hexapdf/type/outline.rb +1 -1
- data/lib/hexapdf/type/outline_item.rb +1 -1
- data/lib/hexapdf/type/page.rb +19 -10
- data/lib/hexapdf/type/page_label.rb +1 -1
- data/lib/hexapdf/type/page_tree_node.rb +1 -1
- data/lib/hexapdf/type/resources.rb +1 -1
- data/lib/hexapdf/type/trailer.rb +2 -2
- data/lib/hexapdf/type/viewer_preferences.rb +1 -1
- data/lib/hexapdf/type/xref_stream.rb +2 -2
- data/lib/hexapdf/utils/pdf_doc_encoding.rb +1 -1
- data/lib/hexapdf/version.rb +1 -1
- data/lib/hexapdf/writer.rb +4 -4
- data/lib/hexapdf/xref_section.rb +2 -2
- data/test/hexapdf/content/graphic_object/test_endpoint_arc.rb +11 -1
- data/test/hexapdf/content/graphic_object/test_geom2d.rb +7 -0
- data/test/hexapdf/content/test_canvas.rb +0 -1
- data/test/hexapdf/digital_signature/test_signatures.rb +22 -0
- data/test/hexapdf/document/test_files.rb +2 -2
- data/test/hexapdf/document/test_layout.rb +98 -0
- data/test/hexapdf/encryption/test_security_handler.rb +12 -11
- data/test/hexapdf/encryption/test_standard_security_handler.rb +35 -23
- data/test/hexapdf/font/test_true_type_wrapper.rb +18 -1
- data/test/hexapdf/font/test_type1_wrapper.rb +15 -1
- data/test/hexapdf/layout/test_box.rb +1 -1
- data/test/hexapdf/layout/test_column_box.rb +65 -21
- data/test/hexapdf/layout/test_frame.rb +14 -14
- data/test/hexapdf/layout/test_image_box.rb +4 -0
- data/test/hexapdf/layout/test_inline_box.rb +5 -0
- data/test/hexapdf/layout/test_list_box.rb +40 -6
- data/test/hexapdf/layout/test_page_style.rb +3 -2
- data/test/hexapdf/layout/test_style.rb +50 -0
- data/test/hexapdf/layout/test_table_box.rb +722 -0
- data/test/hexapdf/layout/test_text_box.rb +18 -0
- data/test/hexapdf/layout/test_text_layouter.rb +4 -0
- data/test/hexapdf/test_dictionary_fields.rb +4 -1
- data/test/hexapdf/test_document.rb +1 -0
- data/test/hexapdf/test_filter.rb +8 -0
- data/test/hexapdf/test_importer.rb +9 -0
- data/test/hexapdf/test_object.rb +16 -5
- data/test/hexapdf/test_parser.rb +1 -1
- data/test/hexapdf/test_stream.rb +7 -0
- data/test/hexapdf/test_writer.rb +3 -3
- data/test/hexapdf/type/acro_form/test_appearance_generator.rb +13 -5
- data/test/hexapdf/type/acro_form/test_form.rb +4 -3
- data/test/hexapdf/type/test_object_stream.rb +9 -3
- data/test/hexapdf/type/test_page.rb +18 -4
- metadata +17 -8
@@ -22,7 +22,7 @@ describe HexaPDF::Layout::ColumnBox do
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def check_box(box, width, height, fit_pos = nil)
|
25
|
-
assert(box.fit(@frame.available_width, @frame.available_height, @frame), "box fit
|
25
|
+
assert(box.fit(@frame.available_width, @frame.available_height, @frame), "box didn't fit")
|
26
26
|
assert_equal(width, box.width, "box width")
|
27
27
|
assert_equal(height, box.height, "box height")
|
28
28
|
if fit_pos
|
@@ -46,6 +46,24 @@ describe HexaPDF::Layout::ColumnBox do
|
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
+
describe "empty?" do
|
50
|
+
it "is empty if nothing is fit yet" do
|
51
|
+
assert(create_box.empty?)
|
52
|
+
end
|
53
|
+
|
54
|
+
it "is empty if no box fits" do
|
55
|
+
box = create_box(children: [@fixed_size_boxes[0]], columns: [10])
|
56
|
+
box.fit(@frame.available_width, @frame.available_height, @frame)
|
57
|
+
assert(box.empty?)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "is not empty if at least one box fits" do
|
61
|
+
box = create_box(children: [@fixed_size_boxes[0]], columns: [30])
|
62
|
+
check_box(box, 30, 10)
|
63
|
+
refute(box.empty?)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
49
67
|
describe "fit" do
|
50
68
|
[:default, :flow].each do |position|
|
51
69
|
it "respects the set initial width, position #{position}" do
|
@@ -132,27 +150,53 @@ describe HexaPDF::Layout::ColumnBox do
|
|
132
150
|
assert_equal(5, box_b.children.size)
|
133
151
|
end
|
134
152
|
|
135
|
-
|
136
|
-
|
137
|
-
|
153
|
+
describe "draw_content" do
|
154
|
+
before do
|
155
|
+
@canvas = HexaPDF::Document.new.pages.add.canvas
|
156
|
+
end
|
157
|
+
|
158
|
+
it "draws the result onto the canvas" do
|
159
|
+
box = create_box(children: @fixed_size_boxes)
|
160
|
+
box.fit(100, 100, @frame)
|
161
|
+
box.draw(@canvas, 0, 100 - box.height)
|
162
|
+
operators = 90.step(to: 20, by: -10).map do |y|
|
163
|
+
[[:save_graphics_state],
|
164
|
+
[:concatenate_matrix, [1, 0, 0, 1, 0, y]],
|
165
|
+
[:move_to, [0, 0]],
|
166
|
+
[:end_path],
|
167
|
+
[:restore_graphics_state]]
|
168
|
+
end
|
169
|
+
operators.concat(90.step(to: 30, by: -10).map do |y|
|
170
|
+
[[:save_graphics_state],
|
171
|
+
[:concatenate_matrix, [1, 0, 0, 1, 55, y]],
|
172
|
+
[:move_to, [0, 0]],
|
173
|
+
[:end_path],
|
174
|
+
[:restore_graphics_state]]
|
175
|
+
end)
|
176
|
+
operators.flatten!(1)
|
177
|
+
assert_operators(@canvas.contents, operators)
|
178
|
+
end
|
138
179
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
180
|
+
it "takes a different final location into account" do
|
181
|
+
box = create_box(children: @fixed_size_boxes[0, 2])
|
182
|
+
box.fit(100, 100, @frame)
|
183
|
+
box.draw(@canvas, 20, 10)
|
184
|
+
operators = [
|
185
|
+
[:save_graphics_state],
|
186
|
+
[:concatenate_matrix, [1, 0, 0, 1, 20, -80]],
|
187
|
+
[:save_graphics_state],
|
188
|
+
[:concatenate_matrix, [1, 0, 0, 1, 0, 90]],
|
189
|
+
[:move_to, [0, 0]],
|
190
|
+
[:end_path],
|
191
|
+
[:restore_graphics_state],
|
192
|
+
[:save_graphics_state],
|
193
|
+
[:concatenate_matrix, [1, 0, 0, 1, 55, 90]],
|
194
|
+
[:move_to, [0, 0]],
|
195
|
+
[:end_path],
|
196
|
+
[:restore_graphics_state],
|
197
|
+
[:restore_graphics_state],
|
198
|
+
]
|
199
|
+
assert_operators(@canvas.contents, operators)
|
147
200
|
end
|
148
|
-
operators.concat(90.step(to: 30, by: -10).map do |y|
|
149
|
-
[[:save_graphics_state],
|
150
|
-
[:concatenate_matrix, [1, 0, 0, 1, 55, y]],
|
151
|
-
[:move_to, [0, 0]],
|
152
|
-
[:end_path],
|
153
|
-
[:restore_graphics_state]]
|
154
|
-
end)
|
155
|
-
operators.flatten!(1)
|
156
|
-
assert_operators(@canvas.contents, operators)
|
157
201
|
end
|
158
202
|
end
|
@@ -11,7 +11,7 @@ describe HexaPDF::Layout::Frame do
|
|
11
11
|
canvas = doc.pages.add.canvas
|
12
12
|
box = HexaPDF::Layout::Box.create(width: 20, height: 20) {}
|
13
13
|
result = HexaPDF::Layout::Frame::FitResult.new(box)
|
14
|
-
result.mask = Geom2D::
|
14
|
+
result.mask = Geom2D::Rectangle(0, 0, 20, 20)
|
15
15
|
result.x = result.y = 0
|
16
16
|
result.draw(canvas)
|
17
17
|
assert_equal(<<~CONTENTS, canvas.contents)
|
@@ -19,11 +19,7 @@ describe HexaPDF::Layout::Frame do
|
|
19
19
|
0.0 0.501961 0.0 rg
|
20
20
|
0.0 0.392157 0.0 RG
|
21
21
|
/GS1 gs
|
22
|
-
0 0
|
23
|
-
0 20 l
|
24
|
-
20 20 l
|
25
|
-
20 0 l
|
26
|
-
h
|
22
|
+
0 0 20 20 re
|
27
23
|
B
|
28
24
|
Q
|
29
25
|
q
|
@@ -90,7 +86,11 @@ describe HexaPDF::Layout::Frame do
|
|
90
86
|
refute_nil(fit_result)
|
91
87
|
@frame.draw(@canvas, fit_result)
|
92
88
|
assert_equal(mask, fit_result.mask.bbox.to_a)
|
93
|
-
|
89
|
+
if @frame.shape.respond_to?(:polygons)
|
90
|
+
assert_equal(points, @frame.shape.polygons.map(&:to_a))
|
91
|
+
else
|
92
|
+
assert_equal(points, [@frame.shape.to_a])
|
93
|
+
end
|
94
94
|
@canvas.verify
|
95
95
|
end
|
96
96
|
|
@@ -99,9 +99,9 @@ describe HexaPDF::Layout::Frame do
|
|
99
99
|
areas.each do |area|
|
100
100
|
@frame.remove_area(
|
101
101
|
case area
|
102
|
-
when :left then Geom2D::
|
103
|
-
when :right then Geom2D::
|
104
|
-
when :top then Geom2D::
|
102
|
+
when :left then Geom2D::Rectangle(10, 10, 10, 100)
|
103
|
+
when :right then Geom2D::Rectangle(100, 10, 10, 100)
|
104
|
+
when :top then Geom2D::Rectangle(10, 100, 100, 10)
|
105
105
|
end
|
106
106
|
)
|
107
107
|
end
|
@@ -323,7 +323,7 @@ describe HexaPDF::Layout::Frame do
|
|
323
323
|
end
|
324
324
|
|
325
325
|
it "can't fit the box if there is no available space" do
|
326
|
-
@frame.remove_area(Geom2D::
|
326
|
+
@frame.remove_area(Geom2D::Rectangle(0, 0, 110, 110))
|
327
327
|
box = HexaPDF::Layout::Box.create
|
328
328
|
refute(@frame.fit(box).success?)
|
329
329
|
end
|
@@ -388,7 +388,7 @@ describe HexaPDF::Layout::Frame do
|
|
388
388
|
# +--------+
|
389
389
|
it "works for a region with a hole" do
|
390
390
|
frame = HexaPDF::Layout::Frame.new(0, 0, 100, 100)
|
391
|
-
frame.remove_area(Geom2D::
|
391
|
+
frame.remove_area(Geom2D::Rectangle(20, 20, 60, 60))
|
392
392
|
check_regions(frame, [[0, 100, 100, 20], [0, 100, 20, 100],
|
393
393
|
[0, 80, 20, 80], [0, 20, 100, 20]])
|
394
394
|
end
|
@@ -400,7 +400,7 @@ describe HexaPDF::Layout::Frame do
|
|
400
400
|
# +--------+
|
401
401
|
it "works for a u-shaped frame" do
|
402
402
|
frame = HexaPDF::Layout::Frame.new(0, 0, 100, 100)
|
403
|
-
frame.remove_area(Geom2D::
|
403
|
+
frame.remove_area(Geom2D::Rectangle(30, 60, 40, 40))
|
404
404
|
check_regions(frame, [[0, 100, 30, 100], [0, 60, 100, 60]])
|
405
405
|
end
|
406
406
|
|
@@ -415,7 +415,7 @@ describe HexaPDF::Layout::Frame do
|
|
415
415
|
it "works for a complicated frame" do
|
416
416
|
frame = HexaPDF::Layout::Frame.new(0, 0, 100, 100)
|
417
417
|
top_cut = Geom2D::Polygon([20, 100], [20, 80], [40, 80], [40, 90], [60, 90], [60, 100])
|
418
|
-
left_cut = Geom2D::
|
418
|
+
left_cut = Geom2D::Rectangle(0, 20, 30, 20)
|
419
419
|
frame.remove_area(Geom2D::PolygonSet(top_cut, left_cut))
|
420
420
|
|
421
421
|
check_regions(frame, [[0, 100, 20, 60], [0, 90, 20, 50], [0, 80, 100, 40],
|
@@ -30,6 +30,11 @@ describe HexaPDF::Layout::InlineBox do
|
|
30
30
|
assert_equal(45, ibox.height)
|
31
31
|
end
|
32
32
|
|
33
|
+
it "fails if the wrapped box has not width set" do
|
34
|
+
box = HexaPDF::Document.new.layout.text("test is not going good")
|
35
|
+
assert_raises(HexaPDF::Error) { inline_box(box) }
|
36
|
+
end
|
37
|
+
|
33
38
|
it "fails if the wrapped box could not be fit" do
|
34
39
|
box = HexaPDF::Document.new.layout.text("test is not going good", width: 1)
|
35
40
|
assert_raises(HexaPDF::Error) { inline_box(box) }
|
@@ -18,7 +18,7 @@ describe HexaPDF::Layout::ListBox do
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def check_box(box, width, height, fit_pos = nil)
|
21
|
-
assert(box.fit(@frame.available_width, @frame.available_height, @frame), "box fit
|
21
|
+
assert(box.fit(@frame.available_width, @frame.available_height, @frame), "box didn't fit")
|
22
22
|
assert_equal(width, box.width, "box width")
|
23
23
|
assert_equal(height, box.height, "box height")
|
24
24
|
if fit_pos
|
@@ -47,6 +47,18 @@ describe HexaPDF::Layout::ListBox do
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
+
describe "empty?" do
|
51
|
+
it "is empty if nothing was fit yet" do
|
52
|
+
assert(create_box.empty?)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "is empty if nothing could be fit" do
|
56
|
+
box = create_box(children: [@text_boxes[0]], width: 5)
|
57
|
+
box.fit(@frame.available_width, @frame.available_height, @frame)
|
58
|
+
assert(create_box.empty?)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
50
62
|
describe "fit" do
|
51
63
|
[:default, :flow].each do |position|
|
52
64
|
it "respects the set initial width, position #{position}" do
|
@@ -123,7 +135,7 @@ describe HexaPDF::Layout::ListBox do
|
|
123
135
|
it "draws the result" do
|
124
136
|
box = create_box(children: @fixed_size_boxes[0, 2])
|
125
137
|
box.fit(100, 100, @frame)
|
126
|
-
box.draw(@canvas, 0,
|
138
|
+
box.draw(@canvas, 0, 100 - box.height)
|
127
139
|
operators = [
|
128
140
|
[:save_graphics_state],
|
129
141
|
[:set_font_and_size, [:F1, 10]],
|
@@ -153,7 +165,7 @@ describe HexaPDF::Layout::ListBox do
|
|
153
165
|
it "draws a cicle as marker" do
|
154
166
|
box = create_box(children: @fixed_size_boxes[0, 1], item_type: :circle)
|
155
167
|
box.fit(100, 100, @frame)
|
156
|
-
box.draw(@canvas, 0,
|
168
|
+
box.draw(@canvas, 0, 100 - box.height)
|
157
169
|
operators = [
|
158
170
|
[:save_graphics_state],
|
159
171
|
[:set_font_and_size, [:F1, 5]],
|
@@ -173,7 +185,7 @@ describe HexaPDF::Layout::ListBox do
|
|
173
185
|
it "draws a square as marker" do
|
174
186
|
box = create_box(children: @fixed_size_boxes[0, 1], item_type: :square)
|
175
187
|
box.fit(100, 100, @frame)
|
176
|
-
box.draw(@canvas, 0,
|
188
|
+
box.draw(@canvas, 0, 100 - box.height)
|
177
189
|
operators = [
|
178
190
|
[:save_graphics_state],
|
179
191
|
[:set_font_and_size, [:F1, 5]],
|
@@ -194,7 +206,7 @@ describe HexaPDF::Layout::ListBox do
|
|
194
206
|
box = create_box(children: @fixed_size_boxes[0, 2], item_type: :decimal,
|
195
207
|
content_indentation: 20)
|
196
208
|
box.fit(100, 100, @frame)
|
197
|
-
box.draw(@canvas, 0,
|
209
|
+
box.draw(@canvas, 0, 100 - box.height)
|
198
210
|
operators = [
|
199
211
|
[:save_graphics_state],
|
200
212
|
[:set_font_and_size, [:F1, 10]],
|
@@ -227,7 +239,7 @@ describe HexaPDF::Layout::ListBox do
|
|
227
239
|
end
|
228
240
|
box = create_box(children: @fixed_size_boxes[0, 1], item_type: marker)
|
229
241
|
box.fit(100, 100, @frame)
|
230
|
-
box.draw(@canvas, 0,
|
242
|
+
box.draw(@canvas, 0, 100 - box.height)
|
231
243
|
operators = [
|
232
244
|
[:save_graphics_state],
|
233
245
|
[:concatenate_matrix, [1, 0, 0, 1, 0, 90]],
|
@@ -239,6 +251,28 @@ describe HexaPDF::Layout::ListBox do
|
|
239
251
|
assert_operators(@canvas.contents, operators)
|
240
252
|
end
|
241
253
|
|
254
|
+
it "takes a different final location into account" do
|
255
|
+
box = create_box(children: @fixed_size_boxes[0, 1])
|
256
|
+
box.fit(100, 100, @frame)
|
257
|
+
box.draw(@canvas, 20, 10)
|
258
|
+
operators = [
|
259
|
+
[:save_graphics_state],
|
260
|
+
[:concatenate_matrix, [1, 0, 0, 1, 20, -80]],
|
261
|
+
[:save_graphics_state],
|
262
|
+
[:set_font_and_size, [:F1, 10]],
|
263
|
+
[:begin_text],
|
264
|
+
[:set_text_matrix, [1, 0, 0, 1, 1.5, 93.17]],
|
265
|
+
[:show_text, ["\x95".b]],
|
266
|
+
[:end_text],
|
267
|
+
[:restore_graphics_state],
|
268
|
+
[:save_graphics_state],
|
269
|
+
[:concatenate_matrix, [1, 0, 0, 1, 10, 90]],
|
270
|
+
[:restore_graphics_state],
|
271
|
+
[:restore_graphics_state],
|
272
|
+
]
|
273
|
+
assert_operators(@canvas.contents, operators)
|
274
|
+
end
|
275
|
+
|
242
276
|
it "fails for unknown item types" do
|
243
277
|
box = create_box(children: @fixed_size_boxes[0, 1], item_type: :unknown)
|
244
278
|
box.fit(100, 100, @frame)
|
@@ -5,11 +5,12 @@ require 'hexapdf/layout/page_style'
|
|
5
5
|
require 'hexapdf/document'
|
6
6
|
|
7
7
|
describe HexaPDF::Layout::PageStyle do
|
8
|
-
it "allows assigning the page size, orientation and template on initialization" do
|
8
|
+
it "allows assigning the page size, orientation, next style and template on initialization" do
|
9
9
|
block = lambda {}
|
10
|
-
style = HexaPDF::Layout::PageStyle.new(page_size: :A3, orientation: :landscape, &block)
|
10
|
+
style = HexaPDF::Layout::PageStyle.new(page_size: :A3, orientation: :landscape, next_style: :a, &block)
|
11
11
|
assert_equal(:A3, style.page_size)
|
12
12
|
assert_equal(:landscape, style.orientation)
|
13
|
+
assert_equal(:a, style.next_style)
|
13
14
|
assert_same(block, style.template)
|
14
15
|
end
|
15
16
|
|
@@ -156,15 +156,24 @@ describe HexaPDF::Layout::Style::Border do
|
|
156
156
|
assert_kind_of(HexaPDF::Layout::Style::Quad, border.style)
|
157
157
|
end
|
158
158
|
|
159
|
+
it "has an accessor for the draw-on-bounds option" do
|
160
|
+
border = create_border
|
161
|
+
refute(border.draw_on_bounds)
|
162
|
+
border.draw_on_bounds = true
|
163
|
+
assert(border.draw_on_bounds)
|
164
|
+
end
|
165
|
+
|
159
166
|
it "can be duplicated" do
|
160
167
|
border = create_border
|
161
168
|
copy = border.dup
|
162
169
|
border.width.top = 10
|
163
170
|
border.color.top = :red
|
164
171
|
border.style.top = :dotted
|
172
|
+
border.draw_on_bounds = true
|
165
173
|
assert_equal(0, copy.width.top)
|
166
174
|
assert_equal(0, copy.color.top)
|
167
175
|
assert_equal(:solid, copy.style.top)
|
176
|
+
refute(copy.draw_on_bounds)
|
168
177
|
end
|
169
178
|
|
170
179
|
it "can be asked whether a border is defined" do
|
@@ -259,6 +268,19 @@ describe HexaPDF::Layout::Style::Border do
|
|
259
268
|
[:restore_graphics_state]]
|
260
269
|
assert_operators(@canvas.contents, ops)
|
261
270
|
end
|
271
|
+
|
272
|
+
it "works if the border is drawn on the bounds" do
|
273
|
+
border = create_border(width: 10, color: 0.5, style: :solid, draw_on_bounds: true)
|
274
|
+
border.draw(@canvas, 0, 0, 100, 100)
|
275
|
+
assert_operators(@canvas.contents, [[:save_graphics_state],
|
276
|
+
[:set_device_gray_stroking_color, [0.5]],
|
277
|
+
[:set_line_width, [10]],
|
278
|
+
[:append_rectangle, [-5, -5, 110, 110]],
|
279
|
+
[:clip_path_non_zero], [:end_path],
|
280
|
+
[:append_rectangle, [0, 0, 100, 100]],
|
281
|
+
[:stroke_path],
|
282
|
+
[:restore_graphics_state]])
|
283
|
+
end
|
262
284
|
end
|
263
285
|
|
264
286
|
describe "complex borders where edges have different width/color/style values" do
|
@@ -369,6 +391,34 @@ describe HexaPDF::Layout::Style::Border do
|
|
369
391
|
[:restore_graphics_state], [:restore_graphics_state]]
|
370
392
|
assert_operators(@canvas.contents, ops)
|
371
393
|
end
|
394
|
+
|
395
|
+
it "works if the border is drawn on the bounds" do
|
396
|
+
border = create_border(width: [20, 10, 40, 30], draw_on_bounds: true)
|
397
|
+
border.draw(@canvas, 0, 0, 100, 200)
|
398
|
+
ops = [[:save_graphics_state],
|
399
|
+
[:save_graphics_state],
|
400
|
+
[:move_to, [-15, 210]], [:line_to, [105, 210]],
|
401
|
+
[:line_to, [95, 190]], [:line_to, [15, 190]], [:clip_path_non_zero], [:end_path],
|
402
|
+
[:set_line_width, [20]],
|
403
|
+
[:move_to, [-15, 200]], [:line_to, [105, 200]], [:stroke_path],
|
404
|
+
[:restore_graphics_state], [:save_graphics_state],
|
405
|
+
[:move_to, [105, 210]], [:line_to, [105, -20]],
|
406
|
+
[:line_to, [95, 20]], [:line_to, [95, 190]], [:clip_path_non_zero], [:end_path],
|
407
|
+
[:set_line_width, [10]],
|
408
|
+
[:move_to, [100, 210]], [:line_to, [100, -20]], [:stroke_path],
|
409
|
+
[:restore_graphics_state], [:save_graphics_state],
|
410
|
+
[:move_to, [105, -20]], [:line_to, [-15, -20]],
|
411
|
+
[:line_to, [15, 20]], [:line_to, [95, 20]], [:clip_path_non_zero], [:end_path],
|
412
|
+
[:set_line_width, [40]],
|
413
|
+
[:move_to, [105, 0]], [:line_to, [-15, 0]], [:stroke_path],
|
414
|
+
[:restore_graphics_state], [:save_graphics_state],
|
415
|
+
[:move_to, [-15, -20]], [:line_to, [-15, 210]],
|
416
|
+
[:line_to, [15, 190]], [:line_to, [15, 20]], [:clip_path_non_zero], [:end_path],
|
417
|
+
[:set_line_width, [30]],
|
418
|
+
[:move_to, [0, -20]], [:line_to, [0, 210]], [:stroke_path],
|
419
|
+
[:restore_graphics_state], [:restore_graphics_state]]
|
420
|
+
assert_operators(@canvas.contents, ops)
|
421
|
+
end
|
372
422
|
end
|
373
423
|
|
374
424
|
describe "border width greater than edge length" do
|