hexapdf 0.31.0 → 0.32.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 +4 -4
- data/CHANGELOG.md +26 -0
- data/LICENSE +1 -1
- data/examples/020-column_box.rb +10 -11
- data/examples/021-list_box.rb +5 -5
- data/lib/hexapdf/cli/batch.rb +1 -1
- data/lib/hexapdf/cli/command.rb +1 -1
- data/lib/hexapdf/cli/files.rb +1 -1
- data/lib/hexapdf/cli/fonts.rb +1 -1
- data/lib/hexapdf/cli/form.rb +1 -1
- data/lib/hexapdf/cli/image2pdf.rb +1 -1
- data/lib/hexapdf/cli/images.rb +1 -1
- data/lib/hexapdf/cli/info.rb +1 -1
- data/lib/hexapdf/cli/inspect.rb +1 -1
- data/lib/hexapdf/cli/merge.rb +1 -1
- data/lib/hexapdf/cli/modify.rb +1 -1
- data/lib/hexapdf/cli/optimize.rb +1 -1
- data/lib/hexapdf/cli/split.rb +1 -1
- data/lib/hexapdf/cli/watermark.rb +1 -1
- data/lib/hexapdf/cli.rb +1 -1
- data/lib/hexapdf/composer.rb +21 -1
- data/lib/hexapdf/configuration.rb +1 -1
- data/lib/hexapdf/content/canvas.rb +1 -1
- data/lib/hexapdf/content/color_space.rb +1 -1
- data/lib/hexapdf/content/graphic_object/arc.rb +1 -1
- data/lib/hexapdf/content/graphic_object/endpoint_arc.rb +1 -1
- data/lib/hexapdf/content/graphic_object/geom2d.rb +1 -1
- data/lib/hexapdf/content/graphic_object/solid_arc.rb +1 -1
- data/lib/hexapdf/content/graphic_object.rb +1 -1
- data/lib/hexapdf/content/graphics_state.rb +1 -1
- data/lib/hexapdf/content/operator.rb +1 -1
- data/lib/hexapdf/content/parser.rb +1 -1
- data/lib/hexapdf/content/processor.rb +1 -1
- data/lib/hexapdf/content/transformation_matrix.rb +1 -1
- data/lib/hexapdf/content.rb +1 -1
- data/lib/hexapdf/data_dir.rb +1 -1
- data/lib/hexapdf/dictionary.rb +1 -1
- data/lib/hexapdf/dictionary_fields.rb +1 -1
- data/lib/hexapdf/digital_signature/cms_handler.rb +1 -1
- data/lib/hexapdf/digital_signature/handler.rb +1 -1
- data/lib/hexapdf/digital_signature/pkcs1_handler.rb +1 -1
- data/lib/hexapdf/digital_signature/signature.rb +1 -1
- data/lib/hexapdf/digital_signature/signatures.rb +1 -1
- data/lib/hexapdf/digital_signature/signing/default_handler.rb +1 -1
- data/lib/hexapdf/digital_signature/signing/signed_data_creator.rb +1 -1
- data/lib/hexapdf/digital_signature/signing/timestamp_handler.rb +1 -1
- data/lib/hexapdf/digital_signature/signing.rb +1 -1
- data/lib/hexapdf/digital_signature/verification_result.rb +1 -1
- data/lib/hexapdf/digital_signature.rb +1 -1
- data/lib/hexapdf/document/destinations.rb +1 -1
- data/lib/hexapdf/document/files.rb +1 -1
- data/lib/hexapdf/document/fonts.rb +1 -1
- data/lib/hexapdf/document/images.rb +1 -1
- data/lib/hexapdf/document/layout.rb +122 -39
- data/lib/hexapdf/document/pages.rb +1 -1
- data/lib/hexapdf/document.rb +1 -1
- data/lib/hexapdf/encryption/aes.rb +3 -1
- data/lib/hexapdf/encryption/arc4.rb +1 -1
- data/lib/hexapdf/encryption/fast_aes.rb +1 -1
- 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 +4 -1
- data/lib/hexapdf/encryption/standard_security_handler.rb +1 -1
- data/lib/hexapdf/encryption.rb +1 -1
- data/lib/hexapdf/error.rb +12 -2
- data/lib/hexapdf/filter/ascii85_decode.rb +1 -1
- data/lib/hexapdf/filter/ascii_hex_decode.rb +1 -1
- data/lib/hexapdf/filter/crypt.rb +1 -1
- data/lib/hexapdf/filter/encryption.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 +1 -1
- data/lib/hexapdf/font/cmap/parser.rb +1 -1
- data/lib/hexapdf/font/cmap/writer.rb +1 -1
- data/lib/hexapdf/font/cmap.rb +1 -1
- data/lib/hexapdf/font/encoding/base.rb +1 -1
- data/lib/hexapdf/font/encoding/difference_encoding.rb +1 -1
- data/lib/hexapdf/font/encoding/glyph_list.rb +1 -1
- data/lib/hexapdf/font/encoding/mac_expert_encoding.rb +1 -1
- data/lib/hexapdf/font/encoding/mac_roman_encoding.rb +1 -1
- 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 +1 -1
- data/lib/hexapdf/font/encoding/zapf_dingbats_encoding.rb +1 -1
- data/lib/hexapdf/font/encoding.rb +1 -1
- data/lib/hexapdf/font/invalid_glyph.rb +1 -1
- data/lib/hexapdf/font/true_type/builder.rb +1 -1
- data/lib/hexapdf/font/true_type/font.rb +1 -1
- data/lib/hexapdf/font/true_type/optimizer.rb +1 -1
- data/lib/hexapdf/font/true_type/subsetter.rb +1 -1
- data/lib/hexapdf/font/true_type/table/cmap.rb +1 -1
- data/lib/hexapdf/font/true_type/table/cmap_subtable.rb +1 -1
- data/lib/hexapdf/font/true_type/table/directory.rb +1 -1
- data/lib/hexapdf/font/true_type/table/glyf.rb +1 -1
- data/lib/hexapdf/font/true_type/table/head.rb +1 -1
- data/lib/hexapdf/font/true_type/table/hhea.rb +1 -1
- data/lib/hexapdf/font/true_type/table/hmtx.rb +1 -1
- data/lib/hexapdf/font/true_type/table/kern.rb +1 -1
- data/lib/hexapdf/font/true_type/table/loca.rb +1 -1
- data/lib/hexapdf/font/true_type/table/maxp.rb +1 -1
- data/lib/hexapdf/font/true_type/table/name.rb +1 -1
- data/lib/hexapdf/font/true_type/table/os2.rb +1 -1
- data/lib/hexapdf/font/true_type/table/post.rb +1 -1
- data/lib/hexapdf/font/true_type/table.rb +1 -1
- data/lib/hexapdf/font/true_type.rb +1 -1
- data/lib/hexapdf/font/true_type_wrapper.rb +1 -1
- data/lib/hexapdf/font/type1/afm_parser.rb +1 -1
- data/lib/hexapdf/font/type1/character_metrics.rb +1 -1
- data/lib/hexapdf/font/type1/font.rb +1 -1
- data/lib/hexapdf/font/type1/font_metrics.rb +1 -1
- data/lib/hexapdf/font/type1/pfb_parser.rb +1 -1
- data/lib/hexapdf/font/type1.rb +1 -1
- data/lib/hexapdf/font/type1_wrapper.rb +1 -1
- data/lib/hexapdf/font_loader/from_configuration.rb +1 -1
- data/lib/hexapdf/font_loader/from_file.rb +1 -1
- data/lib/hexapdf/font_loader/standard14.rb +1 -1
- data/lib/hexapdf/font_loader.rb +1 -1
- data/lib/hexapdf/image_loader/jpeg.rb +1 -1
- data/lib/hexapdf/image_loader/pdf.rb +1 -1
- data/lib/hexapdf/image_loader/png.rb +1 -1
- data/lib/hexapdf/image_loader.rb +1 -1
- data/lib/hexapdf/importer.rb +1 -1
- data/lib/hexapdf/layout/box.rb +1 -1
- data/lib/hexapdf/layout/box_fitter.rb +1 -1
- data/lib/hexapdf/layout/column_box.rb +1 -1
- data/lib/hexapdf/layout/frame.rb +1 -1
- data/lib/hexapdf/layout/image_box.rb +1 -1
- data/lib/hexapdf/layout/inline_box.rb +17 -3
- data/lib/hexapdf/layout/line.rb +1 -1
- data/lib/hexapdf/layout/list_box.rb +1 -1
- data/lib/hexapdf/layout/numeric_refinements.rb +1 -1
- data/lib/hexapdf/layout/style.rb +1 -1
- data/lib/hexapdf/layout/text_box.rb +1 -1
- data/lib/hexapdf/layout/text_fragment.rb +1 -1
- data/lib/hexapdf/layout/text_layouter.rb +4 -7
- data/lib/hexapdf/layout/text_shaper.rb +1 -1
- data/lib/hexapdf/layout/width_from_polygon.rb +1 -1
- data/lib/hexapdf/layout.rb +1 -1
- data/lib/hexapdf/name_tree_node.rb +1 -1
- data/lib/hexapdf/number_tree_node.rb +1 -1
- data/lib/hexapdf/object.rb +1 -1
- data/lib/hexapdf/parser.rb +1 -1
- 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 +1 -1
- data/lib/hexapdf/serializer.rb +1 -1
- data/lib/hexapdf/stream.rb +1 -1
- data/lib/hexapdf/task/dereference.rb +1 -1
- data/lib/hexapdf/task/optimize.rb +1 -1
- data/lib/hexapdf/task.rb +1 -1
- data/lib/hexapdf/test_utils.rb +1 -1
- data/lib/hexapdf/tokenizer.rb +2 -1
- data/lib/hexapdf/type/acro_form/appearance_generator.rb +1 -1
- 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 +1 -1
- data/lib/hexapdf/type/acro_form/form.rb +1 -1
- data/lib/hexapdf/type/acro_form/signature_field.rb +1 -1
- 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 +1 -1
- 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 +1 -1
- data/lib/hexapdf/type/annotations.rb +1 -1
- data/lib/hexapdf/type/catalog.rb +1 -1
- data/lib/hexapdf/type/cid_font.rb +1 -1
- data/lib/hexapdf/type/embedded_file.rb +1 -1
- data/lib/hexapdf/type/file_specification.rb +1 -1
- data/lib/hexapdf/type/font.rb +1 -1
- data/lib/hexapdf/type/font_descriptor.rb +1 -1
- data/lib/hexapdf/type/font_simple.rb +1 -1
- data/lib/hexapdf/type/font_true_type.rb +1 -1
- data/lib/hexapdf/type/font_type0.rb +1 -1
- data/lib/hexapdf/type/font_type1.rb +1 -1
- 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 +1 -1
- data/lib/hexapdf/type/object_stream.rb +1 -1
- data/lib/hexapdf/type/outline.rb +1 -1
- data/lib/hexapdf/type/outline_item.rb +10 -1
- data/lib/hexapdf/type/page.rb +7 -1
- 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 +1 -1
- data/lib/hexapdf/type/viewer_preferences.rb +1 -1
- data/lib/hexapdf/type/xref_stream.rb +1 -1
- data/lib/hexapdf/type.rb +1 -1
- data/lib/hexapdf/utils/bit_field.rb +1 -1
- data/lib/hexapdf/utils/bit_stream.rb +1 -1
- data/lib/hexapdf/utils/graphics_helpers.rb +1 -1
- data/lib/hexapdf/utils/lru_cache.rb +1 -1
- data/lib/hexapdf/utils/math_helpers.rb +1 -1
- data/lib/hexapdf/utils/object_hash.rb +1 -1
- data/lib/hexapdf/utils/pdf_doc_encoding.rb +1 -1
- data/lib/hexapdf/utils/sorted_tree_node.rb +1 -1
- data/lib/hexapdf/version.rb +2 -2
- data/lib/hexapdf/writer.rb +1 -1
- data/lib/hexapdf/xref_section.rb +1 -1
- data/lib/hexapdf.rb +1 -1
- data/test/hexapdf/document/test_layout.rb +80 -17
- data/test/hexapdf/encryption/common.rb +4 -0
- data/test/hexapdf/encryption/test_aes.rb +8 -0
- data/test/hexapdf/encryption/test_security_handler.rb +6 -0
- data/test/hexapdf/layout/test_inline_box.rb +35 -15
- data/test/hexapdf/layout/test_text_box.rb +5 -2
- data/test/hexapdf/layout/test_text_layouter.rb +6 -11
- data/test/hexapdf/test_composer.rb +14 -1
- data/test/hexapdf/test_tokenizer.rb +5 -0
- data/test/hexapdf/test_writer.rb +3 -3
- data/test/hexapdf/type/test_outline_item.rb +18 -0
- data/test/hexapdf/type/test_page.rb +16 -0
- metadata +2 -2
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# This file is part of HexaPDF.
|
|
5
5
|
#
|
|
6
6
|
# HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|
|
7
|
-
# Copyright (C) 2014-
|
|
7
|
+
# Copyright (C) 2014-2023 Thomas Leitner
|
|
8
8
|
#
|
|
9
9
|
# HexaPDF is free software: you can redistribute it and/or modify it
|
|
10
10
|
# under the terms of the GNU Affero General Public License version 3 as
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# This file is part of HexaPDF.
|
|
5
5
|
#
|
|
6
6
|
# HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|
|
7
|
-
# Copyright (C) 2014-
|
|
7
|
+
# Copyright (C) 2014-2023 Thomas Leitner
|
|
8
8
|
#
|
|
9
9
|
# HexaPDF is free software: you can redistribute it and/or modify it
|
|
10
10
|
# under the terms of the GNU Affero General Public License version 3 as
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# This file is part of HexaPDF.
|
|
5
5
|
#
|
|
6
6
|
# HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|
|
7
|
-
# Copyright (C) 2014-
|
|
7
|
+
# Copyright (C) 2014-2023 Thomas Leitner
|
|
8
8
|
#
|
|
9
9
|
# HexaPDF is free software: you can redistribute it and/or modify it
|
|
10
10
|
# under the terms of the GNU Affero General Public License version 3 as
|
data/lib/hexapdf/type/trailer.rb
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# This file is part of HexaPDF.
|
|
5
5
|
#
|
|
6
6
|
# HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|
|
7
|
-
# Copyright (C) 2014-
|
|
7
|
+
# Copyright (C) 2014-2023 Thomas Leitner
|
|
8
8
|
#
|
|
9
9
|
# HexaPDF is free software: you can redistribute it and/or modify it
|
|
10
10
|
# under the terms of the GNU Affero General Public License version 3 as
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# This file is part of HexaPDF.
|
|
5
5
|
#
|
|
6
6
|
# HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|
|
7
|
-
# Copyright (C) 2014-
|
|
7
|
+
# Copyright (C) 2014-2023 Thomas Leitner
|
|
8
8
|
#
|
|
9
9
|
# HexaPDF is free software: you can redistribute it and/or modify it
|
|
10
10
|
# under the terms of the GNU Affero General Public License version 3 as
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# This file is part of HexaPDF.
|
|
5
5
|
#
|
|
6
6
|
# HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|
|
7
|
-
# Copyright (C) 2014-
|
|
7
|
+
# Copyright (C) 2014-2023 Thomas Leitner
|
|
8
8
|
#
|
|
9
9
|
# HexaPDF is free software: you can redistribute it and/or modify it
|
|
10
10
|
# under the terms of the GNU Affero General Public License version 3 as
|
data/lib/hexapdf/type.rb
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# This file is part of HexaPDF.
|
|
5
5
|
#
|
|
6
6
|
# HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|
|
7
|
-
# Copyright (C) 2014-
|
|
7
|
+
# Copyright (C) 2014-2023 Thomas Leitner
|
|
8
8
|
#
|
|
9
9
|
# HexaPDF is free software: you can redistribute it and/or modify it
|
|
10
10
|
# under the terms of the GNU Affero General Public License version 3 as
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# This file is part of HexaPDF.
|
|
5
5
|
#
|
|
6
6
|
# HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|
|
7
|
-
# Copyright (C) 2014-
|
|
7
|
+
# Copyright (C) 2014-2023 Thomas Leitner
|
|
8
8
|
#
|
|
9
9
|
# HexaPDF is free software: you can redistribute it and/or modify it
|
|
10
10
|
# under the terms of the GNU Affero General Public License version 3 as
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# This file is part of HexaPDF.
|
|
5
5
|
#
|
|
6
6
|
# HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|
|
7
|
-
# Copyright (C) 2014-
|
|
7
|
+
# Copyright (C) 2014-2023 Thomas Leitner
|
|
8
8
|
#
|
|
9
9
|
# HexaPDF is free software: you can redistribute it and/or modify it
|
|
10
10
|
# under the terms of the GNU Affero General Public License version 3 as
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# This file is part of HexaPDF.
|
|
5
5
|
#
|
|
6
6
|
# HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|
|
7
|
-
# Copyright (C) 2014-
|
|
7
|
+
# Copyright (C) 2014-2023 Thomas Leitner
|
|
8
8
|
#
|
|
9
9
|
# HexaPDF is free software: you can redistribute it and/or modify it
|
|
10
10
|
# under the terms of the GNU Affero General Public License version 3 as
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# This file is part of HexaPDF.
|
|
5
5
|
#
|
|
6
6
|
# HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|
|
7
|
-
# Copyright (C) 2014-
|
|
7
|
+
# Copyright (C) 2014-2023 Thomas Leitner
|
|
8
8
|
#
|
|
9
9
|
# HexaPDF is free software: you can redistribute it and/or modify it
|
|
10
10
|
# under the terms of the GNU Affero General Public License version 3 as
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# This file is part of HexaPDF.
|
|
5
5
|
#
|
|
6
6
|
# HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|
|
7
|
-
# Copyright (C) 2014-
|
|
7
|
+
# Copyright (C) 2014-2023 Thomas Leitner
|
|
8
8
|
#
|
|
9
9
|
# HexaPDF is free software: you can redistribute it and/or modify it
|
|
10
10
|
# under the terms of the GNU Affero General Public License version 3 as
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# This file is part of HexaPDF.
|
|
5
5
|
#
|
|
6
6
|
# HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|
|
7
|
-
# Copyright (C) 2014-
|
|
7
|
+
# Copyright (C) 2014-2023 Thomas Leitner
|
|
8
8
|
#
|
|
9
9
|
# HexaPDF is free software: you can redistribute it and/or modify it
|
|
10
10
|
# under the terms of the GNU Affero General Public License version 3 as
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# This file is part of HexaPDF.
|
|
5
5
|
#
|
|
6
6
|
# HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|
|
7
|
-
# Copyright (C) 2014-
|
|
7
|
+
# Copyright (C) 2014-2023 Thomas Leitner
|
|
8
8
|
#
|
|
9
9
|
# HexaPDF is free software: you can redistribute it and/or modify it
|
|
10
10
|
# under the terms of the GNU Affero General Public License version 3 as
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# This file is part of HexaPDF.
|
|
5
5
|
#
|
|
6
6
|
# HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|
|
7
|
-
# Copyright (C) 2014-
|
|
7
|
+
# Copyright (C) 2014-2023 Thomas Leitner
|
|
8
8
|
#
|
|
9
9
|
# HexaPDF is free software: you can redistribute it and/or modify it
|
|
10
10
|
# under the terms of the GNU Affero General Public License version 3 as
|
data/lib/hexapdf/version.rb
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# This file is part of HexaPDF.
|
|
5
5
|
#
|
|
6
6
|
# HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|
|
7
|
-
# Copyright (C) 2014-
|
|
7
|
+
# Copyright (C) 2014-2023 Thomas Leitner
|
|
8
8
|
#
|
|
9
9
|
# HexaPDF is free software: you can redistribute it and/or modify it
|
|
10
10
|
# under the terms of the GNU Affero General Public License version 3 as
|
|
@@ -37,6 +37,6 @@
|
|
|
37
37
|
module HexaPDF
|
|
38
38
|
|
|
39
39
|
# The version of HexaPDF.
|
|
40
|
-
VERSION = '0.
|
|
40
|
+
VERSION = '0.32.0'
|
|
41
41
|
|
|
42
42
|
end
|
data/lib/hexapdf/writer.rb
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# This file is part of HexaPDF.
|
|
5
5
|
#
|
|
6
6
|
# HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|
|
7
|
-
# Copyright (C) 2014-
|
|
7
|
+
# Copyright (C) 2014-2023 Thomas Leitner
|
|
8
8
|
#
|
|
9
9
|
# HexaPDF is free software: you can redistribute it and/or modify it
|
|
10
10
|
# under the terms of the GNU Affero General Public License version 3 as
|
data/lib/hexapdf/xref_section.rb
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# This file is part of HexaPDF.
|
|
5
5
|
#
|
|
6
6
|
# HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|
|
7
|
-
# Copyright (C) 2014-
|
|
7
|
+
# Copyright (C) 2014-2023 Thomas Leitner
|
|
8
8
|
#
|
|
9
9
|
# HexaPDF is free software: you can redistribute it and/or modify it
|
|
10
10
|
# under the terms of the GNU Affero General Public License version 3 as
|
data/lib/hexapdf.rb
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# This file is part of HexaPDF.
|
|
5
5
|
#
|
|
6
6
|
# HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|
|
7
|
-
# Copyright (C) 2014-
|
|
7
|
+
# Copyright (C) 2014-2023 Thomas Leitner
|
|
8
8
|
#
|
|
9
9
|
# HexaPDF is free software: you can redistribute it and/or modify it
|
|
10
10
|
# under the terms of the GNU Affero General Public License version 3 as
|
|
@@ -34,29 +34,24 @@ describe HexaPDF::Document::Layout::ChildrenCollector do
|
|
|
34
34
|
assert_equal(2, @collector.children[0].size)
|
|
35
35
|
end
|
|
36
36
|
|
|
37
|
-
it "allows appending boxes
|
|
38
|
-
@collector.lorem_ipsum_box
|
|
39
|
-
assert_equal(1, @collector.children.size)
|
|
40
|
-
assert_kind_of(HexaPDF::Layout::TextBox, @collector.children[0])
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
it "allows appending boxes through method names without the _box suffix of the Layout class" do
|
|
37
|
+
it "allows appending boxes created by the Layout class" do
|
|
44
38
|
@collector.lorem_ipsum
|
|
45
|
-
|
|
39
|
+
@collector.lorem_ipsum_box
|
|
40
|
+
@collector.column
|
|
41
|
+
@collector.column_box
|
|
42
|
+
assert_equal(4, @collector.children.size)
|
|
46
43
|
assert_kind_of(HexaPDF::Layout::TextBox, @collector.children[0])
|
|
44
|
+
assert_kind_of(HexaPDF::Layout::TextBox, @collector.children[1])
|
|
45
|
+
assert_kind_of(HexaPDF::Layout::ColumnBox, @collector.children[2])
|
|
46
|
+
assert_kind_of(HexaPDF::Layout::ColumnBox, @collector.children[3])
|
|
47
47
|
end
|
|
48
48
|
|
|
49
|
-
it "
|
|
50
|
-
@collector.
|
|
51
|
-
assert_equal(1, @collector.children.size)
|
|
52
|
-
assert_kind_of(HexaPDF::Layout::ColumnBox, @collector.children[0])
|
|
49
|
+
it "can be asked which methods it supports" do
|
|
50
|
+
assert(@collector.respond_to?(:lorem_ipsum))
|
|
53
51
|
end
|
|
54
52
|
|
|
55
|
-
it "
|
|
56
|
-
|
|
57
|
-
assert(@collector.respond_to?(:text))
|
|
58
|
-
assert(@collector.respond_to?(:column))
|
|
59
|
-
refute(@collector.respond_to?(:unknown))
|
|
53
|
+
it "only allows using box creation methods from the Layout class" do
|
|
54
|
+
assert_raises(NameError) { @collector.style }
|
|
60
55
|
end
|
|
61
56
|
|
|
62
57
|
it "raises an error on an unknown method name" do
|
|
@@ -88,6 +83,27 @@ describe HexaPDF::Document::Layout do
|
|
|
88
83
|
end
|
|
89
84
|
end
|
|
90
85
|
|
|
86
|
+
describe "inline_box" do
|
|
87
|
+
it "takes a box as argument" do
|
|
88
|
+
box = HexaPDF::Layout::Box.create(width: 10, height: 10)
|
|
89
|
+
ibox = @layout.inline_box(box)
|
|
90
|
+
assert_same(box, ibox.box)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it "correctly passes on the valign argument" do
|
|
94
|
+
box = HexaPDF::Layout::Box.create(width: 10, height: 10)
|
|
95
|
+
ibox = @layout.inline_box(box, valign: :top)
|
|
96
|
+
assert_equal(:top, ibox.valign)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
it "can create a box using any box creation method of the Layout class" do
|
|
100
|
+
ibox = @layout.inline_box(:text, "Some text", valign: :bottom, width: 10, background_color: "red")
|
|
101
|
+
assert_equal(:bottom, ibox.valign)
|
|
102
|
+
assert_equal(10, ibox.width)
|
|
103
|
+
assert_equal("red", ibox.box.style.background_color)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
91
107
|
describe "box" do
|
|
92
108
|
it "creates the request box" do
|
|
93
109
|
box = @layout.box(:column, columns: 3, gaps: 20, width: 15, height: 30, style: {font_size: 10},
|
|
@@ -232,6 +248,24 @@ describe HexaPDF::Document::Layout do
|
|
|
232
248
|
items = box.instance_variable_get(:@items)
|
|
233
249
|
assert_equal({named_dest: 'test'}, items[0].properties)
|
|
234
250
|
end
|
|
251
|
+
|
|
252
|
+
it "allows adding an inline box" do
|
|
253
|
+
ibox = @layout.inline_box(:base, width: 10, height: 10)
|
|
254
|
+
box = @layout.formatted_text_box([ibox])
|
|
255
|
+
assert_equal(ibox, box.instance_variable_get(:@items).first)
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
it "allows creating an inline box through a hash with a :box key" do
|
|
259
|
+
block = lambda {|item| item.box(:base, width: 5, height: 15) }
|
|
260
|
+
box = @layout.formatted_text_box([{box: :list, width: 10, block: block}])
|
|
261
|
+
ibox = box.instance_variable_get(:@items).first
|
|
262
|
+
assert_equal(10, ibox.width)
|
|
263
|
+
assert_equal(15, ibox.height)
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
it "fails if the data array contains unsupported items" do
|
|
267
|
+
assert_raises(ArgumentError) { @layout.formatted_text_box([5]) }
|
|
268
|
+
end
|
|
235
269
|
end
|
|
236
270
|
|
|
237
271
|
describe "image_box" do
|
|
@@ -277,4 +311,33 @@ describe HexaPDF::Document::Layout do
|
|
|
277
311
|
assert_equal(HexaPDF::Document::Layout::LOREM_IPSUM[0, 2].join(" ").size * 2 + 2, items[0].items.length)
|
|
278
312
|
end
|
|
279
313
|
end
|
|
314
|
+
|
|
315
|
+
describe "method_missing" do
|
|
316
|
+
it "resolves to internal methods with the _box suffix, e.g. text_box" do
|
|
317
|
+
box = @layout.text("Test", width: 10, height: 15, properties: {key: :value})
|
|
318
|
+
assert_kind_of(HexaPDF::Layout::TextBox, box)
|
|
319
|
+
assert_equal(10, box.width)
|
|
320
|
+
assert_equal(15, box.height)
|
|
321
|
+
assert_equal({key: :value}, box.properties)
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
it "resolves to the box method when a configured name is used" do
|
|
325
|
+
box = @layout.column
|
|
326
|
+
assert_kind_of(HexaPDF::Layout::ColumnBox, box)
|
|
327
|
+
box = @layout.column_box
|
|
328
|
+
assert_kind_of(HexaPDF::Layout::ColumnBox, box)
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
it "fails if nothing could be resolved" do
|
|
332
|
+
assert_raises(NameError) { @layout.unknown }
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
describe "respond_to_missing?" do
|
|
337
|
+
it "can be asked which methods it supports" do
|
|
338
|
+
assert(@layout.respond_to?(:text))
|
|
339
|
+
assert(@layout.respond_to?(:column))
|
|
340
|
+
refute(@layout.respond_to?(:unknown))
|
|
341
|
+
end
|
|
342
|
+
end
|
|
280
343
|
end
|
|
@@ -48,6 +48,10 @@ describe HexaPDF::Encryption::AES do
|
|
|
48
48
|
end
|
|
49
49
|
end
|
|
50
50
|
|
|
51
|
+
it "handles invalid files with empty strings" do
|
|
52
|
+
assert_equal('', @algorithm_class.decrypt('key', ''))
|
|
53
|
+
end
|
|
54
|
+
|
|
51
55
|
it "handles invalid files with missing 16 byte padding" do
|
|
52
56
|
assert_equal('', @algorithm_class.decrypt('some key' * 2, 'iv' * 8))
|
|
53
57
|
end
|
|
@@ -118,6 +122,10 @@ describe HexaPDF::Encryption::AES do
|
|
|
118
122
|
assert_equal('a' * 13 << "\x00\x01\x03", result)
|
|
119
123
|
end
|
|
120
124
|
|
|
125
|
+
it "handles invalid files with empty streams" do
|
|
126
|
+
assert_equal('', collector(@algorithm_class.decryption_fiber('key', Fiber.new { '' })))
|
|
127
|
+
end
|
|
128
|
+
|
|
121
129
|
it "fails on decryption if not enough bytes are provided" do
|
|
122
130
|
[4, 20, 40].each do |length|
|
|
123
131
|
assert_raises(HexaPDF::EncryptionError) do
|
|
@@ -325,6 +325,12 @@ describe HexaPDF::Encryption::SecurityHandler do
|
|
|
325
325
|
assert_equal("test", @handler.decrypt(@obj)[:Contents])
|
|
326
326
|
end
|
|
327
327
|
|
|
328
|
+
it "enhances a thrown EncryptionError by setting the PDF object" do
|
|
329
|
+
@handler.set_up_encryption(key_length: 256)
|
|
330
|
+
error = assert_raises(HexaPDF::EncryptionError) { @handler.decrypt(@obj) }
|
|
331
|
+
assert_match(/Object \(1,0\):/, error.message)
|
|
332
|
+
end
|
|
333
|
+
|
|
328
334
|
it "fails if V < 5 and the object number changes" do
|
|
329
335
|
@obj.oid = 55
|
|
330
336
|
@handler.decrypt(@obj)
|
|
@@ -2,31 +2,51 @@
|
|
|
2
2
|
|
|
3
3
|
require 'test_helper'
|
|
4
4
|
require 'hexapdf/layout/inline_box'
|
|
5
|
+
require 'hexapdf/document'
|
|
5
6
|
|
|
6
7
|
describe HexaPDF::Layout::InlineBox do
|
|
8
|
+
def inline_box(box, valign: :baseline)
|
|
9
|
+
HexaPDF::Layout::InlineBox.new(box, valign: valign)
|
|
10
|
+
end
|
|
11
|
+
|
|
7
12
|
before do
|
|
8
13
|
@box = HexaPDF::Layout::InlineBox.create(width: 10, height: 15, margin: [15, 10])
|
|
9
14
|
end
|
|
10
15
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
16
|
+
describe "initialize" do
|
|
17
|
+
it "needs a box to wrap and an optional alignment on initialization" do
|
|
18
|
+
box = HexaPDF::Layout::Box.create(width: 10, height: 15)
|
|
19
|
+
ibox = inline_box(box)
|
|
20
|
+
assert_equal(box, ibox.box)
|
|
21
|
+
assert_equal(:baseline, ibox.valign)
|
|
15
22
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
23
|
+
ibox = inline_box(box, valign: :top)
|
|
24
|
+
assert_equal(:top, ibox.valign)
|
|
25
|
+
end
|
|
19
26
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
assert_equal(
|
|
24
|
-
assert_equal(10, x)
|
|
25
|
-
assert_equal(15, y)
|
|
27
|
+
it "automatically fits the provided box into a frame" do
|
|
28
|
+
ibox = inline_box(HexaPDF::Document.new.layout.text("test is going good", width: 20))
|
|
29
|
+
assert_equal(20, ibox.width)
|
|
30
|
+
assert_equal(45, ibox.height)
|
|
26
31
|
end
|
|
27
|
-
|
|
28
|
-
|
|
32
|
+
|
|
33
|
+
it "fails if the wrapped box could not be fit" do
|
|
34
|
+
box = HexaPDF::Document.new.layout.text("test is not going good", width: 1)
|
|
35
|
+
assert_raises(HexaPDF::Error) { inline_box(box) }
|
|
29
36
|
end
|
|
37
|
+
|
|
38
|
+
it "fails if the height is not set explicitly and during fitting" do
|
|
39
|
+
assert_raises(HexaPDF::Error) do
|
|
40
|
+
inline_box(HexaPDF::Layout::Box.create(width: 10))
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "draws the wrapped box at the correct position" do
|
|
46
|
+
doc = HexaPDF::Document.new
|
|
47
|
+
canvas = doc.pages.add.canvas
|
|
48
|
+
inline_box(doc.layout.text("", width: 20, margin: [15, 10])).draw(canvas, 100, 200)
|
|
49
|
+
assert_equal("q\n1 0 0 1 110 -99785 cm\nQ\n", canvas.contents)
|
|
30
50
|
end
|
|
31
51
|
|
|
32
52
|
it "returns true if the inline box is empty with no drawing operations" do
|
|
@@ -139,12 +139,15 @@ describe HexaPDF::Layout::TextBox do
|
|
|
139
139
|
assert_operators(@canvas.contents, [[:save_graphics_state],
|
|
140
140
|
[:restore_graphics_state],
|
|
141
141
|
[:save_graphics_state],
|
|
142
|
-
[:
|
|
142
|
+
[:concatenate_matrix, [1, 0, 0, 1, 5, 10]],
|
|
143
|
+
[:save_graphics_state],
|
|
144
|
+
[:append_rectangle, [0, 0, 10, 10]],
|
|
143
145
|
[:clip_path_non_zero],
|
|
144
146
|
[:end_path],
|
|
145
|
-
[:append_rectangle, [
|
|
147
|
+
[:append_rectangle, [0.5, 0.5, 9.0, 9.0]],
|
|
146
148
|
[:stroke_path],
|
|
147
149
|
[:restore_graphics_state],
|
|
150
|
+
[:restore_graphics_state],
|
|
148
151
|
[:save_graphics_state],
|
|
149
152
|
[:restore_graphics_state]])
|
|
150
153
|
end
|
|
@@ -7,13 +7,13 @@ require 'hexapdf/document'
|
|
|
7
7
|
module TestTextLayouterHelpers
|
|
8
8
|
def boxes(*dims)
|
|
9
9
|
dims.map do |width, height|
|
|
10
|
-
box = HexaPDF::Layout::InlineBox.create(width: width, height: height ||
|
|
10
|
+
box = HexaPDF::Layout::InlineBox.create(width: width, height: height || 10) {}
|
|
11
11
|
HexaPDF::Layout::TextLayouter::Box.new(box)
|
|
12
12
|
end
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
def glue(width)
|
|
16
|
-
HexaPDF::Layout::TextLayouter::Glue.new(HexaPDF::Layout::InlineBox.create(width: width) {})
|
|
16
|
+
HexaPDF::Layout::TextLayouter::Glue.new(HexaPDF::Layout::InlineBox.create(width: width, height: 10) {})
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
def penalty(penalty, item = nil)
|
|
@@ -136,16 +136,8 @@ describe HexaPDF::Layout::TextLayouter::SimpleTextSegmentation do
|
|
|
136
136
|
[1, 3, 5, 7, 9, 11, 13, 17, 19].each do |index|
|
|
137
137
|
assert_penalty(result[index],
|
|
138
138
|
HexaPDF::Layout::TextLayouter::Penalty::PARAGRAPH_BREAK)
|
|
139
|
-
assert_equal([], result[index].item.items)
|
|
140
|
-
assert(result[index].item.items.frozen?)
|
|
141
|
-
assert_same(frag.style, result[index].item.style)
|
|
142
|
-
assert_equal(frag.properties, result[index].item.properties)
|
|
143
139
|
end
|
|
144
140
|
assert_penalty(result[15], HexaPDF::Layout::TextLayouter::Penalty::LINE_BREAK)
|
|
145
|
-
assert_equal([], result[15].item.items)
|
|
146
|
-
assert(result[15].item.items.frozen?)
|
|
147
|
-
assert_same(frag.style, result[15].item.style)
|
|
148
|
-
assert_equal(frag.properties, result[15].item.properties)
|
|
149
141
|
end
|
|
150
142
|
|
|
151
143
|
it "insert a standard penalty after a hyphen" do
|
|
@@ -624,7 +616,7 @@ describe HexaPDF::Layout::TextLayouter do
|
|
|
624
616
|
|
|
625
617
|
describe "horizontal alignment" do
|
|
626
618
|
before do
|
|
627
|
-
@items = boxes(*[[20, 20]] * 4) + [glue(10), penalty(-5000
|
|
619
|
+
@items = boxes(*[[20, 20]] * 4) + [glue(10), penalty(-5000)]
|
|
628
620
|
end
|
|
629
621
|
|
|
630
622
|
it "aligns the contents to the left" do
|
|
@@ -789,8 +781,11 @@ describe HexaPDF::Layout::TextLayouter do
|
|
|
789
781
|
[:restore_graphics_state],
|
|
790
782
|
[:save_graphics_state],
|
|
791
783
|
[:concatenate_matrix, [1, 0, 0, 1, 10, -40]],
|
|
784
|
+
[:save_graphics_state],
|
|
785
|
+
[:concatenate_matrix, [1, 0, 0, 1, 0, 0]],
|
|
792
786
|
[:set_line_width, [2]],
|
|
793
787
|
[:restore_graphics_state],
|
|
788
|
+
[:restore_graphics_state],
|
|
794
789
|
[:save_graphics_state],
|
|
795
790
|
[:restore_graphics_state]])
|
|
796
791
|
end
|
|
@@ -119,7 +119,7 @@ describe HexaPDF::Composer do
|
|
|
119
119
|
end
|
|
120
120
|
end
|
|
121
121
|
|
|
122
|
-
describe "text/formatted_text/image/box" do
|
|
122
|
+
describe "text/formatted_text/image/box/method_missing" do
|
|
123
123
|
before do
|
|
124
124
|
test_self = self
|
|
125
125
|
@composer.define_singleton_method(:draw_box) do |arg|
|
|
@@ -158,6 +158,19 @@ describe HexaPDF::Composer do
|
|
|
158
158
|
assert_equal(20, @box.width)
|
|
159
159
|
assert_same(image, @box.children[0].image)
|
|
160
160
|
end
|
|
161
|
+
|
|
162
|
+
it "delegates missing methods to layout if they are box creation methods" do
|
|
163
|
+
@composer.column(width: 10)
|
|
164
|
+
assert_equal(10, @box.width)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
it "fails for missing methods that can't be delegated to layout" do
|
|
168
|
+
assert_raises(NameError) { @composer.unknown_box }
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
it "can be asked whether a missing method is supported" do
|
|
172
|
+
assert(@composer.respond_to?(:column))
|
|
173
|
+
end
|
|
161
174
|
end
|
|
162
175
|
|
|
163
176
|
describe "draw_box" do
|
|
@@ -37,6 +37,11 @@ describe HexaPDF::Tokenizer do
|
|
|
37
37
|
end
|
|
38
38
|
end
|
|
39
39
|
|
|
40
|
+
it "next_token: should not fail for strings due to use of an internal buffer" do
|
|
41
|
+
create_tokenizer("(" << ("a" * 8189) << "\\006)")
|
|
42
|
+
assert_equal("a" * 8189 << "\x06", @tokenizer.next_token)
|
|
43
|
+
end
|
|
44
|
+
|
|
40
45
|
it "has a special token scanning method for use with xref reconstruction" do
|
|
41
46
|
create_tokenizer(<<-EOF.chomp.gsub(/^ {8}/, ''))
|
|
42
47
|
% Comment
|
data/test/hexapdf/test_writer.rb
CHANGED
|
@@ -40,7 +40,7 @@ describe HexaPDF::Writer do
|
|
|
40
40
|
219
|
|
41
41
|
%%EOF
|
|
42
42
|
3 0 obj
|
|
43
|
-
<</Producer(HexaPDF version 0.
|
|
43
|
+
<</Producer(HexaPDF version 0.32.0)>>
|
|
44
44
|
endobj
|
|
45
45
|
xref
|
|
46
46
|
3 1
|
|
@@ -72,7 +72,7 @@ describe HexaPDF::Writer do
|
|
|
72
72
|
141
|
|
73
73
|
%%EOF
|
|
74
74
|
6 0 obj
|
|
75
|
-
<</Producer(HexaPDF version 0.
|
|
75
|
+
<</Producer(HexaPDF version 0.32.0)>>
|
|
76
76
|
endobj
|
|
77
77
|
2 0 obj
|
|
78
78
|
<</Length 10>>stream
|
|
@@ -214,7 +214,7 @@ describe HexaPDF::Writer do
|
|
|
214
214
|
<</Type/Page/MediaBox[0 0 595 842]/Parent 2 0 R/Resources<<>>>>
|
|
215
215
|
endobj
|
|
216
216
|
5 0 obj
|
|
217
|
-
<</Producer(HexaPDF version 0.
|
|
217
|
+
<</Producer(HexaPDF version 0.32.0)>>
|
|
218
218
|
endobj
|
|
219
219
|
4 0 obj
|
|
220
220
|
<</Root 1 0 R/Info 5 0 R/Size 6/Type/XRef/W[1 1 2]/Index[0 6]/Filter/FlateDecode/DecodeParms<</Columns 4/Predictor 12>>/Length 33>>stream
|
|
@@ -98,6 +98,24 @@ describe HexaPDF::Type::OutlineItem do
|
|
|
98
98
|
end
|
|
99
99
|
end
|
|
100
100
|
|
|
101
|
+
describe "open?" do
|
|
102
|
+
it "returns true if the outline item is open" do
|
|
103
|
+
refute(@item.open?)
|
|
104
|
+
@item.add_item("test")
|
|
105
|
+
assert_equal(true, @item.open?)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
it "returns false if the outline item is closed" do
|
|
109
|
+
@item.delete(:Count)
|
|
110
|
+
@item.add_item("test")
|
|
111
|
+
assert_equal(false, @item.open?)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
it "returns nil if the outline item doesn't have any child items" do
|
|
115
|
+
assert_nil(@item.open?)
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
101
119
|
describe "destination_page" do
|
|
102
120
|
it "returns the page of a set destination" do
|
|
103
121
|
@item[:Dest] = [5, :Fit]
|
|
@@ -642,6 +642,22 @@ describe HexaPDF::Type::Page do
|
|
|
642
642
|
[:restore_graphics_state]])
|
|
643
643
|
end
|
|
644
644
|
|
|
645
|
+
it "handles degenerate cases when the appearance's bounding box has zero width" do
|
|
646
|
+
@appearance[:BBox] = [10, 10, 10, 20]
|
|
647
|
+
result = @page.flatten_annotations
|
|
648
|
+
assert(result.empty?)
|
|
649
|
+
assert(@annot1.null?)
|
|
650
|
+
assert_operators(@canvas.contents, [])
|
|
651
|
+
end
|
|
652
|
+
|
|
653
|
+
it "handles degenerate cases when the appearance's bounding box has zero height" do
|
|
654
|
+
@appearance[:BBox] = [10, 10, 20, 10]
|
|
655
|
+
result = @page.flatten_annotations
|
|
656
|
+
assert(result.empty?)
|
|
657
|
+
assert(@annot1.null?)
|
|
658
|
+
assert_operators(@canvas.contents, [])
|
|
659
|
+
end
|
|
660
|
+
|
|
645
661
|
it "potentially adjusts the origin so that it is always in (0,0)" do
|
|
646
662
|
@canvas.translate(-15, -15)
|
|
647
663
|
@page.flatten_annotations
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: hexapdf
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.32.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Thomas Leitner
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-
|
|
11
|
+
date: 2023-03-08 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: cmdparse
|