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
data/lib/hexapdf/cli/merge.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
|
@@ -122,7 +122,7 @@ module HexaPDF
|
|
122
122
|
|
123
123
|
# Assemble pages
|
124
124
|
target = (@initial_empty ? HexaPDF::Document.new : @files.first.file)
|
125
|
-
page_tree = target.add(Type: :Pages)
|
125
|
+
page_tree = target.add({Type: :Pages})
|
126
126
|
import_pages(page_tree)
|
127
127
|
target.catalog[:Pages] = page_tree
|
128
128
|
remove_unused_pages(target)
|
data/lib/hexapdf/cli/modify.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/cli/optimize.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/cli/split.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
|
@@ -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/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-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
|
@@ -297,7 +297,7 @@ module HexaPDF
|
|
297
297
|
style ||= base_style
|
298
298
|
style = style.dup.update(**options) unless options.empty?
|
299
299
|
style.font(base_style.font) unless style.font?
|
300
|
-
style.font(@document.fonts.add(style.font)) unless style.font.respond_to?(:
|
300
|
+
style.font(@document.fonts.add(style.font)) unless style.font.respond_to?(:pdf_object)
|
301
301
|
style
|
302
302
|
end
|
303
303
|
|
@@ -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
|
@@ -48,8 +48,9 @@ module HexaPDF
|
|
48
48
|
# easily be changed.
|
49
49
|
#
|
50
50
|
# Some options are defined as global options because they are needed on the class level - see
|
51
|
-
# HexaPDF::GlobalConfiguration. Other options can be configured for
|
52
|
-
# allow to fine-tune some behavior - see
|
51
|
+
# HexaPDF::GlobalConfiguration[index.html#GlobalConfiguration]. Other options can be configured for
|
52
|
+
# individual documents as they allow to fine-tune some behavior - see
|
53
|
+
# HexaPDF::DefaultDocumentConfiguration[index.html#DefaultDocumentConfiguration].
|
53
54
|
#
|
54
55
|
# A configuration option name is dot-separted to provide a hierarchy of option names. For
|
55
56
|
# example, io.chunk_size.
|
@@ -144,6 +145,43 @@ module HexaPDF
|
|
144
145
|
#
|
145
146
|
# The following options are provided:
|
146
147
|
#
|
148
|
+
# acro_form.appearance_generator::
|
149
|
+
# The class that should be used for generating appearances for AcroForm fields. If the value is
|
150
|
+
# a String, it should contain the name of a constant to such a class.
|
151
|
+
#
|
152
|
+
# See HexaPDF::Type::AcroForm::AppearanceGenerator
|
153
|
+
#
|
154
|
+
# acro_form.create_appearances::
|
155
|
+
# A boolean specifying whether an AcroForm field's appearances should automatically be
|
156
|
+
# generated if they are missing.
|
157
|
+
#
|
158
|
+
# acro_form.text_field.default_width::
|
159
|
+
# A number specifying the default width of AcroForm text fields which should be auto-sized.
|
160
|
+
#
|
161
|
+
# acro_form.default_font_size::
|
162
|
+
# A number specifying the default font size of AcroForm text fields which should be auto-sized.
|
163
|
+
#
|
164
|
+
# acro_form.fallback_font::
|
165
|
+
# The font that should be used when a variable text field references a font that cannot be used.
|
166
|
+
#
|
167
|
+
# Can either be the name of a font, like 'Helvetica', or an array consisting of the font name
|
168
|
+
# and a hash of font options, like ['Helvetica', variant: :italic]. If set to +nil+, the use of
|
169
|
+
# the fallback font is disabled.
|
170
|
+
#
|
171
|
+
# Default is 'Helvetica'.
|
172
|
+
#
|
173
|
+
# acro_form.on_invalid_value::
|
174
|
+
# Callback hook when an invalid value is set for certain types of AcroForm fields.
|
175
|
+
#
|
176
|
+
# The value needs to be an object that responds to \#call(field, value) where +field+ is the
|
177
|
+
# AcroForm field on which the value is set and +value+ is the invalid value. The returned value
|
178
|
+
# is used instead of the invalid value.
|
179
|
+
#
|
180
|
+
# The default implementation raises an error.
|
181
|
+
#
|
182
|
+
# acro_form.text_field.default_width::
|
183
|
+
# A number specifying the default width of AcroForm text fields which should be auto-sized.
|
184
|
+
#
|
147
185
|
# document.auto_decrypt::
|
148
186
|
# A boolean determining whether the document should be decrypted automatically when parsed.
|
149
187
|
#
|
@@ -296,6 +334,20 @@ module HexaPDF
|
|
296
334
|
# The value needs to be an object that responds to \#call(document, message, position) and
|
297
335
|
# returns +true+ if an error should be raised.
|
298
336
|
#
|
337
|
+
# parser.try_xref_reconstruction::
|
338
|
+
# A boolean specifying whether non-recoverable parsing errors should lead to reconstructing the
|
339
|
+
# main cross-reference table.
|
340
|
+
#
|
341
|
+
# The reconstructed cross-reference table might make damaged files usable but there is no way
|
342
|
+
# to ensure that the reconstructed file is equal to the undamaged original file (though
|
343
|
+
# generally it works out).
|
344
|
+
#
|
345
|
+
# There is also the possibility that reconstructing doesn't work because the algorithm has to
|
346
|
+
# assume that the PDF was written in a certain way (which is recommended by the PDF
|
347
|
+
# specification).
|
348
|
+
#
|
349
|
+
# Defaults to +true+.
|
350
|
+
#
|
299
351
|
# sorted_tree.max_leaf_node_size::
|
300
352
|
# The maximum number of nodes that should be in a leaf node of a node tree.
|
301
353
|
#
|
@@ -307,7 +359,16 @@ module HexaPDF
|
|
307
359
|
# task.map::
|
308
360
|
# A mapping from task names to callable task objects. See HexaPDF::Task for more information.
|
309
361
|
DefaultDocumentConfiguration =
|
310
|
-
Configuration.new('
|
362
|
+
Configuration.new('acro_form.appearance_generator' => 'HexaPDF::Type::AcroForm::AppearanceGenerator',
|
363
|
+
'acro_form.create_appearances' => true,
|
364
|
+
'acro_form.default_font_size' => 10,
|
365
|
+
'acro_form.fallback_font' => 'Helvetica',
|
366
|
+
'acro_form.on_invalid_value' => proc do |field, value|
|
367
|
+
raise HexaPDF::Error, "Invalid value #{value.inspect} for " \
|
368
|
+
"#{field.concrete_field_type} field #{field.full_field_name}"
|
369
|
+
end,
|
370
|
+
'acro_form.text_field.default_width' => 100,
|
371
|
+
'document.auto_decrypt' => true,
|
311
372
|
'encryption.aes' => 'HexaPDF::Encryption::FastAES',
|
312
373
|
'encryption.arc4' => 'HexaPDF::Encryption::FastARC4',
|
313
374
|
'encryption.filter_map' => {
|
@@ -326,12 +387,12 @@ module HexaPDF
|
|
326
387
|
Fl: 'HexaPDF::Filter::FlateDecode',
|
327
388
|
RunLengthDecode: 'HexaPDF::Filter::RunLengthDecode',
|
328
389
|
RL: 'HexaPDF::Filter::RunLengthDecode',
|
329
|
-
CCITTFaxDecode:
|
330
|
-
CCF:
|
331
|
-
JBIG2Decode:
|
332
|
-
DCTDecode: 'HexaPDF::Filter::
|
333
|
-
DCT: 'HexaPDF::Filter::
|
334
|
-
JPXDecode: 'HexaPDF::Filter::
|
390
|
+
CCITTFaxDecode: 'HexaPDF::Filter::PassThrough',
|
391
|
+
CCF: 'HexaPDF::Filter::PassThrough',
|
392
|
+
JBIG2Decode: 'HexaPDF::Filter::PassThrough',
|
393
|
+
DCTDecode: 'HexaPDF::Filter::PassThrough',
|
394
|
+
DCT: 'HexaPDF::Filter::PassThrough',
|
395
|
+
JPXDecode: 'HexaPDF::Filter::PassThrough',
|
335
396
|
Crypt: nil,
|
336
397
|
Encryption: 'HexaPDF::Filter::Encryption',
|
337
398
|
},
|
@@ -365,6 +426,7 @@ module HexaPDF
|
|
365
426
|
'page.default_media_box' => :A4,
|
366
427
|
'page.default_media_orientation' => :portrait,
|
367
428
|
'parser.on_correctable_error' => proc { false },
|
429
|
+
'parser.try_xref_reconstruction' => true,
|
368
430
|
'sorted_tree.max_leaf_node_size' => 64,
|
369
431
|
'style.layers_map' => {
|
370
432
|
link: 'HexaPDF::Layout::Style::LinkLayer',
|
@@ -447,10 +509,13 @@ module HexaPDF
|
|
447
509
|
Action: 'HexaPDF::Type::Action',
|
448
510
|
XXLaunchActionWinParameters: 'HexaPDF::Type::Actions::Launch::WinParameters',
|
449
511
|
Annot: 'HexaPDF::Type::Annotation',
|
450
|
-
XXAppearanceCharacteristics:
|
512
|
+
XXAppearanceCharacteristics: \
|
513
|
+
'HexaPDF::Type::Annotations::Widget::AppearanceCharacteristics',
|
451
514
|
XXIconFit: 'HexaPDF::Type::IconFit',
|
452
515
|
XXAcroForm: 'HexaPDF::Type::AcroForm::Form',
|
453
516
|
XXAcroFormField: 'HexaPDF::Type::AcroForm::Field',
|
517
|
+
XXAppearanceDictionary: 'HexaPDF::Type::Annotation::AppearanceDictionary',
|
518
|
+
Border: 'HexaPDF::Type::Annotation::Border',
|
454
519
|
},
|
455
520
|
'object.subtype_map' => {
|
456
521
|
nil => {
|
@@ -492,6 +557,11 @@ module HexaPDF
|
|
492
557
|
Link: 'HexaPDF::Type::Annotations::Link',
|
493
558
|
Widget: 'HexaPDF::Type::Annotations::Widget',
|
494
559
|
},
|
560
|
+
XXAcroFormField: {
|
561
|
+
Tx: 'HexaPDF::Type::AcroForm::TextField',
|
562
|
+
Btn: 'HexaPDF::Type::AcroForm::ButtonField',
|
563
|
+
Ch: 'HexaPDF::Type::AcroForm::ChoiceField',
|
564
|
+
},
|
495
565
|
})
|
496
566
|
|
497
567
|
end
|
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-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
|
@@ -44,6 +44,8 @@ module HexaPDF
|
|
44
44
|
autoload(:Canvas, 'hexapdf/content/canvas')
|
45
45
|
autoload(:Parser, 'hexapdf/content/parser')
|
46
46
|
autoload(:Processor, 'hexapdf/content/processor')
|
47
|
+
autoload(:ColorSpace, 'hexapdf/content/color_space')
|
48
|
+
autoload(:Operator, 'hexapdf/content/operator')
|
47
49
|
|
48
50
|
end
|
49
51
|
|
@@ -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
|
@@ -1607,13 +1607,13 @@ module HexaPDF
|
|
1607
1607
|
# See: PDF1.7 s9.2.2
|
1608
1608
|
def font(name = nil, size: nil, **options)
|
1609
1609
|
if name
|
1610
|
-
@font = (name.respond_to?(:
|
1610
|
+
@font = (name.respond_to?(:pdf_object) ? name : context.document.fonts.add(name, **options))
|
1611
1611
|
if size
|
1612
1612
|
font_size(size)
|
1613
1613
|
else
|
1614
1614
|
size = font_size
|
1615
1615
|
raise HexaPDF::Error, "No valid font size set" if size <= 0
|
1616
|
-
invoke_font_operator(@font.
|
1616
|
+
invoke_font_operator(@font.pdf_object, size)
|
1617
1617
|
end
|
1618
1618
|
self
|
1619
1619
|
else
|
@@ -1644,7 +1644,7 @@ module HexaPDF
|
|
1644
1644
|
unless @font
|
1645
1645
|
raise HexaPDF::Error, "A font needs to be set before the font size can be set"
|
1646
1646
|
end
|
1647
|
-
invoke_font_operator(@font.
|
1647
|
+
invoke_font_operator(@font.pdf_object, size)
|
1648
1648
|
self
|
1649
1649
|
else
|
1650
1650
|
graphics_state.font_size
|
@@ -1855,7 +1855,7 @@ module HexaPDF
|
|
1855
1855
|
elsif spec.length == 1 && spec[0].respond_to?(:color_space)
|
1856
1856
|
spec[0]
|
1857
1857
|
else
|
1858
|
-
resources.color_space(
|
1858
|
+
resources.color_space(ColorSpace.for_components(spec)).color(*spec)
|
1859
1859
|
end
|
1860
1860
|
end
|
1861
1861
|
|
@@ -1993,19 +1993,6 @@ module HexaPDF
|
|
1993
1993
|
end
|
1994
1994
|
end
|
1995
1995
|
|
1996
|
-
# Returns the name of the device color space that should be used for creating a color object
|
1997
|
-
# from the components array.
|
1998
|
-
def color_space_for_components(components)
|
1999
|
-
case components.length
|
2000
|
-
when 1 then :DeviceGray
|
2001
|
-
when 3 then :DeviceRGB
|
2002
|
-
when 4 then :DeviceCMYK
|
2003
|
-
else
|
2004
|
-
raise ArgumentError, "Invalid number of color components, 1|3|4 expected, " \
|
2005
|
-
"#{components.length} given"
|
2006
|
-
end
|
2007
|
-
end
|
2008
|
-
|
2009
1996
|
# Utility method that abstracts the implementation of a graphics state parameter
|
2010
1997
|
# getter/setter method with a call sequence of:
|
2011
1998
|
#
|
@@ -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
|
@@ -35,6 +35,7 @@
|
|
35
35
|
#++
|
36
36
|
|
37
37
|
require 'hexapdf/error'
|
38
|
+
require 'hexapdf/configuration'
|
38
39
|
|
39
40
|
module HexaPDF
|
40
41
|
module Content
|
@@ -71,14 +72,18 @@ module HexaPDF
|
|
71
72
|
# Returns the PDF name of the color space family this color space belongs to.
|
72
73
|
#
|
73
74
|
# #definition::
|
74
|
-
# Returns the color space definition as array.
|
75
|
+
# Returns the color space definition as array or symbol.
|
75
76
|
#
|
76
77
|
# #default_color::
|
77
78
|
# Returns the default color for this color space.
|
78
79
|
#
|
79
80
|
# #color(*args)::
|
80
|
-
# Returns the color corresponding to the given arguments
|
81
|
-
# arguments differ from one color space to another.
|
81
|
+
# Returns the color corresponding to the given arguments which may be normalized to conform to
|
82
|
+
# the PDF spec. The number and types of the arguments differ from one color space to another.
|
83
|
+
#
|
84
|
+
# #prenormalized_color(*args)::
|
85
|
+
# Returns the color corresponding to the given arguments without applying value normalization.
|
86
|
+
# The number and types of the arguments differ from one color space to another.
|
82
87
|
#
|
83
88
|
# The class representing a color in the color space needs to respond to the following methods:
|
84
89
|
#
|
@@ -91,6 +96,52 @@ module HexaPDF
|
|
91
96
|
# See: PDF1.7 s8.6
|
92
97
|
module ColorSpace
|
93
98
|
|
99
|
+
# :call-seq:
|
100
|
+
# ColorSpace.device_color_from_specification(gray) => color
|
101
|
+
# ColorSpace.device_color_from_specification(r, g, b) => color
|
102
|
+
# ColorSpace.device_color_from_specification(c, m, y, k) => color
|
103
|
+
# ColorSpace.device_color_from_specification(string) => color
|
104
|
+
# ColorSpace.device_color_from_specification(array) => color
|
105
|
+
#
|
106
|
+
# Creates a device color object from the given color specification.
|
107
|
+
#
|
108
|
+
# There are several ways to define the color that should be used:
|
109
|
+
#
|
110
|
+
# * A single numeric argument specifies a gray color (see DeviceGray::Color).
|
111
|
+
# * Three numeric arguments specify an RGB color (see DeviceRGB::Color).
|
112
|
+
# * A string in the format "RRGGBB" where "RR" is the hexadecimal number for the red, "GG"
|
113
|
+
# for the green and "BB" for the blue color value also specifies an RGB color.
|
114
|
+
# * Four numeric arguments specify a CMYK color (see DeviceCMYK::Color).
|
115
|
+
# * An array is treated as if its items were specified separately as arguments.
|
116
|
+
#
|
117
|
+
# Note that it makes a difference whether integer or float values are used because the given
|
118
|
+
# values are first normalized - see DeviceGray#color, DeviceRGB#color and DeviceCMYK#color.
|
119
|
+
def self.device_color_from_specification(*spec)
|
120
|
+
spec.flatten!
|
121
|
+
spec = spec[0].scan(/../).map!(&:hex) if spec.length == 1 && spec[0].kind_of?(String)
|
122
|
+
GlobalConfiguration.constantize('color_space.map', for_components(spec)).new.color(*spec)
|
123
|
+
end
|
124
|
+
|
125
|
+
# Returns a device color object for the given components array without applying value
|
126
|
+
# normalization.
|
127
|
+
def self.prenormalized_device_color(components)
|
128
|
+
GlobalConfiguration.constantize('color_space.map', for_components(components)).new.
|
129
|
+
prenormalized_color(*components)
|
130
|
+
end
|
131
|
+
|
132
|
+
# Returns the name of the device color space that should be used for creating a color object
|
133
|
+
# from the components array.
|
134
|
+
def self.for_components(components)
|
135
|
+
case components.length
|
136
|
+
when 1 then :DeviceGray
|
137
|
+
when 3 then :DeviceRGB
|
138
|
+
when 4 then :DeviceCMYK
|
139
|
+
else
|
140
|
+
raise ArgumentError, "Invalid number of color components, 1|3|4 expected, " \
|
141
|
+
"#{components.length} given"
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
94
145
|
# This module includes utility functions that are useful for all color classes.
|
95
146
|
module ColorUtils
|
96
147
|
|
@@ -103,9 +154,10 @@ module HexaPDF
|
|
103
154
|
# * If the color value is less than 0.0, it is set to 0.0.
|
104
155
|
def normalize_value(value, upper)
|
105
156
|
value = value.to_f / upper if value.kind_of?(Integer)
|
106
|
-
|
157
|
+
value.clamp(0, 1)
|
107
158
|
end
|
108
159
|
private :normalize_value
|
160
|
+
module_function :normalize_value
|
109
161
|
|
110
162
|
# Compares this color to another one by looking at their associated color spaces and their
|
111
163
|
# components.
|
@@ -137,6 +189,7 @@ module HexaPDF
|
|
137
189
|
def color(*args)
|
138
190
|
Color.new(self, *args)
|
139
191
|
end
|
192
|
+
alias prenormalized_color color
|
140
193
|
|
141
194
|
# Returns the PDF color space family this color space belongs to.
|
142
195
|
def family
|
@@ -189,8 +242,22 @@ module HexaPDF
|
|
189
242
|
Color.new(0.0, 0.0, 0.0)
|
190
243
|
end
|
191
244
|
|
192
|
-
# Returns the color object for the
|
245
|
+
# Returns the color object for the red, green and blue components.
|
246
|
+
#
|
247
|
+
# Color values can either be integers in the range from 0 to 255 or floating point numbers
|
248
|
+
# between 0.0 and 1.0. The integer color values are automatically normalized to the
|
249
|
+
# DeviceRGB color value range of 0.0 to 1.0.
|
193
250
|
def color(r, g, b)
|
251
|
+
Color.new(ColorUtils.normalize_value(r, 255),
|
252
|
+
ColorUtils.normalize_value(g, 255),
|
253
|
+
ColorUtils.normalize_value(b, 255))
|
254
|
+
end
|
255
|
+
|
256
|
+
# Returns the color object for the red, green and blue components without applying value
|
257
|
+
# normalization.
|
258
|
+
#
|
259
|
+
# See: #color
|
260
|
+
def prenormalized_color(r, g, b)
|
194
261
|
Color.new(r, g, b)
|
195
262
|
end
|
196
263
|
|
@@ -198,13 +265,10 @@ module HexaPDF
|
|
198
265
|
def family
|
199
266
|
:DeviceRGB
|
200
267
|
end
|
268
|
+
alias definition family
|
201
269
|
|
202
270
|
# A color in the DeviceRGB color space.
|
203
271
|
#
|
204
|
-
# Color values can either be integers in the range from 0 to 255 or floating point numbers
|
205
|
-
# between 0.0 and 1.0. The integer color values are automatically normalized to the
|
206
|
-
# DeviceRGB color value range of 0.0 to 1.0.
|
207
|
-
#
|
208
272
|
# See: PDF1.7 s8.6.4.3
|
209
273
|
class Color
|
210
274
|
|
@@ -212,12 +276,11 @@ module HexaPDF
|
|
212
276
|
|
213
277
|
# Initializes the color with the +r+ (red), +g+ (green) and +b+ (blue) components.
|
214
278
|
#
|
215
|
-
# Each argument has to be
|
216
|
-
# 1.0.
|
279
|
+
# Each argument has to be a float between 0.0 and 1.0.
|
217
280
|
def initialize(r, g, b)
|
218
|
-
@r =
|
219
|
-
@g =
|
220
|
-
@b =
|
281
|
+
@r = r
|
282
|
+
@g = g
|
283
|
+
@b = b
|
221
284
|
end
|
222
285
|
|
223
286
|
# Returns the DeviceRGB color space module.
|
@@ -251,7 +314,20 @@ module HexaPDF
|
|
251
314
|
end
|
252
315
|
|
253
316
|
# Returns the color object for the given cyan, magenta, yellow and black components.
|
317
|
+
#
|
318
|
+
# Color values can either be integers in the range from 0 to 100 or floating point numbers
|
319
|
+
# between 0.0 and 1.0. The integer color values are automatically normalized to the
|
320
|
+
# DeviceCMYK color value range of 0.0 to 1.0.
|
254
321
|
def color(c, m, y, k)
|
322
|
+
Color.new(ColorUtils.normalize_value(c, 100), ColorUtils.normalize_value(m, 100),
|
323
|
+
ColorUtils.normalize_value(y, 100), ColorUtils.normalize_value(k, 100))
|
324
|
+
end
|
325
|
+
|
326
|
+
# Returns the color object for the cyan, magenta, yellow and black components without
|
327
|
+
# applying value normalization.
|
328
|
+
#
|
329
|
+
# See: #color
|
330
|
+
def prenormalized_color(c, m, y, k)
|
255
331
|
Color.new(c, m, y, k)
|
256
332
|
end
|
257
333
|
|
@@ -259,13 +335,10 @@ module HexaPDF
|
|
259
335
|
def family
|
260
336
|
:DeviceCMYK
|
261
337
|
end
|
338
|
+
alias definition family
|
262
339
|
|
263
340
|
# A color in the DeviceCMYK color space.
|
264
341
|
#
|
265
|
-
# Color values can either be integers in the range from 0 to 100 or floating point numbers
|
266
|
-
# between 0.0 and 1.0. The integer color values are automatically normalized to the
|
267
|
-
# DeviceCMYK color value range of 0.0 to 1.0.
|
268
|
-
#
|
269
342
|
# See: PDF1.7 s8.6.4.4
|
270
343
|
class Color
|
271
344
|
|
@@ -274,13 +347,12 @@ module HexaPDF
|
|
274
347
|
# Initializes the color with the +c+ (cyan), +m+ (magenta), +y+ (yellow) and +k+ (black)
|
275
348
|
# components.
|
276
349
|
#
|
277
|
-
# Each argument has to be
|
278
|
-
# 1.0.
|
350
|
+
# Each argument has to be a float between 0.0 and 1.0.
|
279
351
|
def initialize(c, m, y, k)
|
280
|
-
@c =
|
281
|
-
@m =
|
282
|
-
@y =
|
283
|
-
@k =
|
352
|
+
@c = c
|
353
|
+
@m = m
|
354
|
+
@y = y
|
355
|
+
@k = k
|
284
356
|
end
|
285
357
|
|
286
358
|
# Returns the DeviceCMYK color space module.
|
@@ -314,7 +386,18 @@ module HexaPDF
|
|
314
386
|
end
|
315
387
|
|
316
388
|
# Returns the color object for the given gray component.
|
389
|
+
#
|
390
|
+
# Color values can either be integers in the range from 0 to 255 or floating point numbers
|
391
|
+
# between 0.0 and 1.0. The integer color values are automatically normalized to the
|
392
|
+
# DeviceGray color value range of 0.0 to 1.0.
|
317
393
|
def color(gray)
|
394
|
+
Color.new(ColorUtils.normalize_value(gray, 255))
|
395
|
+
end
|
396
|
+
|
397
|
+
# Returns the color object for the gray component without applying value normalization.
|
398
|
+
#
|
399
|
+
# See: #color
|
400
|
+
def prenormalized_color(gray)
|
318
401
|
Color.new(gray)
|
319
402
|
end
|
320
403
|
|
@@ -322,13 +405,10 @@ module HexaPDF
|
|
322
405
|
def family
|
323
406
|
:DeviceGray
|
324
407
|
end
|
408
|
+
alias definition family
|
325
409
|
|
326
410
|
# A color in the DeviceGray color space.
|
327
411
|
#
|
328
|
-
# Color values can either be integers in the range from 0 to 255 or floating point numbers
|
329
|
-
# between 0.0 and 1.0. The integer color values are automatically normalized to the
|
330
|
-
# DeviceGray color value range of 0.0 to 1.0.
|
331
|
-
#
|
332
412
|
# See: PDF1.7 s8.6.4.2
|
333
413
|
class Color
|
334
414
|
|
@@ -336,10 +416,9 @@ module HexaPDF
|
|
336
416
|
|
337
417
|
# Initializes the color with the +gray+ component.
|
338
418
|
#
|
339
|
-
# The argument +gray+ has to be
|
340
|
-
# 0.0 and 1.0.
|
419
|
+
# The argument +gray+ has to be a float between 0.0 and 1.0.
|
341
420
|
def initialize(gray)
|
342
|
-
@gray =
|
421
|
+
@gray = gray
|
343
422
|
end
|
344
423
|
|
345
424
|
# Returns the DeviceGray color space module.
|