hexapdf 0.11.9 → 0.13.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 +157 -0
- data/LICENSE +1 -1
- data/examples/001-hello_world.rb +1 -1
- data/examples/002-graphics.rb +1 -1
- data/examples/003-arcs.rb +1 -1
- data/examples/004-optimizing.rb +1 -1
- data/examples/005-merging.rb +1 -1
- data/examples/006-standard_pdf_fonts.rb +1 -1
- data/examples/007-truetype.rb +1 -1
- data/examples/008-show_char_bboxes.rb +1 -1
- data/examples/009-text_layouter_alignment.rb +1 -1
- data/examples/010-text_layouter_inline_boxes.rb +1 -1
- data/examples/011-text_layouter_line_wrapping.rb +1 -1
- data/examples/012-text_layouter_styling.rb +1 -1
- data/examples/013-text_layouter_shapes.rb +1 -1
- data/examples/014-text_in_polygon.rb +1 -1
- data/examples/015-boxes.rb +1 -1
- data/examples/016-frame_automatic_box_placement.rb +1 -1
- data/examples/017-frame_text_flow.rb +1 -1
- data/examples/018-composer.rb +1 -1
- data/examples/019-acro_form.rb +51 -0
- data/lib/hexapdf.rb +1 -1
- data/lib/hexapdf/cli.rb +3 -1
- data/lib/hexapdf/cli/batch.rb +1 -1
- data/lib/hexapdf/cli/command.rb +22 -11
- data/lib/hexapdf/cli/files.rb +1 -1
- data/lib/hexapdf/cli/form.rb +240 -0
- data/lib/hexapdf/cli/image2pdf.rb +3 -2
- data/lib/hexapdf/cli/images.rb +1 -1
- data/lib/hexapdf/cli/info.rb +52 -3
- data/lib/hexapdf/cli/inspect.rb +31 -9
- data/lib/hexapdf/cli/merge.rb +2 -2
- 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/composer.rb +2 -2
- data/lib/hexapdf/configuration.rb +81 -11
- data/lib/hexapdf/content.rb +3 -1
- data/lib/hexapdf/content/canvas.rb +5 -18
- data/lib/hexapdf/content/color_space.rb +111 -32
- data/lib/hexapdf/content/graphic_object.rb +1 -1
- data/lib/hexapdf/content/graphic_object/arc.rb +4 -4
- 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/graphics_state.rb +1 -1
- data/lib/hexapdf/content/operator.rb +9 -9
- data/lib/hexapdf/content/parser.rb +18 -5
- data/lib/hexapdf/content/processor.rb +1 -1
- data/lib/hexapdf/content/transformation_matrix.rb +1 -1
- data/lib/hexapdf/data_dir.rb +1 -1
- data/lib/hexapdf/dictionary.rb +5 -5
- data/lib/hexapdf/dictionary_fields.rb +2 -10
- data/lib/hexapdf/document.rb +45 -17
- data/lib/hexapdf/document/files.rb +1 -2
- data/lib/hexapdf/document/fonts.rb +1 -1
- data/lib/hexapdf/document/images.rb +1 -1
- data/lib/hexapdf/document/pages.rb +3 -14
- data/lib/hexapdf/encryption.rb +1 -1
- data/lib/hexapdf/encryption/aes.rb +1 -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 +2 -2
- 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 +2 -1
- data/lib/hexapdf/encryption/standard_security_handler.rb +2 -1
- data/lib/hexapdf/error.rb +1 -1
- data/lib/hexapdf/filter.rb +3 -3
- data/lib/hexapdf/filter/ascii85_decode.rb +1 -1
- data/lib/hexapdf/filter/ascii_hex_decode.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/{jpx_decode.rb → pass_through.rb} +5 -5
- data/lib/hexapdf/filter/predictor.rb +1 -1
- data/lib/hexapdf/filter/run_length_decode.rb +1 -1
- data/lib/hexapdf/font/cmap.rb +2 -5
- data/lib/hexapdf/font/cmap/parser.rb +1 -1
- data/lib/hexapdf/font/cmap/writer.rb +1 -1
- data/lib/hexapdf/font/encoding.rb +1 -1
- data/lib/hexapdf/font/encoding/base.rb +9 -1
- data/lib/hexapdf/font/encoding/difference_encoding.rb +7 -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/invalid_glyph.rb +1 -1
- data/lib/hexapdf/font/true_type.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.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 +2 -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 +3 -1
- data/lib/hexapdf/font/true_type/table/post.rb +1 -1
- data/lib/hexapdf/font/true_type_wrapper.rb +54 -51
- data/lib/hexapdf/font/type1.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_wrapper.rb +68 -52
- data/lib/hexapdf/font_loader.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/image_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 +4 -3
- data/lib/hexapdf/importer.rb +2 -4
- data/lib/hexapdf/layout.rb +1 -1
- data/lib/hexapdf/layout/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 +2 -2
- data/lib/hexapdf/layout/numeric_refinements.rb +1 -1
- data/lib/hexapdf/layout/style.rb +24 -24
- 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 +1 -1
- data/lib/hexapdf/layout/text_shaper.rb +4 -3
- data/lib/hexapdf/layout/width_from_polygon.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 +32 -27
- data/lib/hexapdf/parser.rb +69 -6
- data/lib/hexapdf/pdf_array.rb +10 -3
- data/lib/hexapdf/rectangle.rb +31 -1
- data/lib/hexapdf/reference.rb +1 -1
- data/lib/hexapdf/revision.rb +2 -1
- data/lib/hexapdf/revisions.rb +30 -22
- data/lib/hexapdf/serializer.rb +2 -2
- data/lib/hexapdf/stream.rb +1 -1
- data/lib/hexapdf/task.rb +1 -1
- data/lib/hexapdf/task/dereference.rb +1 -1
- data/lib/hexapdf/task/optimize.rb +7 -5
- data/lib/hexapdf/tokenizer.rb +5 -4
- data/lib/hexapdf/type.rb +1 -1
- data/lib/hexapdf/type/acro_form.rb +7 -1
- data/lib/hexapdf/type/acro_form/appearance_generator.rb +405 -0
- data/lib/hexapdf/type/acro_form/button_field.rb +305 -0
- data/lib/hexapdf/type/acro_form/choice_field.rb +220 -0
- data/lib/hexapdf/type/acro_form/field.rb +250 -17
- data/lib/hexapdf/type/acro_form/form.rb +159 -7
- data/lib/hexapdf/type/acro_form/text_field.rb +187 -0
- data/lib/hexapdf/type/acro_form/variable_text_field.rb +122 -0
- data/lib/hexapdf/type/action.rb +1 -1
- data/lib/hexapdf/type/actions.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 +4 -3
- data/lib/hexapdf/type/annotation.rb +73 -3
- data/lib/hexapdf/type/annotations.rb +1 -1
- data/lib/hexapdf/type/annotations/link.rb +2 -2
- 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 +238 -2
- data/lib/hexapdf/type/catalog.rb +23 -3
- 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 +2 -2
- data/lib/hexapdf/type/font.rb +18 -1
- data/lib/hexapdf/type/font_descriptor.rb +2 -2
- data/lib/hexapdf/type/font_simple.rb +4 -2
- data/lib/hexapdf/type/font_true_type.rb +7 -3
- data/lib/hexapdf/type/font_type0.rb +2 -2
- data/lib/hexapdf/type/font_type1.rb +16 -1
- data/lib/hexapdf/type/font_type3.rb +1 -1
- data/lib/hexapdf/type/form.rb +12 -2
- 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 +5 -3
- data/lib/hexapdf/type/info.rb +1 -1
- data/lib/hexapdf/type/names.rb +1 -1
- data/lib/hexapdf/type/object_stream.rb +1 -1
- data/lib/hexapdf/type/page.rb +36 -12
- data/lib/hexapdf/type/page_tree_node.rb +37 -16
- data/lib/hexapdf/type/resources.rb +17 -3
- data/lib/hexapdf/type/trailer.rb +4 -6
- data/lib/hexapdf/type/viewer_preferences.rb +1 -1
- data/lib/hexapdf/type/xref_stream.rb +1 -1
- data/lib/hexapdf/utils/bit_field.rb +38 -24
- 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 +19 -16
- data/lib/hexapdf/version.rb +2 -2
- data/lib/hexapdf/writer.rb +1 -1
- data/lib/hexapdf/xref_section.rb +1 -1
- data/test/hexapdf/common_tokenizer_tests.rb +6 -1
- data/test/hexapdf/content/common.rb +2 -2
- data/test/hexapdf/content/graphic_object/test_arc.rb +4 -4
- data/test/hexapdf/content/test_canvas.rb +3 -3
- data/test/hexapdf/content/test_color_space.rb +71 -8
- data/test/hexapdf/content/test_operator.rb +22 -22
- data/test/hexapdf/content/test_parser.rb +14 -0
- data/test/hexapdf/document/test_fonts.rb +1 -1
- data/test/hexapdf/document/test_pages.rb +6 -6
- data/test/hexapdf/encryption/test_aes.rb +4 -4
- data/test/hexapdf/encryption/test_standard_security_handler.rb +11 -11
- data/test/hexapdf/filter/test_ascii85_decode.rb +1 -1
- data/test/hexapdf/filter/test_ascii_hex_decode.rb +1 -1
- data/test/hexapdf/font/encoding/test_base.rb +10 -0
- data/test/hexapdf/font/encoding/test_difference_encoding.rb +8 -0
- data/test/hexapdf/font/test_true_type_wrapper.rb +10 -7
- data/test/hexapdf/font/test_type1_wrapper.rb +33 -8
- data/test/hexapdf/layout/test_style.rb +1 -1
- data/test/hexapdf/layout/test_text_layouter.rb +3 -4
- data/test/hexapdf/test_configuration.rb +2 -2
- data/test/hexapdf/test_dictionary.rb +3 -1
- data/test/hexapdf/test_dictionary_fields.rb +2 -2
- data/test/hexapdf/test_document.rb +16 -4
- data/test/hexapdf/test_object.rb +44 -26
- data/test/hexapdf/test_parser.rb +125 -55
- data/test/hexapdf/test_pdf_array.rb +7 -0
- data/test/hexapdf/test_rectangle.rb +14 -0
- data/test/hexapdf/test_revision.rb +3 -0
- data/test/hexapdf/test_revisions.rb +35 -0
- data/test/hexapdf/test_writer.rb +2 -2
- data/test/hexapdf/type/acro_form/test_appearance_generator.rb +521 -0
- data/test/hexapdf/type/acro_form/test_button_field.rb +281 -0
- data/test/hexapdf/type/acro_form/test_choice_field.rb +137 -0
- data/test/hexapdf/type/acro_form/test_field.rb +163 -6
- data/test/hexapdf/type/acro_form/test_form.rb +189 -22
- data/test/hexapdf/type/acro_form/test_text_field.rb +121 -0
- data/test/hexapdf/type/acro_form/test_variable_text_field.rb +77 -0
- data/test/hexapdf/type/annotations/test_text.rb +1 -1
- data/test/hexapdf/type/annotations/test_widget.rb +199 -0
- data/test/hexapdf/type/test_annotation.rb +45 -0
- data/test/hexapdf/type/test_catalog.rb +18 -0
- data/test/hexapdf/type/test_font.rb +5 -0
- data/test/hexapdf/type/test_font_simple.rb +2 -1
- data/test/hexapdf/type/test_font_true_type.rb +6 -0
- data/test/hexapdf/type/test_font_type1.rb +8 -0
- data/test/hexapdf/type/test_form.rb +19 -1
- data/test/hexapdf/type/test_image.rb +7 -0
- data/test/hexapdf/type/test_page.rb +45 -7
- data/test/hexapdf/type/test_page_tree_node.rb +62 -12
- data/test/hexapdf/type/test_resources.rb +20 -0
- data/test/hexapdf/type/test_trailer.rb +4 -0
- data/test/hexapdf/utils/test_bit_field.rb +15 -1
- data/test/hexapdf/utils/test_sorted_tree_node.rb +10 -9
- data/test/test_helper.rb +1 -1
- metadata +34 -21
- data/lib/hexapdf/filter/dct_decode.rb +0 -60
|
@@ -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-2020 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-2020 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
|
|
@@ -45,7 +45,7 @@ module HexaPDF
|
|
|
45
45
|
# all either in clockwise or counterclockwise direction and optionally inclined in respect to
|
|
46
46
|
# the x-axis.
|
|
47
47
|
#
|
|
48
|
-
# See: ELL - https://
|
|
48
|
+
# See: ELL - https://spaceroots.org/documents/ellipse/elliptical-arc.pdf
|
|
49
49
|
class Arc
|
|
50
50
|
|
|
51
51
|
include HexaPDF::Utils::MathHelpers
|
|
@@ -202,8 +202,8 @@ module HexaPDF
|
|
|
202
202
|
p2x_prime, p2y_prime = derivative_evaluate(eta2)
|
|
203
203
|
|
|
204
204
|
result << [p2x, p2y,
|
|
205
|
-
p1: [p1x + alpha * p1x_prime, p1y + alpha * p1y_prime],
|
|
206
|
-
|
|
205
|
+
{p1: [p1x + alpha * p1x_prime, p1y + alpha * p1y_prime],
|
|
206
|
+
p2: [p2x - alpha * p2x_prime, p2y - alpha * p2y_prime]}]
|
|
207
207
|
end
|
|
208
208
|
|
|
209
209
|
result
|
|
@@ -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-2020 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-2020 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-2020 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-2020 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-2020 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
|
|
@@ -397,7 +397,7 @@ module HexaPDF
|
|
|
397
397
|
|
|
398
398
|
def invoke(processor, *operands) #:nodoc:
|
|
399
399
|
processor.graphics_state.stroke_color =
|
|
400
|
-
processor.graphics_state.stroke_color.color_space.
|
|
400
|
+
processor.graphics_state.stroke_color.color_space.prenormalized_color(*operands)
|
|
401
401
|
end
|
|
402
402
|
|
|
403
403
|
end
|
|
@@ -409,7 +409,7 @@ module HexaPDF
|
|
|
409
409
|
|
|
410
410
|
def invoke(processor, *operands) #:nodoc:
|
|
411
411
|
processor.graphics_state.fill_color =
|
|
412
|
-
processor.graphics_state.fill_color.color_space.
|
|
412
|
+
processor.graphics_state.fill_color.color_space.prenormalized_color(*operands)
|
|
413
413
|
end
|
|
414
414
|
|
|
415
415
|
end
|
|
@@ -425,7 +425,7 @@ module HexaPDF
|
|
|
425
425
|
|
|
426
426
|
def invoke(processor, gray) #:nodoc:
|
|
427
427
|
processor.graphics_state.stroke_color =
|
|
428
|
-
processor.resources.color_space(:DeviceGray).
|
|
428
|
+
processor.resources.color_space(:DeviceGray).prenormalized_color(gray)
|
|
429
429
|
end
|
|
430
430
|
|
|
431
431
|
end
|
|
@@ -442,7 +442,7 @@ module HexaPDF
|
|
|
442
442
|
|
|
443
443
|
def invoke(processor, gray) #:nodoc:
|
|
444
444
|
processor.graphics_state.fill_color =
|
|
445
|
-
processor.resources.color_space(:DeviceGray).
|
|
445
|
+
processor.resources.color_space(:DeviceGray).prenormalized_color(gray)
|
|
446
446
|
end
|
|
447
447
|
|
|
448
448
|
end
|
|
@@ -459,7 +459,7 @@ module HexaPDF
|
|
|
459
459
|
|
|
460
460
|
def invoke(processor, r, g, b) #:nodoc:
|
|
461
461
|
processor.graphics_state.stroke_color =
|
|
462
|
-
processor.resources.color_space(:DeviceRGB).
|
|
462
|
+
processor.resources.color_space(:DeviceRGB).prenormalized_color(r, g, b)
|
|
463
463
|
end
|
|
464
464
|
|
|
465
465
|
def serialize(serializer, r, g, b) #:nodoc:
|
|
@@ -481,7 +481,7 @@ module HexaPDF
|
|
|
481
481
|
|
|
482
482
|
def invoke(processor, r, g, b) #:nodoc:
|
|
483
483
|
processor.graphics_state.fill_color =
|
|
484
|
-
processor.resources.color_space(:DeviceRGB).
|
|
484
|
+
processor.resources.color_space(:DeviceRGB).prenormalized_color(r, g, b)
|
|
485
485
|
end
|
|
486
486
|
|
|
487
487
|
def serialize(serializer, r, g, b) #:nodoc:
|
|
@@ -503,7 +503,7 @@ module HexaPDF
|
|
|
503
503
|
|
|
504
504
|
def invoke(processor, c, m, y, k) #:nodoc:
|
|
505
505
|
processor.graphics_state.stroke_color =
|
|
506
|
-
processor.resources.color_space(:DeviceCMYK).
|
|
506
|
+
processor.resources.color_space(:DeviceCMYK).prenormalized_color(c, m, y, k)
|
|
507
507
|
end
|
|
508
508
|
|
|
509
509
|
def serialize(serializer, c, m, y, k) #:nodoc:
|
|
@@ -525,7 +525,7 @@ module HexaPDF
|
|
|
525
525
|
|
|
526
526
|
def invoke(processor, c, m, y, k) #:nodoc:
|
|
527
527
|
processor.graphics_state.fill_color =
|
|
528
|
-
processor.resources.color_space(:DeviceCMYK).
|
|
528
|
+
processor.resources.color_space(:DeviceCMYK).prenormalized_color(c, m, y, k)
|
|
529
529
|
end
|
|
530
530
|
|
|
531
531
|
def serialize(serializer, c, m, y, k) #:nodoc:
|
|
@@ -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-2020 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
|
|
@@ -162,12 +162,25 @@ module HexaPDF
|
|
|
162
162
|
class Parser
|
|
163
163
|
|
|
164
164
|
# Creates a new Parser object and calls #parse.
|
|
165
|
-
def self.parse(contents, processor)
|
|
166
|
-
new.parse(contents, processor)
|
|
165
|
+
def self.parse(contents, processor = nil, &block)
|
|
166
|
+
new.parse(contents, processor, &block)
|
|
167
167
|
end
|
|
168
168
|
|
|
169
|
-
# Parses the contents and calls the processor object for each parsed
|
|
170
|
-
|
|
169
|
+
# Parses the contents and calls the processor object or the given block for each parsed
|
|
170
|
+
# operator.
|
|
171
|
+
#
|
|
172
|
+
# If a full-blown Processor is not needed (e.g. because the graphics state doesn't need to be
|
|
173
|
+
# maintained), one can use the block form to handle the parsed objects and their parameters.
|
|
174
|
+
#
|
|
175
|
+
# Note: The parameters array is reused for each processed operator, so duplicate it if
|
|
176
|
+
# necessary.
|
|
177
|
+
def parse(contents, processor = nil, &block) #:yields: object, params
|
|
178
|
+
raise ArgumentError, "Argument processor or block is needed" if processor.nil? && block.nil?
|
|
179
|
+
if processor.nil?
|
|
180
|
+
block.singleton_class.send(:alias_method, :process, :call)
|
|
181
|
+
processor = block
|
|
182
|
+
end
|
|
183
|
+
|
|
171
184
|
tokenizer = Tokenizer.new(contents, raise_on_eos: true)
|
|
172
185
|
params = []
|
|
173
186
|
loop do
|
|
@@ -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-2020 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-2020 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-2020 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-2020 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
|
|
@@ -97,7 +97,7 @@ module HexaPDF
|
|
|
97
97
|
#
|
|
98
98
|
# version:: Specifies the minimum version of the PDF specification needed for this value.
|
|
99
99
|
def self.define_field(name, type:, required: false, default: nil, indirect: nil,
|
|
100
|
-
allowed_values: nil, version: '1.
|
|
100
|
+
allowed_values: nil, version: '1.0')
|
|
101
101
|
@fields ||= {}
|
|
102
102
|
@fields[name] = Field.new(type, required: required, default: default, indirect: indirect,
|
|
103
103
|
allowed_values: allowed_values, version: version)
|
|
@@ -163,7 +163,7 @@ module HexaPDF
|
|
|
163
163
|
value[name] = field.default
|
|
164
164
|
end
|
|
165
165
|
value[name] = data = document.deref(data) if data.kind_of?(HexaPDF::Reference)
|
|
166
|
-
if data.
|
|
166
|
+
if data.instance_of?(HexaPDF::Object) || (data.kind_of?(HexaPDF::Object) && data.value.nil?)
|
|
167
167
|
data = data.value
|
|
168
168
|
end
|
|
169
169
|
if (result = field&.convert(data, document))
|
|
@@ -182,7 +182,7 @@ module HexaPDF
|
|
|
182
182
|
raise ArgumentError, "Only Symbol (Name) keys are allowed to be used in PDF dictionaries"
|
|
183
183
|
end
|
|
184
184
|
|
|
185
|
-
if value[name].
|
|
185
|
+
if value[name].instance_of?(HexaPDF::Object) && !data.kind_of?(HexaPDF::Object) &&
|
|
186
186
|
!data.kind_of?(HexaPDF::Reference)
|
|
187
187
|
value[name].value = data
|
|
188
188
|
else
|
|
@@ -273,7 +273,7 @@ module HexaPDF
|
|
|
273
273
|
# Check that required fields are set
|
|
274
274
|
if field.required? && obj.nil?
|
|
275
275
|
yield("Required field #{name} is not set", field.default?)
|
|
276
|
-
self[name] = obj = field.default
|
|
276
|
+
self[name] = obj = field.default if field.default?
|
|
277
277
|
end
|
|
278
278
|
|
|
279
279
|
# Check if the document version is set high enough
|
|
@@ -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-2020 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
|
|
@@ -151,17 +151,9 @@ module HexaPDF
|
|
|
151
151
|
# Returns a duplicated default value, automatically taking unduplicatable classes into
|
|
152
152
|
# account.
|
|
153
153
|
def default
|
|
154
|
-
|
|
154
|
+
@default.dup
|
|
155
155
|
end
|
|
156
156
|
|
|
157
|
-
# Returns +true+ if the default value can safely be duplicated with #dup.
|
|
158
|
-
def duplicatable_default?
|
|
159
|
-
@duplicatable_default ||= HexaPDF::Object::NOT_DUPLICATABLE_CLASSES.none? do |klass|
|
|
160
|
-
@default.kind_of?(klass)
|
|
161
|
-
end
|
|
162
|
-
end
|
|
163
|
-
private :duplicatable_default?
|
|
164
|
-
|
|
165
157
|
# Returns +true+ if the given object is valid for this field.
|
|
166
158
|
def valid_object?(obj)
|
|
167
159
|
type.any? {|t| obj.kind_of?(t) } ||
|
data/lib/hexapdf/document.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-2020 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
|
|
@@ -55,6 +55,7 @@ require 'hexapdf/layout'
|
|
|
55
55
|
begin
|
|
56
56
|
require 'hexapdf/cext'
|
|
57
57
|
rescue LoadError
|
|
58
|
+
# ignore error because the C-extension only makes things faster
|
|
58
59
|
end
|
|
59
60
|
|
|
60
61
|
# == HexaPDF API Documentation
|
|
@@ -68,15 +69,35 @@ module HexaPDF
|
|
|
68
69
|
|
|
69
70
|
autoload(:Composer, 'hexapdf/composer')
|
|
70
71
|
|
|
72
|
+
# == HexaPDF::Document
|
|
73
|
+
#
|
|
71
74
|
# Represents one PDF document.
|
|
72
75
|
#
|
|
73
76
|
# A PDF document consists of (indirect) objects, so the main job of this class is to provide
|
|
74
77
|
# methods for working with these objects. However, since a PDF document may also be
|
|
75
78
|
# incrementally updated and can therefore contain one or more revisions, there are also methods
|
|
76
|
-
#
|
|
79
|
+
# for working with these revisions.
|
|
77
80
|
#
|
|
78
81
|
# Note: This class provides everything to work on PDF documents on a low-level basis. This means
|
|
79
|
-
# that there are no convenience methods for higher PDF functionality
|
|
82
|
+
# that there are no convenience methods for higher PDF functionality. Those can be found in the
|
|
83
|
+
# objects linked from here, like #catalog.
|
|
84
|
+
#
|
|
85
|
+
# == Known Messages
|
|
86
|
+
#
|
|
87
|
+
# The document object provides a basic message dispatch system via #register_listener and
|
|
88
|
+
# #dispatch_message.
|
|
89
|
+
#
|
|
90
|
+
# Following are the messages that are used by HexaPDF itself:
|
|
91
|
+
#
|
|
92
|
+
# :complete_objects::
|
|
93
|
+
# This message is called before the first step of writing a document. Listeners should
|
|
94
|
+
# complete PDF objects that are missing some information.
|
|
95
|
+
#
|
|
96
|
+
# For example, the font system uses this message to complete the font objects with
|
|
97
|
+
# information that is only available once all the used glyphs are known.
|
|
98
|
+
#
|
|
99
|
+
# :before_write::
|
|
100
|
+
# This message is called before a document is actually serialized and written.
|
|
80
101
|
class Document
|
|
81
102
|
|
|
82
103
|
autoload(:Pages, 'hexapdf/document/pages')
|
|
@@ -132,9 +153,10 @@ module HexaPDF
|
|
|
132
153
|
#
|
|
133
154
|
# decryption_opts:: A hash with options for decrypting the PDF objects loaded from the IO.
|
|
134
155
|
#
|
|
135
|
-
# config:: A hash with configuration options that is deep-merged into the default
|
|
136
|
-
#
|
|
137
|
-
#
|
|
156
|
+
# config:: A hash with configuration options that is deep-merged into the default configuration
|
|
157
|
+
# (see
|
|
158
|
+
# HexaPDF::DefaultDocumentConfiguration[../index.html#DefaultDocumentConfiguration],
|
|
159
|
+
# meaning that direct sub-hashes are merged instead of overwritten.
|
|
138
160
|
def initialize(io: nil, decryption_opts: {}, config: {})
|
|
139
161
|
@config = Configuration.with_defaults(config)
|
|
140
162
|
@version = '1.2'
|
|
@@ -377,7 +399,7 @@ module HexaPDF
|
|
|
377
399
|
case object
|
|
378
400
|
when Hash
|
|
379
401
|
seen[object] = true
|
|
380
|
-
object.
|
|
402
|
+
object.transform_values {|value| unwrap(value, seen.dup) }
|
|
381
403
|
when Array
|
|
382
404
|
seen[object] = true
|
|
383
405
|
object.map {|inner_o| unwrap(inner_o, seen.dup) }
|
|
@@ -398,11 +420,11 @@ module HexaPDF
|
|
|
398
420
|
# object in the PDF document. The block may either accept only the object or the object and the
|
|
399
421
|
# revision it is in.
|
|
400
422
|
#
|
|
401
|
-
# By default, only the current version of each object is returned which implies that each
|
|
402
|
-
#
|
|
403
|
-
#
|
|
423
|
+
# By default, only the current version of each object is returned which implies that each object
|
|
424
|
+
# number is yielded exactly once. If the +only_current+ option is +false+, all stored objects
|
|
425
|
+
# from newest to oldest are returned, not only the current version of each object.
|
|
404
426
|
#
|
|
405
|
-
# The +
|
|
427
|
+
# The +only_current+ option can make a difference because the document can contain multiple
|
|
406
428
|
# revisions:
|
|
407
429
|
#
|
|
408
430
|
# * Multiple revisions may contain objects with the same object and generation numbers, e.g.
|
|
@@ -440,6 +462,9 @@ module HexaPDF
|
|
|
440
462
|
end
|
|
441
463
|
|
|
442
464
|
# Dispatches the message +name+ with the given arguments to all registered listeners.
|
|
465
|
+
#
|
|
466
|
+
# See the main Document documentation for an overview of messages that are used by HexaPDF
|
|
467
|
+
# itself.
|
|
443
468
|
def dispatch_message(name, *args)
|
|
444
469
|
@listeners[name]&.each {|obj| obj.call(*args) }
|
|
445
470
|
end
|
|
@@ -496,6 +521,13 @@ module HexaPDF
|
|
|
496
521
|
@fonts ||= Fonts.new(self)
|
|
497
522
|
end
|
|
498
523
|
|
|
524
|
+
# Returns the main AcroForm object for dealing with interactive forms.
|
|
525
|
+
#
|
|
526
|
+
# See HexaPDF::Type::Catalog#acro_form for details on the arguments.
|
|
527
|
+
def acro_form(create: false)
|
|
528
|
+
catalog.acro_form(create: create)
|
|
529
|
+
end
|
|
530
|
+
|
|
499
531
|
# Executes the given task and returns its result.
|
|
500
532
|
#
|
|
501
533
|
# Tasks provide an extensible way for performing operations on a PDF document without
|
|
@@ -585,13 +617,9 @@ module HexaPDF
|
|
|
585
617
|
# If a block is given, it is called on validation problems.
|
|
586
618
|
#
|
|
587
619
|
# See HexaPDF::Object#validate for more information.
|
|
588
|
-
def validate(auto_correct: true, only_loaded: false) #:yield:
|
|
589
|
-
cur_obj = trailer
|
|
590
|
-
block = (block_given? ? lambda {|msg, correctable| yield(cur_obj, msg, correctable) } : nil)
|
|
591
|
-
|
|
620
|
+
def validate(auto_correct: true, only_loaded: false, &block) #:yield: msg, correctable, object
|
|
592
621
|
result = trailer.validate(auto_correct: auto_correct, &block)
|
|
593
622
|
each(only_current: false, only_loaded: only_loaded) do |obj|
|
|
594
|
-
cur_obj = obj
|
|
595
623
|
result &&= obj.validate(auto_correct: auto_correct, &block)
|
|
596
624
|
end
|
|
597
625
|
result
|
|
@@ -634,7 +662,7 @@ module HexaPDF
|
|
|
634
662
|
end
|
|
635
663
|
|
|
636
664
|
if validate
|
|
637
|
-
self.validate(auto_correct: true) do |
|
|
665
|
+
self.validate(auto_correct: true) do |msg, correctable, obj|
|
|
638
666
|
next if correctable
|
|
639
667
|
raise HexaPDF::Error, "Validation error for (#{obj.oid},#{obj.gen}): #{msg}"
|
|
640
668
|
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-2020 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
|
|
@@ -117,7 +117,6 @@ module HexaPDF
|
|
|
117
117
|
|
|
118
118
|
@document.pages.each do |page|
|
|
119
119
|
page[:Annots]&.each do |annot|
|
|
120
|
-
annot = @document.deref(annot)
|
|
121
120
|
next unless annot[:Subtype] == :FileAttachment
|
|
122
121
|
spec = @document.deref(annot[:FS])
|
|
123
122
|
yield(spec) unless seen.key?(spec)
|