hexapdf 1.0.2 → 1.1.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 +29 -1
- data/LICENSE +1 -1
- data/examples/009-text_layouter_alignment.rb +4 -0
- data/examples/010-text_layouter_inline_boxes.rb +4 -0
- data/examples/011-text_layouter_line_wrapping.rb +4 -0
- data/examples/012-text_layouter_styling.rb +9 -4
- data/examples/013-text_layouter_shapes.rb +5 -0
- data/examples/015-boxes.rb +3 -0
- data/examples/016-frame_automatic_box_placement.rb +3 -0
- data/examples/017-frame_text_flow.rb +3 -0
- data/examples/{028-frame_mask_mode.rb → 028-composer_mask_mode.rb} +3 -3
- data/lib/hexapdf/cli/batch.rb +1 -1
- data/lib/hexapdf/cli/command.rb +2 -2
- 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 +6 -3
- 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/usage.rb +1 -1
- data/lib/hexapdf/cli/watermark.rb +1 -1
- data/lib/hexapdf/cli.rb +1 -1
- data/lib/hexapdf/composer.rb +1 -1
- data/lib/hexapdf/configuration.rb +6 -1
- data/lib/hexapdf/content/canvas.rb +1 -1
- data/lib/hexapdf/content/canvas_composer.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 +22 -25
- 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 +1 -1
- data/lib/hexapdf/document/metadata.rb +1 -1
- data/lib/hexapdf/document/pages.rb +1 -1
- data/lib/hexapdf/document.rb +1 -1
- data/lib/hexapdf/encryption/aes.rb +1 -1
- data/lib/hexapdf/encryption/arc4.rb +3 -3
- 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 +1 -1
- data/lib/hexapdf/encryption/standard_security_handler.rb +1 -1
- data/lib/hexapdf/encryption.rb +1 -1
- data/lib/hexapdf/error.rb +1 -1
- 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/variant_from_name.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/container_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 +1 -1
- 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/page_style.rb +1 -1
- data/lib/hexapdf/layout/style.rb +4 -2
- data/lib/hexapdf/layout/table_box.rb +9 -2
- data/lib/hexapdf/layout/text_box.rb +1 -1
- data/lib/hexapdf/layout/text_fragment.rb +11 -1
- data/lib/hexapdf/layout/text_layouter.rb +1 -1
- 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/merge_acro_form.rb +1 -1
- data/lib/hexapdf/task/optimize.rb +1 -1
- data/lib/hexapdf/task/pdfa.rb +1 -1
- data/lib/hexapdf/task.rb +1 -1
- data/lib/hexapdf/test_utils.rb +3 -2
- data/lib/hexapdf/tokenizer.rb +49 -46
- 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 +2 -2
- data/lib/hexapdf/type/acro_form/java_script_actions.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/set_ocg_state.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 +2 -2
- data/lib/hexapdf/type/cid_font.rb +2 -2
- data/lib/hexapdf/type/cmap.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/marked_content_reference.rb +59 -0
- data/lib/hexapdf/type/metadata.rb +1 -1
- data/lib/hexapdf/type/names.rb +1 -1
- data/lib/hexapdf/type/namespace.rb +57 -0
- data/lib/hexapdf/type/object_reference.rb +57 -0
- data/lib/hexapdf/type/object_stream.rb +1 -1
- data/lib/hexapdf/type/optional_content_configuration.rb +1 -1
- data/lib/hexapdf/type/optional_content_group.rb +1 -1
- data/lib/hexapdf/type/optional_content_membership.rb +1 -1
- data/lib/hexapdf/type/optional_content_properties.rb +1 -1
- data/lib/hexapdf/type/outline.rb +1 -1
- data/lib/hexapdf/type/outline_item.rb +1 -1
- data/lib/hexapdf/type/output_intent.rb +1 -1
- data/lib/hexapdf/type/page.rb +1 -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 +7 -3
- data/lib/hexapdf/type/struct_elem.rb +72 -0
- data/lib/hexapdf/type/struct_tree_root.rb +64 -0
- 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 +6 -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/utils.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/common_tokenizer_tests.rb +2 -7
- data/test/hexapdf/encryption/common.rb +1 -1
- data/test/hexapdf/encryption/test_aes.rb +1 -1
- data/test/hexapdf/encryption/test_arc4.rb +2 -2
- data/test/hexapdf/encryption/test_security_handler.rb +1 -1
- data/test/hexapdf/filter/test_ascii85_decode.rb +1 -1
- data/test/hexapdf/filter/test_ascii_hex_decode.rb +1 -1
- data/test/hexapdf/filter/test_flate_decode.rb +2 -3
- data/test/hexapdf/font/cmap/test_writer.rb +2 -2
- data/test/hexapdf/font/encoding/test_glyph_list.rb +1 -1
- data/test/hexapdf/font/test_true_type_wrapper.rb +2 -2
- data/test/hexapdf/font/test_type1_wrapper.rb +1 -1
- data/test/hexapdf/layout/test_box.rb +0 -2
- data/test/hexapdf/layout/test_style.rb +0 -10
- data/test/hexapdf/layout/test_table_box.rb +0 -15
- data/test/hexapdf/layout/test_text_box.rb +0 -6
- data/test/hexapdf/task/test_merge_acro_form.rb +1 -1
- data/test/hexapdf/test_filter.rb +1 -1
- data/test/hexapdf/test_parser.rb +10 -10
- data/test/hexapdf/test_revisions.rb +1 -1
- data/test/hexapdf/test_serializer.rb +2 -3
- data/test/hexapdf/test_tokenizer.rb +1 -1
- data/test/hexapdf/test_writer.rb +2 -2
- data/test/hexapdf/type/acro_form/test_form.rb +8 -0
- data/test/hexapdf/type/test_font_type1.rb +1 -1
- data/test/hexapdf/type/test_image.rb +1 -1
- data/test/hexapdf/type/test_page_tree_node.rb +2 -2
- data/test/hexapdf/type/test_resources.rb +3 -1
- data/test/test_helper.rb +1 -0
- metadata +23 -7
|
@@ -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-2025 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-2025 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-2025 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-2025 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-2025 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-2025 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/utils.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-2025 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-2025 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 = '1.0
|
|
40
|
+
VERSION = '1.1.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-2025 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-2025 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-2025 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
|
|
@@ -65,7 +65,7 @@ module CommonTokenizerTests
|
|
|
65
65
|
:'The_Key_of_F#_Minor', :AB, :"",
|
|
66
66
|
'[', 5, 6, :Name, ']', '[', 5, 6, :Name, ']',
|
|
67
67
|
'<<', :Name, 5, '>>'
|
|
68
|
-
].
|
|
68
|
+
].map {|t| t.respond_to?(:force_encoding) ? t.b : t }
|
|
69
69
|
|
|
70
70
|
until expected_tokens.empty?
|
|
71
71
|
expected_token = expected_tokens.shift
|
|
@@ -126,11 +126,6 @@ module CommonTokenizerTests
|
|
|
126
126
|
assert(token.kind_of?(HexaPDF::Tokenizer::Token))
|
|
127
127
|
end
|
|
128
128
|
|
|
129
|
-
it "next_token: should not fail when reading super long numbers" do
|
|
130
|
-
create_tokenizer("1" << "0" * 10_000)
|
|
131
|
-
assert_equal(10**10_000, @tokenizer.next_token)
|
|
132
|
-
end
|
|
133
|
-
|
|
134
129
|
it "next_object: works for all PDF object types, including array and dictionary" do
|
|
135
130
|
create_tokenizer(<<-EOF.chomp.gsub(/^ {8}/, ''))
|
|
136
131
|
true false null 123 34.5 (string) <4E6F76> /Name
|
|
@@ -182,7 +177,7 @@ module CommonTokenizerTests
|
|
|
182
177
|
end
|
|
183
178
|
|
|
184
179
|
it "returns the correct position on operations" do
|
|
185
|
-
create_tokenizer("hallo du"
|
|
180
|
+
create_tokenizer("hallo du" + " " * 50000 + "hallo du")
|
|
186
181
|
@tokenizer.next_token
|
|
187
182
|
assert_equal(5, @tokenizer.pos)
|
|
188
183
|
|
|
@@ -67,7 +67,7 @@ module ARC4EncryptionTests
|
|
|
67
67
|
super
|
|
68
68
|
@encrypted = ['BBF316E8D940AF0AD3', '1021BF0420', '45A01F645FC35B383552544B9BF5'].
|
|
69
69
|
map {|c| [c].pack('H*') }
|
|
70
|
-
@plain = ['Plaintext', 'pedia', 'Attack at dawn']
|
|
70
|
+
@plain = ['Plaintext'.b, 'pedia'.b, 'Attack at dawn'.b]
|
|
71
71
|
@keys = ['Key', 'Wiki', 'Secret']
|
|
72
72
|
end
|
|
73
73
|
|
|
@@ -141,7 +141,7 @@ describe HexaPDF::Encryption::AES do
|
|
|
141
141
|
collector(@algorithm_class.decryption_fiber('some' * 4, Fiber.new { 'a' * 40 }))
|
|
142
142
|
end
|
|
143
143
|
assert_raises(HexaPDF::EncryptionError) do
|
|
144
|
-
collector(@algorithm_class.decryption_fiber('some' * 4, Fiber.new { 'a' * 40 })
|
|
144
|
+
collector(@algorithm_class.decryption_fiber('some' * 4, Fiber.new { 'a' * 40 }) { true })
|
|
145
145
|
end
|
|
146
146
|
end
|
|
147
147
|
end
|
|
@@ -11,13 +11,13 @@ describe HexaPDF::Encryption::ARC4 do
|
|
|
11
11
|
prepend HexaPDF::Encryption::ARC4
|
|
12
12
|
|
|
13
13
|
def initialize(key)
|
|
14
|
-
@data = key
|
|
14
|
+
@data = +key
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def process(data)
|
|
18
18
|
raise if data.empty?
|
|
19
19
|
result = @data << data
|
|
20
|
-
@data = ''
|
|
20
|
+
@data = +''
|
|
21
21
|
result
|
|
22
22
|
end
|
|
23
23
|
end
|
|
@@ -236,7 +236,7 @@ describe HexaPDF::Encryption::SecurityHandler do
|
|
|
236
236
|
dict[:Filter] = :Test
|
|
237
237
|
@enc.strf = alg
|
|
238
238
|
@enc.set_up_encryption(key_length: length, algorithm: (alg == :identity ? :aes : alg))
|
|
239
|
-
@obj[:X] = @enc.encrypt_string('data', @obj)
|
|
239
|
+
@obj[:X] = @enc.encrypt_string(+'data', @obj)
|
|
240
240
|
@handler.set_up_decryption(dict)
|
|
241
241
|
assert_equal('data', @handler.decrypt(@obj)[:X])
|
|
242
242
|
end
|
|
@@ -33,7 +33,7 @@ describe HexaPDF::Filter::ASCII85Decode do
|
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
it "ignores data after the EOD marker" do
|
|
36
|
-
assert_equal(@decoded, collector(@obj.decoder(feeder(@encoded
|
|
36
|
+
assert_equal(@decoded, collector(@obj.decoder(feeder(@encoded + "~>abcdefg"))))
|
|
37
37
|
end
|
|
38
38
|
|
|
39
39
|
it "fails if the input contains invalid characters" do
|
|
@@ -24,7 +24,7 @@ describe HexaPDF::Filter::ASCIIHexDecode do
|
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
it "ignores data after the EOD marker" do
|
|
27
|
-
assert_equal(@decoded, collector(@obj.decoder(feeder(@encoded
|
|
27
|
+
assert_equal(@decoded, collector(@obj.decoder(feeder(@encoded + '4e6f7gzz'))))
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
it "assumes the missing char is '0' if the input length is odd" do
|
|
@@ -8,11 +8,10 @@ describe HexaPDF::Filter::FlateDecode do
|
|
|
8
8
|
|
|
9
9
|
before do
|
|
10
10
|
@obj = HexaPDF::Filter::FlateDecode
|
|
11
|
-
@all_test_cases = [["abcdefg".
|
|
12
|
-
"x\xDAKLJNIMK\a\x00\n\xDB\x02\xBD".force_encoding(Encoding::BINARY)]]
|
|
11
|
+
@all_test_cases = [["abcdefg".b, "x\xDAKLJNIMK\a\x00\n\xDB\x02\xBD".b]]
|
|
13
12
|
@decoded = @all_test_cases[0][0]
|
|
14
13
|
@encoded = @all_test_cases[0][1]
|
|
15
|
-
@encoded_predictor = "x\xDAcJdbD@\x00\x05\x8F\x00v".
|
|
14
|
+
@encoded_predictor = "x\xDAcJdbD@\x00\x05\x8F\x00v".b
|
|
16
15
|
@predictor_opts = {Predictor: 12}
|
|
17
16
|
end
|
|
18
17
|
|
|
@@ -5,7 +5,7 @@ require 'hexapdf/font/cmap/writer'
|
|
|
5
5
|
|
|
6
6
|
describe HexaPDF::Font::CMap::Writer do
|
|
7
7
|
before do
|
|
8
|
-
@to_unicode_cmap_data =
|
|
8
|
+
@to_unicode_cmap_data = +<<~EOF
|
|
9
9
|
/CIDInit /ProcSet findresource begin
|
|
10
10
|
12 dict begin
|
|
11
11
|
begincmap
|
|
@@ -32,7 +32,7 @@ describe HexaPDF::Font::CMap::Writer do
|
|
|
32
32
|
end
|
|
33
33
|
end
|
|
34
34
|
EOF
|
|
35
|
-
@cid_cmap_data =
|
|
35
|
+
@cid_cmap_data = +<<~EOF
|
|
36
36
|
%!PS-Adobe-3.0 Resource-CMap
|
|
37
37
|
%%DocumentNeededResources: ProcSet (CIDInit)
|
|
38
38
|
%%IncludeResource: ProcSet (CIDInit)
|
|
@@ -32,7 +32,7 @@ describe HexaPDF::Font::Encoding::GlyphList do
|
|
|
32
32
|
|
|
33
33
|
it "maps special uXXXX[XX] names to unicode values" do
|
|
34
34
|
assert_equal("A", @list.name_to_unicode(:u0041))
|
|
35
|
-
assert_equal(
|
|
35
|
+
assert_equal(+'' << "1F000".hex, @list.name_to_unicode(:u1F000))
|
|
36
36
|
end
|
|
37
37
|
|
|
38
38
|
it "maps Zapf Dingbats glyph names to their unicode" do
|
|
@@ -51,7 +51,7 @@ describe HexaPDF::Font::TrueTypeWrapper do
|
|
|
51
51
|
glyphs = @font_wrapper.decode_utf8("😁")
|
|
52
52
|
assert_equal(1, glyphs.length)
|
|
53
53
|
assert_kind_of(HexaPDF::Font::InvalidGlyph, glyphs.first)
|
|
54
|
-
assert_equal('' << 128_513, glyphs.first.str)
|
|
54
|
+
assert_equal(+'' << 128_513, glyphs.first.str)
|
|
55
55
|
end
|
|
56
56
|
end
|
|
57
57
|
|
|
@@ -81,7 +81,7 @@ describe HexaPDF::Font::TrueTypeWrapper do
|
|
|
81
81
|
glyph = @font_wrapper.glyph(9999)
|
|
82
82
|
assert_kind_of(HexaPDF::Font::InvalidGlyph, glyph)
|
|
83
83
|
assert_equal(0, glyph.id)
|
|
84
|
-
assert_equal('' << 0xFFFD, glyph.str)
|
|
84
|
+
assert_equal(+'' << 0xFFFD, glyph.str)
|
|
85
85
|
end
|
|
86
86
|
end
|
|
87
87
|
|
|
@@ -56,7 +56,7 @@ describe HexaPDF::Font::Type1Wrapper do
|
|
|
56
56
|
glyphs = @times_wrapper.decode_utf8("😁")
|
|
57
57
|
assert_equal(1, glyphs.length)
|
|
58
58
|
assert_kind_of(HexaPDF::Font::InvalidGlyph, glyphs.first)
|
|
59
|
-
assert_equal('' << 128_513, glyphs.first.str)
|
|
59
|
+
assert_equal(+'' << 128_513, glyphs.first.str)
|
|
60
60
|
end
|
|
61
61
|
end
|
|
62
62
|
|
|
@@ -270,8 +270,6 @@ describe HexaPDF::Layout::Box do
|
|
|
270
270
|
[:restore_graphics_state],
|
|
271
271
|
[:save_graphics_state],
|
|
272
272
|
[:set_line_width, [5]],
|
|
273
|
-
[:append_rectangle, [5, 5, 150, 130]],
|
|
274
|
-
[:clip_path_non_zero], [:end_path],
|
|
275
273
|
[:append_rectangle, [7.5, 7.5, 145, 125]],
|
|
276
274
|
[:stroke_path],
|
|
277
275
|
[:restore_graphics_state],
|
|
@@ -199,8 +199,6 @@ describe HexaPDF::Layout::Style::Border do
|
|
|
199
199
|
assert_operators(@canvas.contents, [[:save_graphics_state],
|
|
200
200
|
[:set_device_gray_stroking_color, [0.5]],
|
|
201
201
|
[:set_line_width, [10]],
|
|
202
|
-
[:append_rectangle, [0, 0, 100, 100]],
|
|
203
|
-
[:clip_path_non_zero], [:end_path],
|
|
204
202
|
[:append_rectangle, [5, 5, 90, 90]],
|
|
205
203
|
[:stroke_path],
|
|
206
204
|
[:restore_graphics_state]])
|
|
@@ -213,8 +211,6 @@ describe HexaPDF::Layout::Style::Border do
|
|
|
213
211
|
[:set_device_gray_stroking_color, [0.5]],
|
|
214
212
|
[:set_line_width, [10]],
|
|
215
213
|
[:set_line_cap_style, [2]],
|
|
216
|
-
[:append_rectangle, [0, 0, 200, 300]],
|
|
217
|
-
[:clip_path_non_zero], [:end_path],
|
|
218
214
|
[:set_line_dash_pattern, [[10, 20], 25]],
|
|
219
215
|
[:move_to, [0, 295]], [:line_to, [200, 295]],
|
|
220
216
|
[:move_to, [200, 5]], [:line_to, [0, 5]],
|
|
@@ -234,8 +230,6 @@ describe HexaPDF::Layout::Style::Border do
|
|
|
234
230
|
[:set_device_gray_stroking_color, [0.5]],
|
|
235
231
|
[:set_line_width, [10]],
|
|
236
232
|
[:set_line_cap_style, [1]],
|
|
237
|
-
[:append_rectangle, [0, 0, 200, 300]],
|
|
238
|
-
[:clip_path_non_zero], [:end_path],
|
|
239
233
|
[:set_line_dash_pattern, [[10, 20], 25]],
|
|
240
234
|
[:move_to, [0, 295]], [:line_to, [200, 295]],
|
|
241
235
|
[:move_to, [200, 5]], [:line_to, [0, 5]],
|
|
@@ -255,8 +249,6 @@ describe HexaPDF::Layout::Style::Border do
|
|
|
255
249
|
[:set_device_gray_stroking_color, [0.5]],
|
|
256
250
|
[:set_line_width, [10]],
|
|
257
251
|
[:set_line_cap_style, [1]],
|
|
258
|
-
[:append_rectangle, [0, 0, 100, 200]],
|
|
259
|
-
[:clip_path_non_zero], [:end_path],
|
|
260
252
|
[:set_line_dash_pattern, [[0, 18], 13]],
|
|
261
253
|
[:move_to, [0, 195]], [:line_to, [100, 195]],
|
|
262
254
|
[:move_to, [100, 5]], [:line_to, [0, 5]],
|
|
@@ -275,8 +267,6 @@ describe HexaPDF::Layout::Style::Border do
|
|
|
275
267
|
assert_operators(@canvas.contents, [[:save_graphics_state],
|
|
276
268
|
[:set_device_gray_stroking_color, [0.5]],
|
|
277
269
|
[:set_line_width, [10]],
|
|
278
|
-
[:append_rectangle, [-5, -5, 110, 110]],
|
|
279
|
-
[:clip_path_non_zero], [:end_path],
|
|
280
270
|
[:append_rectangle, [0, 0, 100, 100]],
|
|
281
271
|
[:stroke_path],
|
|
282
272
|
[:restore_graphics_state]])
|
|
@@ -143,9 +143,6 @@ describe HexaPDF::Layout::TableBox::Cell do
|
|
|
143
143
|
box.fit(100, 100, @frame)
|
|
144
144
|
box.draw(@canvas, 10, 75)
|
|
145
145
|
operators = [[:save_graphics_state],
|
|
146
|
-
[:append_rectangle, [9.5, 74.5, 101.0, 38.0]],
|
|
147
|
-
[:clip_path_non_zero],
|
|
148
|
-
[:end_path],
|
|
149
146
|
[:append_rectangle, [10.0, 75.0, 100.0, 37.0]],
|
|
150
147
|
[:stroke_path],
|
|
151
148
|
[:restore_graphics_state],
|
|
@@ -674,9 +671,6 @@ describe HexaPDF::Layout::TableBox do
|
|
|
674
671
|
box.fit(100, 100, @frame)
|
|
675
672
|
box.draw(@canvas, 20, 10)
|
|
676
673
|
operators = [[:save_graphics_state],
|
|
677
|
-
[:append_rectangle, [20.0, 32.0, 50.5, 23.0]],
|
|
678
|
-
[:clip_path_non_zero],
|
|
679
|
-
[:end_path],
|
|
680
674
|
[:append_rectangle, [20.5, 32.5, 49.5, 22.0]],
|
|
681
675
|
[:stroke_path],
|
|
682
676
|
[:restore_graphics_state],
|
|
@@ -686,9 +680,6 @@ describe HexaPDF::Layout::TableBox do
|
|
|
686
680
|
[:end_path],
|
|
687
681
|
[:restore_graphics_state],
|
|
688
682
|
[:save_graphics_state],
|
|
689
|
-
[:append_rectangle, [69.5, 32.0, 50.5, 23.0]],
|
|
690
|
-
[:clip_path_non_zero],
|
|
691
|
-
[:end_path],
|
|
692
683
|
[:append_rectangle, [70.0, 32.5, 49.5, 22.0]],
|
|
693
684
|
[:stroke_path],
|
|
694
685
|
[:restore_graphics_state],
|
|
@@ -698,9 +689,6 @@ describe HexaPDF::Layout::TableBox do
|
|
|
698
689
|
[:end_path],
|
|
699
690
|
[:restore_graphics_state],
|
|
700
691
|
[:save_graphics_state],
|
|
701
|
-
[:append_rectangle, [20.0, 10.0, 50.5, 23.0]],
|
|
702
|
-
[:clip_path_non_zero],
|
|
703
|
-
[:end_path],
|
|
704
692
|
[:append_rectangle, [20.5, 10.5, 49.5, 22.0]],
|
|
705
693
|
[:stroke_path],
|
|
706
694
|
[:restore_graphics_state],
|
|
@@ -710,9 +698,6 @@ describe HexaPDF::Layout::TableBox do
|
|
|
710
698
|
[:end_path],
|
|
711
699
|
[:restore_graphics_state],
|
|
712
700
|
[:save_graphics_state],
|
|
713
|
-
[:append_rectangle, [69.5, 10.0, 50.5, 23.0]],
|
|
714
|
-
[:clip_path_non_zero],
|
|
715
|
-
[:end_path],
|
|
716
701
|
[:append_rectangle, [70.0, 10.5, 49.5, 22.0]],
|
|
717
702
|
[:stroke_path],
|
|
718
703
|
[:restore_graphics_state],
|
|
@@ -178,9 +178,6 @@ describe HexaPDF::Layout::TextBox do
|
|
|
178
178
|
assert_operators(@canvas.contents, [[:save_graphics_state],
|
|
179
179
|
[:restore_graphics_state],
|
|
180
180
|
[:save_graphics_state],
|
|
181
|
-
[:append_rectangle, [5, 10, 10, 10]],
|
|
182
|
-
[:clip_path_non_zero],
|
|
183
|
-
[:end_path],
|
|
184
181
|
[:append_rectangle, [5.5, 10.5, 9.0, 9.0]],
|
|
185
182
|
[:stroke_path],
|
|
186
183
|
[:restore_graphics_state],
|
|
@@ -194,9 +191,6 @@ describe HexaPDF::Layout::TextBox do
|
|
|
194
191
|
box.fit(60, 100, @frame)
|
|
195
192
|
box.draw(@canvas, 40, 88)
|
|
196
193
|
assert_operators(@canvas.contents, [[:save_graphics_state],
|
|
197
|
-
[:append_rectangle, [40, 88, 12, 12]],
|
|
198
|
-
[:clip_path_non_zero],
|
|
199
|
-
[:end_path],
|
|
200
194
|
[:append_rectangle, [40.5, 88.5, 11.0, 11.0]],
|
|
201
195
|
[:stroke_path],
|
|
202
196
|
[:restore_graphics_state],
|
|
@@ -81,7 +81,7 @@ describe HexaPDF::Task::MergeAcroForm do
|
|
|
81
81
|
end
|
|
82
82
|
|
|
83
83
|
it "updates the /DA entries of widgets and fields" do
|
|
84
|
-
@pages[0][:Annots][0][:DA] = '/F1 10 Tf'
|
|
84
|
+
@pages[0][:Annots][0][:DA] = +'/F1 10 Tf'
|
|
85
85
|
@doc.task(:merge_acro_form, source: @doc1, pages: @pages)
|
|
86
86
|
field = @doc.acro_form.field_by_name('merged_1.Text')
|
|
87
87
|
assert_equal('0.0 g /F2 0 Tf', field[:DA])
|
data/test/hexapdf/test_filter.rb
CHANGED
data/test/hexapdf/test_parser.rb
CHANGED
|
@@ -11,7 +11,7 @@ describe HexaPDF::Parser do
|
|
|
11
11
|
@document.config['parser.try_xref_reconstruction'] = false
|
|
12
12
|
@document.add(@document.wrap(10, oid: 1, gen: 0))
|
|
13
13
|
|
|
14
|
-
create_parser(
|
|
14
|
+
create_parser(+<<~EOF)
|
|
15
15
|
%PDF-1.7
|
|
16
16
|
|
|
17
17
|
1 0 obj
|
|
@@ -354,7 +354,7 @@ describe HexaPDF::Parser do
|
|
|
354
354
|
describe "startxref_offset" do
|
|
355
355
|
it "caches the offset value" do
|
|
356
356
|
assert_equal(330, @parser.startxref_offset)
|
|
357
|
-
@parser.instance_eval { @io
|
|
357
|
+
@parser.instance_eval { @io.string = @io.string.sub(/330\n/, "309\n") }
|
|
358
358
|
assert_equal(330, @parser.startxref_offset)
|
|
359
359
|
end
|
|
360
360
|
|
|
@@ -363,7 +363,7 @@ describe HexaPDF::Parser do
|
|
|
363
363
|
end
|
|
364
364
|
|
|
365
365
|
it "ignores garbage at the end of the file" do
|
|
366
|
-
create_parser("startxref\n5\n%%EOF"
|
|
366
|
+
create_parser("startxref\n5\n%%EOF" + "\nhallo" * 150)
|
|
367
367
|
assert_equal(5, @parser.startxref_offset)
|
|
368
368
|
end
|
|
369
369
|
|
|
@@ -373,17 +373,17 @@ describe HexaPDF::Parser do
|
|
|
373
373
|
end
|
|
374
374
|
|
|
375
375
|
it "finds the startxref anywhere in file" do
|
|
376
|
-
create_parser("startxref\n5\n%%EOF"
|
|
376
|
+
create_parser("startxref\n5\n%%EOF" + "\nhallo" * 5000)
|
|
377
377
|
assert_equal(5, @parser.startxref_offset)
|
|
378
378
|
end
|
|
379
379
|
|
|
380
380
|
it "handles the case where %%EOF is the on the 1. line of the 1024 byte search block" do
|
|
381
|
-
create_parser("startxref\n5\n%%EOF\n"
|
|
381
|
+
create_parser("startxref\n5\n%%EOF\n" + "h" * 1018)
|
|
382
382
|
assert_equal(5, @parser.startxref_offset)
|
|
383
383
|
end
|
|
384
384
|
|
|
385
385
|
it "handles the case where %%EOF is the on the 2. line of the 1024 byte search block" do
|
|
386
|
-
create_parser("startxref\n5\n%%EOF\n"
|
|
386
|
+
create_parser("startxref\n5\n%%EOF\n" + "h" * 1017)
|
|
387
387
|
assert_equal(5, @parser.startxref_offset)
|
|
388
388
|
end
|
|
389
389
|
|
|
@@ -421,7 +421,7 @@ describe HexaPDF::Parser do
|
|
|
421
421
|
|
|
422
422
|
it "fails on strict parsing if the startxref is not in the last part of the file" do
|
|
423
423
|
@document.config['parser.on_correctable_error'] = proc { true }
|
|
424
|
-
create_parser("startxref\n5\n%%EOF"
|
|
424
|
+
create_parser("startxref\n5\n%%EOF" + "\nhallo" * 5000)
|
|
425
425
|
exp = assert_raises(HexaPDF::MalformedPDFError) { @parser.startxref_offset }
|
|
426
426
|
assert_match(/end-of-file marker not found/, exp.message)
|
|
427
427
|
end
|
|
@@ -459,7 +459,7 @@ describe HexaPDF::Parser do
|
|
|
459
459
|
end
|
|
460
460
|
|
|
461
461
|
it "ignores junk at the beginning of the file and correctly calculates offset" do
|
|
462
|
-
create_parser("junk" * 200
|
|
462
|
+
create_parser("junk" * 200 + "\n%PDF-1.4\n")
|
|
463
463
|
assert_equal('1.4', @parser.file_header_version)
|
|
464
464
|
assert_equal(801, @parser.instance_variable_get(:@header_offset))
|
|
465
465
|
end
|
|
@@ -670,13 +670,13 @@ describe HexaPDF::Parser do
|
|
|
670
670
|
end
|
|
671
671
|
|
|
672
672
|
it "handles cases where the line contains an invalid string that exceeds the read buffer" do
|
|
673
|
-
create_parser("(1"
|
|
673
|
+
create_parser("(1" + "(abc" * 32188 + "\n1 0 obj\n6\nendobj\ntrailer\n<</Size 1>>")
|
|
674
674
|
assert_equal(6, @parser.load_object(@xref).value)
|
|
675
675
|
end
|
|
676
676
|
|
|
677
677
|
it "handles pathalogical cases which contain many opened literal strings" do
|
|
678
678
|
time = Time.now
|
|
679
|
-
create_parser("(1"
|
|
679
|
+
create_parser("(1" + "(abc\n" * 10000 + "\n1 0 obj\n6\nendobj\ntrailer\n<</Size 1>>")
|
|
680
680
|
assert_equal(6, @parser.load_object(@xref).value)
|
|
681
681
|
assert(Time.now - time < 0.5, "Xref reconstruction takes too long")
|
|
682
682
|
end
|
|
@@ -88,7 +88,7 @@ describe HexaPDF::Serializer do
|
|
|
88
88
|
assert_serialized('/The_Key_of_F#23_Minor', :'The_Key_of_F#_Minor')
|
|
89
89
|
assert_serialized('/ ', :"")
|
|
90
90
|
assert_serialized('/H#c3#b6#c3#9fgang', :Hößgang)
|
|
91
|
-
assert_serialized('/H#e8lp', "H\xE8lp".
|
|
91
|
+
assert_serialized('/H#e8lp', "H\xE8lp".b.intern)
|
|
92
92
|
assert_serialized('/#00#09#0a#0c#0d#20', :"\x00\t\n\f\r ")
|
|
93
93
|
end
|
|
94
94
|
|
|
@@ -105,8 +105,7 @@ describe HexaPDF::Serializer do
|
|
|
105
105
|
it "serializes strings" do
|
|
106
106
|
assert_serialized("(Hallo)", "Hallo")
|
|
107
107
|
assert_serialized("(Hallo\\r\n\t\\(\\)\\\\)", "Hallo\r\n\t()\\")
|
|
108
|
-
assert_serialized("(\xFE\xFF\x00H\x00a\x00l\x00\f\x00\b\x00\\()".
|
|
109
|
-
"Hal\f\b(")
|
|
108
|
+
assert_serialized("(\xFE\xFF\x00H\x00a\x00l\x00\f\x00\b\x00\\()".b, "Hal\f\b(")
|
|
110
109
|
end
|
|
111
110
|
|
|
112
111
|
it "serializes time like objects" do
|
|
@@ -38,7 +38,7 @@ describe HexaPDF::Tokenizer do
|
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
it "next_token: should not fail for strings due to use of an internal buffer" do
|
|
41
|
-
create_tokenizer("("
|
|
41
|
+
create_tokenizer("(" + ("a" * 8189) + "\\006)")
|
|
42
42
|
assert_equal("a" * 8189 << "\x06", @tokenizer.next_token)
|
|
43
43
|
end
|
|
44
44
|
|
data/test/hexapdf/test_writer.rb
CHANGED
|
@@ -98,7 +98,7 @@ describe HexaPDF::Writer do
|
|
|
98
98
|
def assert_document_conversion(input_io)
|
|
99
99
|
document = HexaPDF::Document.new(io: input_io)
|
|
100
100
|
document.trailer.info[:Producer] = "unknown"
|
|
101
|
-
output_io = StringIO.new(''.
|
|
101
|
+
output_io = StringIO.new(''.b)
|
|
102
102
|
start_xref_offset, xref_section = HexaPDF::Writer.write(document, output_io)
|
|
103
103
|
assert_kind_of(HexaPDF::XRefSection, xref_section)
|
|
104
104
|
assert_kind_of(Integer, start_xref_offset)
|
|
@@ -206,7 +206,7 @@ describe HexaPDF::Writer do
|
|
|
206
206
|
|
|
207
207
|
it "doesn't create an xref stream if one was just used for an XRefStm entry" do
|
|
208
208
|
# The following document's structure is built like a typical MS Word created PDF
|
|
209
|
-
input = StringIO.new(<<~EOF.
|
|
209
|
+
input = StringIO.new(<<~EOF.b)
|
|
210
210
|
%PDF-1.2
|
|
211
211
|
%\xCF\xEC\xFF\xE8\xD7\xCB\xCD
|
|
212
212
|
1 0 obj
|
|
@@ -494,6 +494,14 @@ describe HexaPDF::Type::AcroForm::Form do
|
|
|
494
494
|
@acro_form.recalculate_fields
|
|
495
495
|
assert_equal("10", @text3.field_value)
|
|
496
496
|
end
|
|
497
|
+
|
|
498
|
+
it "ensures that only entries in /CO that are actually fields are used" do
|
|
499
|
+
@text1.field_value = "10"
|
|
500
|
+
@text3.set_calculate_action(:sfn, fields: 'text1')
|
|
501
|
+
@acro_form[:CO] = [nil, 5, [:some, :array], @doc.pages.root, @text3]
|
|
502
|
+
@acro_form.recalculate_fields
|
|
503
|
+
assert_equal("10", @text3.field_value)
|
|
504
|
+
end
|
|
497
505
|
end
|
|
498
506
|
|
|
499
507
|
describe "perform_validation" do
|
|
@@ -171,7 +171,7 @@ describe HexaPDF::Type::Image do
|
|
|
171
171
|
|
|
172
172
|
def assert_valid_png(filename, original = nil)
|
|
173
173
|
if PNG_CHECK_AVAILABLE
|
|
174
|
-
result = `pngcheck -q #{filename}`
|
|
174
|
+
result = `pngcheck -q #{filename} 2>/dev/null`
|
|
175
175
|
assert(result.empty?, "pngcheck error: #{result}")
|
|
176
176
|
else
|
|
177
177
|
skip("Skipping PNG output validity check because pngcheck executable is missing")
|
|
@@ -326,9 +326,9 @@ describe HexaPDF::Type::PageTreeNode do
|
|
|
326
326
|
assert(@root.validate(auto_correct: false) {|m, _| p m })
|
|
327
327
|
|
|
328
328
|
@doc.delete(@pages[3])
|
|
329
|
-
refute(@root.validate(auto_correct: false)
|
|
329
|
+
refute(@root.validate(auto_correct: false) do |msg, _|
|
|
330
330
|
assert_match(/invalid object/i, msg)
|
|
331
|
-
end
|
|
331
|
+
end)
|
|
332
332
|
assert(@root.validate)
|
|
333
333
|
assert_equal(2, @kid12[:Count])
|
|
334
334
|
assert_equal([@pages[2], @pages[4]], @kid12[:Kids].value)
|
|
@@ -196,7 +196,9 @@ describe HexaPDF::Type::Resources do
|
|
|
196
196
|
describe "validation" do
|
|
197
197
|
it "handles an invalid ProcSet containing a single value instead of an array" do
|
|
198
198
|
@res[:ProcSet] = :PDF
|
|
199
|
-
|
|
199
|
+
msg = nil
|
|
200
|
+
@res.validate {|message, *| msg = message unless msg }
|
|
201
|
+
assert_match(/single value instead of an Array/, msg)
|
|
200
202
|
assert_equal([:PDF], @res[:ProcSet].value)
|
|
201
203
|
end
|
|
202
204
|
|