hexapdf 0.46.0 → 1.6.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 +342 -16
- data/LICENSE +1 -1
- data/README.md +9 -8
- 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/022-outline.rb +5 -1
- 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 +65 -65
- data/lib/hexapdf/cli/debug_info.rb +98 -0
- data/lib/hexapdf/cli/files.rb +1 -1
- data/lib/hexapdf/cli/fonts.rb +1 -1
- data/lib/hexapdf/cli/form.rb +11 -6
- data/lib/hexapdf/cli/image2pdf.rb +1 -1
- data/lib/hexapdf/cli/images.rb +19 -4
- data/lib/hexapdf/cli/info.rb +1 -1
- data/lib/hexapdf/cli/inspect.rb +24 -8
- data/lib/hexapdf/cli/merge.rb +1 -1
- data/lib/hexapdf/cli/modify.rb +1 -2
- data/lib/hexapdf/cli/optimize.rb +6 -6
- 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 +20 -2
- data/lib/hexapdf/composer.rb +22 -1
- data/lib/hexapdf/configuration.rb +56 -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 +2 -2
- data/lib/hexapdf/content/operator.rb +1 -1
- data/lib/hexapdf/content/parser.rb +22 -23
- 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 +8 -2
- data/lib/hexapdf/dictionary_fields.rb +2 -2
- data/lib/hexapdf/digital_signature/cms_handler.rb +19 -2
- 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 +2 -2
- data/lib/hexapdf/digital_signature/signatures.rb +1 -1
- data/lib/hexapdf/digital_signature/signing/default_handler.rb +3 -3
- data/lib/hexapdf/digital_signature/signing/signed_data_creator.rb +2 -2
- data/lib/hexapdf/digital_signature/signing/timestamp_handler.rb +25 -5
- 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/annotations.rb +220 -0
- 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 +95 -16
- data/lib/hexapdf/document/metadata.rb +11 -4
- data/lib/hexapdf/document/pages.rb +1 -1
- data/lib/hexapdf/document.rb +52 -9
- 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 +4 -2
- data/lib/hexapdf/encryption/standard_security_handler.rb +40 -29
- data/lib/hexapdf/encryption.rb +1 -1
- data/lib/hexapdf/error.rb +12 -4
- 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 +59 -5
- data/lib/hexapdf/font/cmap.rb +18 -7
- data/lib/hexapdf/font/encoding/base.rb +28 -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 +7 -2
- data/lib/hexapdf/font/true_type.rb +1 -1
- data/lib/hexapdf/font/true_type_wrapper.rb +51 -16
- 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 +3 -4
- 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 +2 -2
- data/lib/hexapdf/layout/box.rb +6 -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 +64 -29
- 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 +133 -22
- data/lib/hexapdf/layout/table_box.rb +86 -14
- data/lib/hexapdf/layout/text_box.rb +1 -1
- data/lib/hexapdf/layout/text_fragment.rb +13 -2
- 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 +4 -4
- data/lib/hexapdf/parser.rb +36 -7
- data/lib/hexapdf/pdf_array.rb +26 -4
- data/lib/hexapdf/rectangle.rb +1 -1
- data/lib/hexapdf/reference.rb +2 -2
- data/lib/hexapdf/revision.rb +7 -3
- data/lib/hexapdf/revisions.rb +1 -1
- data/lib/hexapdf/serializer.rb +8 -8
- data/lib/hexapdf/stream.rb +1 -1
- data/lib/hexapdf/task/dereference.rb +1 -1
- data/lib/hexapdf/task/merge_acro_form.rb +164 -0
- data/lib/hexapdf/task/optimize.rb +5 -5
- data/lib/hexapdf/task/pdfa.rb +1 -1
- data/lib/hexapdf/task.rb +2 -1
- data/lib/hexapdf/test_utils.rb +3 -2
- data/lib/hexapdf/tokenizer.rb +52 -44
- data/lib/hexapdf/type/acro_form/appearance_generator.rb +66 -13
- 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 +6 -2
- data/lib/hexapdf/type/acro_form/form.rb +23 -32
- data/lib/hexapdf/type/acro_form/java_script_actions.rb +10 -3
- data/lib/hexapdf/type/acro_form/signature_field.rb +19 -8
- data/lib/hexapdf/type/acro_form/text_field.rb +10 -3
- data/lib/hexapdf/type/acro_form/variable_text_field.rb +13 -5
- 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 +2 -1
- data/lib/hexapdf/type/actions/go_to_r.rb +2 -1
- data/lib/hexapdf/type/actions/launch.rb +6 -2
- 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 +78 -3
- data/lib/hexapdf/type/annotations/appearance_generator.rb +426 -0
- data/lib/hexapdf/type/annotations/border_effect.rb +99 -0
- data/lib/hexapdf/type/annotations/border_styling.rb +160 -0
- data/lib/hexapdf/type/annotations/circle.rb +65 -0
- data/lib/hexapdf/type/annotations/interior_color.rb +84 -0
- data/lib/hexapdf/type/annotations/line.rb +334 -0
- data/lib/hexapdf/type/annotations/line_ending_styling.rb +208 -0
- data/lib/hexapdf/type/annotations/link.rb +1 -1
- data/lib/hexapdf/type/annotations/markup_annotation.rb +15 -3
- data/lib/hexapdf/type/annotations/polygon.rb +64 -0
- data/lib/hexapdf/type/annotations/polygon_polyline.rb +109 -0
- data/lib/hexapdf/type/annotations/polyline.rb +64 -0
- data/lib/hexapdf/type/annotations/square.rb +65 -0
- data/lib/hexapdf/type/annotations/square_circle.rb +77 -0
- data/lib/hexapdf/type/annotations/text.rb +1 -1
- data/lib/hexapdf/type/annotations/widget.rb +56 -118
- data/lib/hexapdf/type/annotations.rb +13 -1
- data/lib/hexapdf/type/catalog.rb +5 -2
- data/lib/hexapdf/type/cid_font.rb +6 -3
- data/lib/hexapdf/type/cmap.rb +58 -0
- data/lib/hexapdf/type/embedded_file.rb +1 -1
- data/lib/hexapdf/type/file_specification.rb +18 -15
- data/lib/hexapdf/type/font.rb +1 -1
- data/lib/hexapdf/type/font_descriptor.rb +5 -4
- data/lib/hexapdf/type/font_simple.rb +4 -2
- data/lib/hexapdf/type/font_true_type.rb +3 -1
- data/lib/hexapdf/type/font_type0.rb +2 -2
- data/lib/hexapdf/type/font_type1.rb +19 -1
- data/lib/hexapdf/type/font_type3.rb +1 -2
- data/lib/hexapdf/type/form.rb +8 -5
- data/lib/hexapdf/type/graphics_state_parameter.rb +8 -5
- data/lib/hexapdf/type/icon_fit.rb +1 -1
- data/lib/hexapdf/type/image.rb +9 -5
- data/lib/hexapdf/type/info.rb +3 -3
- data/lib/hexapdf/type/mark_information.rb +3 -3
- data/lib/hexapdf/type/marked_content_reference.rb +59 -0
- data/lib/hexapdf/type/measure.rb +57 -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 +2 -2
- data/lib/hexapdf/type/optional_content_group.rb +1 -1
- data/lib/hexapdf/type/optional_content_membership.rb +2 -2
- 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 +6 -4
- 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 +13 -9
- 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 +5 -4
- data/lib/hexapdf/type/xref_stream.rb +1 -1
- data/lib/hexapdf/type.rb +8 -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 +17 -4
- data/lib/hexapdf/utils.rb +1 -1
- data/lib/hexapdf/version.rb +2 -2
- data/lib/hexapdf/writer.rb +3 -2
- data/lib/hexapdf/xref_section.rb +25 -6
- data/lib/hexapdf.rb +1 -1
- data/test/data/standard-security-handler/bothpwd-aes-256bit-V5-R5.pdf +43 -0
- data/test/data/standard-security-handler/nopwd-aes-256bit-V5-R5.pdf +44 -0
- data/test/data/standard-security-handler/ownerpwd-aes-256bit-V5-R5.pdf +43 -0
- data/test/data/standard-security-handler/userpwd-aes-256bit-V5-R5.pdf +0 -0
- data/test/hexapdf/common_tokenizer_tests.rb +7 -7
- data/test/hexapdf/content/test_graphics_state.rb +2 -3
- data/test/hexapdf/content/test_operator.rb +4 -5
- data/test/hexapdf/digital_signature/common.rb +6 -1
- data/test/hexapdf/digital_signature/signing/test_default_handler.rb +6 -1
- data/test/hexapdf/digital_signature/signing/test_timestamp_handler.rb +12 -0
- data/test/hexapdf/digital_signature/test_cms_handler.rb +25 -15
- data/test/hexapdf/digital_signature/test_handler.rb +2 -3
- data/test/hexapdf/digital_signature/test_pkcs1_handler.rb +1 -2
- data/test/hexapdf/digital_signature/test_signature.rb +7 -0
- data/test/hexapdf/digital_signature/test_signatures.rb +12 -7
- data/test/hexapdf/document/test_annotations.rb +75 -0
- data/test/hexapdf/document/test_layout.rb +38 -10
- data/test/hexapdf/document/test_metadata.rb +13 -1
- 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 +8 -6
- data/test/hexapdf/encryption/test_standard_security_handler.rb +7 -3
- 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 +73 -16
- data/test/hexapdf/font/encoding/test_base.rb +20 -0
- data/test/hexapdf/font/encoding/test_glyph_list.rb +1 -1
- data/test/hexapdf/font/test_true_type_wrapper.rb +31 -5
- data/test/hexapdf/font/test_type1_wrapper.rb +8 -1
- data/test/hexapdf/font/true_type/test_table.rb +12 -0
- data/test/hexapdf/layout/test_box.rb +8 -2
- data/test/hexapdf/layout/test_container_box.rb +34 -6
- data/test/hexapdf/layout/test_list_box.rb +7 -7
- data/test/hexapdf/layout/test_page_style.rb +1 -1
- data/test/hexapdf/layout/test_style.rb +46 -12
- data/test/hexapdf/layout/test_table_box.rb +66 -16
- data/test/hexapdf/layout/test_text_box.rb +0 -6
- data/test/hexapdf/layout/test_text_fragment.rb +3 -3
- data/test/hexapdf/layout/test_text_layouter.rb +4 -2
- data/test/hexapdf/task/test_merge_acro_form.rb +104 -0
- data/test/hexapdf/task/test_optimize.rb +3 -1
- data/test/hexapdf/test_composer.rb +15 -0
- data/test/hexapdf/test_dictionary.rb +15 -0
- data/test/hexapdf/test_dictionary_fields.rb +1 -0
- data/test/hexapdf/test_document.rb +26 -8
- data/test/hexapdf/test_filter.rb +1 -1
- data/test/hexapdf/test_importer.rb +7 -0
- data/test/hexapdf/test_object.rb +1 -1
- data/test/hexapdf/test_parser.rb +87 -18
- data/test/hexapdf/test_pdf_array.rb +36 -3
- data/test/hexapdf/test_revision.rb +27 -6
- data/test/hexapdf/test_revisions.rb +1 -1
- data/test/hexapdf/test_serializer.rb +4 -4
- data/test/hexapdf/test_stream.rb +1 -2
- data/test/hexapdf/test_tokenizer.rb +1 -1
- data/test/hexapdf/test_writer.rb +22 -8
- data/test/hexapdf/test_xref_section.rb +15 -0
- data/test/hexapdf/type/acro_form/test_appearance_generator.rb +118 -26
- data/test/hexapdf/type/acro_form/test_button_field.rb +7 -6
- data/test/hexapdf/type/acro_form/test_field.rb +10 -0
- data/test/hexapdf/type/acro_form/test_form.rb +32 -9
- data/test/hexapdf/type/acro_form/test_java_script_actions.rb +21 -0
- data/test/hexapdf/type/acro_form/test_signature_field.rb +3 -1
- data/test/hexapdf/type/acro_form/test_text_field.rb +7 -1
- data/test/hexapdf/type/acro_form/test_variable_text_field.rb +14 -1
- data/test/hexapdf/type/actions/test_launch.rb +6 -2
- data/test/hexapdf/type/annotations/test_appearance_generator.rb +608 -0
- data/test/hexapdf/type/annotations/test_border_effect.rb +59 -0
- data/test/hexapdf/type/annotations/test_border_styling.rb +114 -0
- data/test/hexapdf/type/annotations/test_interior_color.rb +37 -0
- data/test/hexapdf/type/annotations/test_line.rb +144 -0
- data/test/hexapdf/type/annotations/test_line_ending_styling.rb +42 -0
- data/test/hexapdf/type/annotations/test_polygon_polyline.rb +29 -0
- data/test/hexapdf/type/annotations/test_widget.rb +47 -81
- data/test/hexapdf/type/test_annotation.rb +58 -0
- data/test/hexapdf/type/test_font_type1.rb +20 -1
- data/test/hexapdf/type/test_form.rb +7 -1
- data/test/hexapdf/type/test_image.rb +1 -1
- data/test/hexapdf/type/test_page.rb +7 -1
- data/test/hexapdf/type/test_page_tree_node.rb +2 -2
- data/test/hexapdf/type/test_resources.rb +3 -1
- data/test/hexapdf/utils/test_sorted_tree_node.rb +18 -7
- data/test/test_helper.rb +7 -0
- metadata +69 -9
data/lib/hexapdf/cli.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
|
|
@@ -49,6 +49,7 @@ require 'hexapdf/cli/image2pdf'
|
|
|
49
49
|
require 'hexapdf/cli/form'
|
|
50
50
|
require 'hexapdf/cli/fonts'
|
|
51
51
|
require 'hexapdf/cli/usage'
|
|
52
|
+
require 'hexapdf/cli/debug_info'
|
|
52
53
|
require 'hexapdf/version'
|
|
53
54
|
require 'hexapdf/document'
|
|
54
55
|
|
|
@@ -61,11 +62,27 @@ module HexaPDF
|
|
|
61
62
|
# Runs the CLI application.
|
|
62
63
|
def self.run(args = ARGV)
|
|
63
64
|
Application.new.parse(args)
|
|
65
|
+
rescue Errno::ENOENT => e
|
|
66
|
+
path = e.message.scan(/(?<= - ).*?$/).first
|
|
67
|
+
$stderr.puts "Problem encountered: No such file - #{path}"
|
|
64
68
|
rescue StandardError => e
|
|
65
69
|
$stderr.puts "Problem encountered: #{e.message}"
|
|
66
70
|
unless e.kind_of?(HexaPDF::Error)
|
|
71
|
+
$stderr.puts "Backtrace (last 10 lines):"
|
|
72
|
+
$stderr.puts e.backtrace[0, 10]
|
|
73
|
+
$stderr.puts
|
|
67
74
|
$stderr.puts "--> The problem might indicate a faulty PDF or a bug in HexaPDF."
|
|
68
|
-
$stderr.puts "--> Please report this at
|
|
75
|
+
$stderr.puts "--> Please report this at"
|
|
76
|
+
$stderr.puts "-->"
|
|
77
|
+
$stderr.puts "--> https://github.com/gettalong/hexapdf/issues"
|
|
78
|
+
$stderr.puts "-->"
|
|
79
|
+
$stderr.puts "--> and include the information above as well as the output of running"
|
|
80
|
+
$stderr.puts "--> the following command on the input PDF:"
|
|
81
|
+
$stderr.puts "-->"
|
|
82
|
+
$stderr.puts "--> hexapdf info --check INPUT.PDF"
|
|
83
|
+
$stderr.puts "-->"
|
|
84
|
+
$stderr.puts "--> If possible, please also provide the input PDF."
|
|
85
|
+
$stderr.puts "--> Thanks!"
|
|
69
86
|
end
|
|
70
87
|
exit(1)
|
|
71
88
|
end
|
|
@@ -109,6 +126,7 @@ module HexaPDF
|
|
|
109
126
|
add_command(HexaPDF::CLI::Form.new)
|
|
110
127
|
add_command(HexaPDF::CLI::Fonts.new)
|
|
111
128
|
add_command(HexaPDF::CLI::Usage.new)
|
|
129
|
+
add_command(HexaPDF::CLI::DebugInfo.new)
|
|
112
130
|
add_command(CmdParse::HelpCommand.new)
|
|
113
131
|
version_command = CmdParse::VersionCommand.new(add_switches: false)
|
|
114
132
|
add_command(version_command)
|
data/lib/hexapdf/composer.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
|
|
@@ -231,6 +231,13 @@ module HexaPDF
|
|
|
231
231
|
@document.write(output, optimize: optimize, **options)
|
|
232
232
|
end
|
|
233
233
|
|
|
234
|
+
# Writes the created PDF document to a string and returns that string.
|
|
235
|
+
#
|
|
236
|
+
# See HexaPDF::Document#write for details.
|
|
237
|
+
def write_to_string(optimize: true, **options)
|
|
238
|
+
@document.write_to_string(optimize: optimize, **options)
|
|
239
|
+
end
|
|
240
|
+
|
|
234
241
|
# :call-seq:
|
|
235
242
|
# composer.style(name) -> style
|
|
236
243
|
# composer.style(name, base: :base, **properties) -> style
|
|
@@ -254,6 +261,20 @@ module HexaPDF
|
|
|
254
261
|
@document.layout.style(name, base: base, **properties)
|
|
255
262
|
end
|
|
256
263
|
|
|
264
|
+
# Returns +true+ if a style with the given +name+ exists, else +false+.
|
|
265
|
+
#
|
|
266
|
+
# See HexaPDF::Document::Layout#style for details; this method is just a thin wrapper around
|
|
267
|
+
# that method.
|
|
268
|
+
#
|
|
269
|
+
# Example:
|
|
270
|
+
#
|
|
271
|
+
# composer.style(:header, font: 'Helvetica')
|
|
272
|
+
# composer.style?(:header) # => true
|
|
273
|
+
# composer.style?(:paragraph) # => false
|
|
274
|
+
def style?(name)
|
|
275
|
+
@document.layout.style?(name)
|
|
276
|
+
end
|
|
277
|
+
|
|
257
278
|
# :call-seq:
|
|
258
279
|
# composer.styles -> styles
|
|
259
280
|
# composer.styles(**mapping) -> styles
|
|
@@ -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
|
|
@@ -182,6 +182,16 @@ module HexaPDF
|
|
|
182
182
|
# acro_form.default_font_size::
|
|
183
183
|
# A number specifying the default font size of AcroForm text fields which should be auto-sized.
|
|
184
184
|
#
|
|
185
|
+
# acro_form.fallback_default_appearance::
|
|
186
|
+
# A hash containging arguments for
|
|
187
|
+
# HexaPDF::Type::AcroForm::VariableTextField#set_defaut_appearance_string which is used as
|
|
188
|
+
# fallback for fields without a default appearance.
|
|
189
|
+
#
|
|
190
|
+
# If this value is set to +nil+, an error is raised in case a variable text field cannot
|
|
191
|
+
# resolve a default appearance string.
|
|
192
|
+
#
|
|
193
|
+
# The default is the empty hash meaning the defaults from the method are used.
|
|
194
|
+
#
|
|
185
195
|
# acro_form.fallback_font::
|
|
186
196
|
# The font that should be used when a variable text field references a font that cannot be used.
|
|
187
197
|
#
|
|
@@ -214,6 +224,21 @@ module HexaPDF
|
|
|
214
224
|
# acro_form.text_field.default_width::
|
|
215
225
|
# A number specifying the default width of AcroForm text fields which should be auto-sized.
|
|
216
226
|
#
|
|
227
|
+
# acro_form.text_field.on_max_len_exceeded::
|
|
228
|
+
# Callback hook when the value of a text field exceeds the set maximum length.
|
|
229
|
+
#
|
|
230
|
+
# The value needs to be an object that responds to \#call(field, value) where +field+ is the
|
|
231
|
+
# AcroForm text field on which the value is set and +value+ is the invalid value. The returned
|
|
232
|
+
# value is used instead of the invalid value.
|
|
233
|
+
#
|
|
234
|
+
# The default implementation raises an error.
|
|
235
|
+
#
|
|
236
|
+
# annotation.appearance_generator::
|
|
237
|
+
# The class that should be used for generating appearances for annotations. If the value is a
|
|
238
|
+
# String, it should contain the name of a constant to such a class.
|
|
239
|
+
#
|
|
240
|
+
# See HexaPDF::Type::Annotations::AppearanceGenerator
|
|
241
|
+
#
|
|
217
242
|
# debug::
|
|
218
243
|
# If set to +true+, enables debug output.
|
|
219
244
|
#
|
|
@@ -349,6 +374,11 @@ module HexaPDF
|
|
|
349
374
|
# The default implementation returns an object of class HexaPDF::Font::InvalidGlyph which, when
|
|
350
375
|
# not removed before encoding, will raise a HexaPDF::MissingGlyphError.
|
|
351
376
|
#
|
|
377
|
+
# Note: The 'font.on_invalid_glyph' configuration option does something similar but is used
|
|
378
|
+
# later and only by the layout engine. If this callback hook returns an invalid glyph instance,
|
|
379
|
+
# the 'font.on_invalid_glyph' callback hook is invoked when using the layout engine and it can
|
|
380
|
+
# return a substitute glyph in any font.
|
|
381
|
+
#
|
|
352
382
|
# If a replacement glyph should be displayed instead of an error, the following provides a good
|
|
353
383
|
# starting implementation:
|
|
354
384
|
#
|
|
@@ -485,12 +515,17 @@ module HexaPDF
|
|
|
485
515
|
Configuration.new('acro_form.appearance_generator' => 'HexaPDF::Type::AcroForm::AppearanceGenerator',
|
|
486
516
|
'acro_form.create_appearances' => true,
|
|
487
517
|
'acro_form.default_font_size' => 10,
|
|
518
|
+
'acro_form.fallback_default_appearance' => {},
|
|
488
519
|
'acro_form.fallback_font' => 'Helvetica',
|
|
489
520
|
'acro_form.on_invalid_value' => proc do |field, value|
|
|
490
521
|
raise HexaPDF::Error, "Invalid value #{value.inspect} for " \
|
|
491
522
|
"#{field.concrete_field_type} field named '#{field.full_field_name}'"
|
|
492
523
|
end,
|
|
493
524
|
'acro_form.text_field.default_width' => 100,
|
|
525
|
+
'acro_form.text_field.on_max_len_exceeded' => proc do |field, value|
|
|
526
|
+
raise HexaPDF::Error, "Value exceeds maximum allowed length of #{field[:MaxLen]}"
|
|
527
|
+
end,
|
|
528
|
+
'annotation.appearance_generator' => 'HexaPDF::Type::Annotations::AppearanceGenerator',
|
|
494
529
|
'debug' => false,
|
|
495
530
|
'document.auto_decrypt' => true,
|
|
496
531
|
'document.on_invalid_string' => proc do |str|
|
|
@@ -587,6 +622,7 @@ module HexaPDF
|
|
|
587
622
|
optimize: 'HexaPDF::Task::Optimize',
|
|
588
623
|
dereference: 'HexaPDF::Task::Dereference',
|
|
589
624
|
pdfa: 'HexaPDF::Task::PDFA',
|
|
625
|
+
merge_acro_form: 'HexaPDF::Task::MergeAcroForm',
|
|
590
626
|
})
|
|
591
627
|
|
|
592
628
|
# The global configuration object, providing the following options:
|
|
@@ -678,6 +714,7 @@ module HexaPDF
|
|
|
678
714
|
XXAcroFormField: 'HexaPDF::Type::AcroForm::Field',
|
|
679
715
|
XXAppearanceDictionary: 'HexaPDF::Type::Annotation::AppearanceDictionary',
|
|
680
716
|
Border: 'HexaPDF::Type::Annotation::Border',
|
|
717
|
+
XXBorderEffect: 'HexaPDF::Type::Annotation::BorderEffect',
|
|
681
718
|
SigFieldLock: 'HexaPDF::Type::AcroForm::SignatureField::LockDictionary',
|
|
682
719
|
SV: 'HexaPDF::Type::AcroForm::SignatureField::SeedValueDictionary',
|
|
683
720
|
SVCert: 'HexaPDF::Type::AcroForm::SignatureField::CertificateSeedValueDictionary',
|
|
@@ -709,6 +746,14 @@ module HexaPDF
|
|
|
709
746
|
Metadata: 'HexaPDF::Type::Metadata',
|
|
710
747
|
OutputIntent: 'HexaPDF::Type::OutputIntent',
|
|
711
748
|
XXDestOutputProfileRef: 'HexaPDF::Type::OutputIntent::DestOutputProfileRef',
|
|
749
|
+
ExData: 'HexaPDF::Type::Annotations::MarkupAnnotation::ExData',
|
|
750
|
+
CMap: 'HexaPDF::Type::CMap',
|
|
751
|
+
StructTreeRoot: 'HexaPDF::Type::StructTreeRoot',
|
|
752
|
+
StructElem: 'HexaPDF::Type::StructElem',
|
|
753
|
+
Namespace: 'HexaPDF::Type::Namespace',
|
|
754
|
+
MCR: 'HexaPDF::Type::MarkedContentReference',
|
|
755
|
+
OBJR: 'HexaPDF::Type::ObjectReference',
|
|
756
|
+
Measure: 'HexaPDF::Type::Measure',
|
|
712
757
|
},
|
|
713
758
|
'object.subtype_map' => {
|
|
714
759
|
nil => {
|
|
@@ -727,6 +772,11 @@ module HexaPDF
|
|
|
727
772
|
Text: 'HexaPDF::Type::Annotations::Text',
|
|
728
773
|
Link: 'HexaPDF::Type::Annotations::Link',
|
|
729
774
|
Widget: 'HexaPDF::Type::Annotations::Widget',
|
|
775
|
+
Line: 'HexaPDF::Type::Annotations::Line',
|
|
776
|
+
Square: 'HexaPDF::Type::Annotations::Square',
|
|
777
|
+
Circle: 'HexaPDF::Type::Annotations::Circle',
|
|
778
|
+
Polygon: 'HexaPDF::Type::Annotations::Polygon',
|
|
779
|
+
PolyLine: 'HexaPDF::Type::Annotations::Polyline',
|
|
730
780
|
XML: 'HexaPDF::Type::Metadata',
|
|
731
781
|
GTS_PDFX: 'HexaPDF::Type::OutputIntent',
|
|
732
782
|
GTS_PDFA1: 'HexaPDF::Type::OutputIntent',
|
|
@@ -755,6 +805,11 @@ module HexaPDF
|
|
|
755
805
|
Text: 'HexaPDF::Type::Annotations::Text',
|
|
756
806
|
Link: 'HexaPDF::Type::Annotations::Link',
|
|
757
807
|
Widget: 'HexaPDF::Type::Annotations::Widget',
|
|
808
|
+
Line: 'HexaPDF::Type::Annotations::Line',
|
|
809
|
+
Square: 'HexaPDF::Type::Annotations::Square',
|
|
810
|
+
Circle: 'HexaPDF::Type::Annotations::Circle',
|
|
811
|
+
Polygon: 'HexaPDF::Type::Annotations::Polygon',
|
|
812
|
+
PolyLine: 'HexaPDF::Type::Annotations::Polyline',
|
|
758
813
|
},
|
|
759
814
|
XXAcroFormField: {
|
|
760
815
|
Tx: 'HexaPDF::Type::AcroForm::TextField',
|
|
@@ -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
|
|
@@ -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
|
|
@@ -255,7 +255,7 @@ module HexaPDF
|
|
|
255
255
|
array.inject(0) {|m, n| m < 0 ? m : (n < 0 ? -1 : m + n) } <= 0)
|
|
256
256
|
raise ArgumentError, "Invalid line dash pattern: #{array.inspect} #{phase.inspect}"
|
|
257
257
|
end
|
|
258
|
-
@array = array
|
|
258
|
+
@array = array
|
|
259
259
|
@phase = phase
|
|
260
260
|
end
|
|
261
261
|
|
|
@@ -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
|
|
@@ -84,44 +84,43 @@ module HexaPDF
|
|
|
84
84
|
# See: HexaPDF::Tokenizer#next_token
|
|
85
85
|
def next_token
|
|
86
86
|
@ss.skip(WHITESPACE_MULTI_RE)
|
|
87
|
-
byte = @
|
|
88
|
-
|
|
87
|
+
case (byte = @ss.scan_byte || -1)
|
|
88
|
+
when 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57 # + - . 0..9
|
|
89
|
+
@ss.pos -= 1
|
|
89
90
|
parse_number
|
|
90
|
-
|
|
91
|
-
parse_keyword
|
|
92
|
-
elsif byte == 47 # /
|
|
91
|
+
when 47 # /
|
|
93
92
|
parse_name
|
|
94
|
-
|
|
93
|
+
when 40 # (
|
|
95
94
|
parse_literal_string
|
|
96
|
-
|
|
97
|
-
if @
|
|
98
|
-
@ss.pos +=
|
|
95
|
+
when 60 # <
|
|
96
|
+
if @ss.peek_byte == 60
|
|
97
|
+
@ss.pos += 1
|
|
99
98
|
TOKEN_DICT_START
|
|
100
99
|
else
|
|
101
100
|
parse_hex_string
|
|
102
101
|
end
|
|
103
|
-
|
|
104
|
-
unless @
|
|
105
|
-
raise HexaPDF::MalformedPDFError.new("Delimiter '>' found at invalid position", pos: pos)
|
|
102
|
+
when 62 # >
|
|
103
|
+
unless @ss.scan_byte == 62
|
|
104
|
+
raise HexaPDF::MalformedPDFError.new("Delimiter '>' found at invalid position", pos: pos - 1)
|
|
106
105
|
end
|
|
107
|
-
@ss.pos += 2
|
|
108
106
|
TOKEN_DICT_END
|
|
109
|
-
|
|
110
|
-
@ss.pos += 1
|
|
107
|
+
when 91 # [
|
|
111
108
|
TOKEN_ARRAY_START
|
|
112
|
-
|
|
113
|
-
@ss.pos += 1
|
|
109
|
+
when 93 # ]
|
|
114
110
|
TOKEN_ARRAY_END
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
111
|
+
when 41 # )
|
|
112
|
+
raise HexaPDF::MalformedPDFError.new("Delimiter ')' found at invalid position", pos: pos - 1)
|
|
113
|
+
when 123, 125 # { } )
|
|
114
|
+
Token.new(byte.chr.b)
|
|
115
|
+
when 37 # %
|
|
118
116
|
unless @ss.skip_until(/(?=[\r\n])/)
|
|
119
117
|
(@raise_on_eos ? (raise StopIteration) : (return NO_MORE_TOKENS))
|
|
120
118
|
end
|
|
121
119
|
next_token
|
|
122
|
-
|
|
120
|
+
when -1
|
|
123
121
|
@raise_on_eos ? raise(StopIteration) : NO_MORE_TOKENS
|
|
124
122
|
else
|
|
123
|
+
@ss.pos -= 1
|
|
125
124
|
parse_keyword
|
|
126
125
|
end
|
|
127
126
|
end
|
|
@@ -133,7 +132,7 @@ module HexaPDF
|
|
|
133
132
|
if (val = @ss.scan(/[+-]?(?:\d+\.\d*|\.\d+)/))
|
|
134
133
|
val << '0' if val.getbyte(-1) == 46 # dot '.'
|
|
135
134
|
Float(val)
|
|
136
|
-
elsif (val = @ss.
|
|
135
|
+
elsif (val = @ss.scan_integer)
|
|
137
136
|
val.to_i
|
|
138
137
|
else
|
|
139
138
|
parse_keyword
|
|
@@ -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/content.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/data_dir.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/dictionary.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
|
|
@@ -301,7 +301,13 @@ module HexaPDF
|
|
|
301
301
|
yield(msg, true)
|
|
302
302
|
self[name] = obj.intern
|
|
303
303
|
else
|
|
304
|
-
yield(msg,
|
|
304
|
+
yield(msg, !field.required? || field.default?)
|
|
305
|
+
if field.required? && field.default?
|
|
306
|
+
self[name] = obj = field.default
|
|
307
|
+
else
|
|
308
|
+
delete(name)
|
|
309
|
+
next
|
|
310
|
+
end
|
|
305
311
|
end
|
|
306
312
|
end
|
|
307
313
|
|
|
@@ -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
|
|
@@ -313,7 +313,7 @@ module HexaPDF
|
|
|
313
313
|
[String, Time, Date, DateTime]
|
|
314
314
|
end
|
|
315
315
|
|
|
316
|
-
DATE_RE = /\AD:(\d{4})(\d\d)?(\d\d)?(\d\d)?(\d\d)?(\d\d)?([Z+-])?(?:(\d+)(?:'|'(\d+)'?|\z)?)?\z/n # :nodoc:
|
|
316
|
+
DATE_RE = /\AD:(\d{4})(\d\d)?(\d\d)?(\d\d)?(\d\d)?(\d\d)?([Z+-])?(?:(\d+)(?:'|'(\d+)'?'?|\z)?)?\z/n # :nodoc:
|
|
317
317
|
|
|
318
318
|
# Checks if the given object is a string and converts into a Time object if possible.
|
|
319
319
|
# Otherwise returns +nil+.
|
|
@@ -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
|
|
@@ -49,7 +49,11 @@ module HexaPDF
|
|
|
49
49
|
# Creates a new signature handler for the given signature dictionary.
|
|
50
50
|
def initialize(signature_dict)
|
|
51
51
|
super
|
|
52
|
-
|
|
52
|
+
begin
|
|
53
|
+
@pkcs7 = OpenSSL::PKCS7.new(signature_dict.contents)
|
|
54
|
+
rescue
|
|
55
|
+
raise HexaPDF::Error, "Signature contents is invalid"
|
|
56
|
+
end
|
|
53
57
|
end
|
|
54
58
|
|
|
55
59
|
# Returns the common name of the signer.
|
|
@@ -155,6 +159,19 @@ module HexaPDF
|
|
|
155
159
|
result.log(:error, "Signature verification failed")
|
|
156
160
|
end
|
|
157
161
|
|
|
162
|
+
certs = [signer_certificate]
|
|
163
|
+
cur_cert = certs.first
|
|
164
|
+
while true
|
|
165
|
+
cur_cert = certificate_chain.find {|cert| cert.subject == cur_cert.issuer }
|
|
166
|
+
if cur_cert && !certs.include?(cur_cert)
|
|
167
|
+
certs << cur_cert
|
|
168
|
+
else
|
|
169
|
+
break
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
cert_subjects = certs.map {|cert| cert.subject.to_a.assoc("CN")&.[](1) }
|
|
173
|
+
result.log(:info, "Certificate chain: #{cert_subjects.join(" -> ")}")
|
|
174
|
+
|
|
158
175
|
result
|
|
159
176
|
end
|
|
160
177
|
|
|
@@ -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
|
|
@@ -211,7 +211,7 @@ module HexaPDF
|
|
|
211
211
|
data = ''.b
|
|
212
212
|
self[:ByteRange]&.each_slice(2) do |offset, length|
|
|
213
213
|
io.pos = offset
|
|
214
|
-
data << io.read(length)
|
|
214
|
+
data << io.read(length).to_s
|
|
215
215
|
end
|
|
216
216
|
data
|
|
217
217
|
end
|
|
@@ -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
|
|
@@ -289,6 +289,7 @@ module HexaPDF
|
|
|
289
289
|
signature[:Location] = location if location
|
|
290
290
|
signature[:ContactInfo] = contact_info if contact_info
|
|
291
291
|
signature[:Prop_Build] = {App: {Name: :HexaPDF, REx: HexaPDF::VERSION}}
|
|
292
|
+
signature.document.version = '2.0' if signature_type == :pades
|
|
292
293
|
|
|
293
294
|
if doc_mdp_permissions
|
|
294
295
|
doc = signature.document
|
|
@@ -296,8 +297,7 @@ module HexaPDF
|
|
|
296
297
|
raise HexaPDF::Error, "Can set DocMDP access permissions only on first signature"
|
|
297
298
|
end
|
|
298
299
|
params = doc.add({Type: :TransformParams, V: :'1.2', P: doc_mdp_permissions})
|
|
299
|
-
sigref = doc.add({Type: :SigRef, TransformMethod: :DocMDP,
|
|
300
|
-
TransformParams: params})
|
|
300
|
+
sigref = doc.add({Type: :SigRef, TransformMethod: :DocMDP, TransformParams: params})
|
|
301
301
|
signature[:Reference] = [sigref]
|
|
302
302
|
(doc.catalog[:Perms] ||= {})[:DocMDP] = signature
|
|
303
303
|
end
|
|
@@ -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
|
|
@@ -108,7 +108,7 @@ module HexaPDF
|
|
|
108
108
|
# +type+::
|
|
109
109
|
# The type can either be :cms when creating standard PDF CMS signatures or :pades when
|
|
110
110
|
# creating PAdES compatible signatures. PAdES signatures are part of PDF 2.0.
|
|
111
|
-
def create(data, type: :cms, &block) # :yield:
|
|
111
|
+
def create(data, type: :cms, &block) # :yield: digest_algorithm, hashed_data
|
|
112
112
|
signed_attrs = create_signed_attrs(data, signing_time: (type == :cms))
|
|
113
113
|
signature = digest_and_sign_data(set(*signed_attrs.value).to_der, &block)
|
|
114
114
|
unsigned_attrs = create_unsigned_attrs(signature)
|