hexapdf 0.11.9 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +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)
|