hexapdf 0.11.7 → 0.12.2
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 +121 -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 +18 -9
- data/lib/hexapdf/cli/files.rb +1 -1
- data/lib/hexapdf/cli/form.rb +240 -0
- data/lib/hexapdf/cli/image2pdf.rb +1 -1
- data/lib/hexapdf/cli/images.rb +1 -1
- data/lib/hexapdf/cli/info.rb +1 -1
- data/lib/hexapdf/cli/inspect.rb +1 -1
- data/lib/hexapdf/cli/merge.rb +1 -1
- data/lib/hexapdf/cli/modify.rb +1 -1
- data/lib/hexapdf/cli/optimize.rb +1 -1
- data/lib/hexapdf/cli/split.rb +1 -1
- data/lib/hexapdf/cli/watermark.rb +1 -1
- data/lib/hexapdf/composer.rb +2 -2
- data/lib/hexapdf/configuration.rb +66 -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 +1 -1
- data/lib/hexapdf/content/graphic_object/endpoint_arc.rb +1 -1
- data/lib/hexapdf/content/graphic_object/geom2d.rb +1 -1
- data/lib/hexapdf/content/graphic_object/solid_arc.rb +1 -1
- data/lib/hexapdf/content/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 +1 -1
- data/lib/hexapdf/dictionary_fields.rb +1 -1
- data/lib/hexapdf/document.rb +14 -5
- data/lib/hexapdf/document/files.rb +1 -1
- data/lib/hexapdf/document/fonts.rb +1 -1
- data/lib/hexapdf/document/images.rb +1 -1
- data/lib/hexapdf/document/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 +1 -1
- data/lib/hexapdf/encryption/identity.rb +1 -1
- data/lib/hexapdf/encryption/ruby_aes.rb +1 -1
- data/lib/hexapdf/encryption/ruby_arc4.rb +1 -1
- data/lib/hexapdf/encryption/security_handler.rb +7 -1
- data/lib/hexapdf/encryption/standard_security_handler.rb +1 -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 +1 -1
- 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 +1 -1
- data/lib/hexapdf/font/true_type/table/hhea.rb +1 -1
- data/lib/hexapdf/font/true_type/table/hmtx.rb +1 -1
- data/lib/hexapdf/font/true_type/table/kern.rb +1 -1
- data/lib/hexapdf/font/true_type/table/loca.rb +1 -1
- data/lib/hexapdf/font/true_type/table/maxp.rb +1 -1
- data/lib/hexapdf/font/true_type/table/name.rb +1 -1
- data/lib/hexapdf/font/true_type/table/os2.rb +1 -1
- data/lib/hexapdf/font/true_type/table/post.rb +1 -1
- data/lib/hexapdf/font/true_type_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 +1 -1
- 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 +1 -1
- data/lib/hexapdf/layout/numeric_refinements.rb +1 -1
- data/lib/hexapdf/layout/style.rb +1 -1
- 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 +1 -1
- 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 +2 -2
- data/lib/hexapdf/parser.rb +4 -3
- data/lib/hexapdf/pdf_array.rb +1 -1
- 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 +1 -1
- 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 +1 -1
- data/lib/hexapdf/tokenizer.rb +1 -1
- 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 +401 -0
- data/lib/hexapdf/type/acro_form/button_field.rb +300 -0
- data/lib/hexapdf/type/acro_form/choice_field.rb +220 -0
- data/lib/hexapdf/type/acro_form/field.rb +220 -17
- data/lib/hexapdf/type/acro_form/form.rb +157 -7
- data/lib/hexapdf/type/acro_form/text_field.rb +186 -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 +1 -1
- 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 +239 -2
- data/lib/hexapdf/type/catalog.rb +21 -1
- 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 +1 -1
- data/lib/hexapdf/type/font.rb +18 -1
- data/lib/hexapdf/type/font_descriptor.rb +2 -2
- data/lib/hexapdf/type/font_simple.rb +1 -1
- data/lib/hexapdf/type/font_true_type.rb +1 -1
- data/lib/hexapdf/type/font_type0.rb +1 -1
- data/lib/hexapdf/type/font_type1.rb +16 -1
- data/lib/hexapdf/type/font_type3.rb +1 -1
- data/lib/hexapdf/type/form.rb +10 -1
- data/lib/hexapdf/type/graphics_state_parameter.rb +1 -1
- data/lib/hexapdf/type/icon_fit.rb +1 -1
- data/lib/hexapdf/type/image.rb +3 -1
- 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 +20 -5
- data/lib/hexapdf/type/page_tree_node.rb +8 -11
- data/lib/hexapdf/type/resources.rb +16 -3
- data/lib/hexapdf/type/trailer.rb +2 -3
- 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 +1 -1
- data/lib/hexapdf/version.rb +2 -2
- data/lib/hexapdf/writer.rb +1 -1
- data/lib/hexapdf/xref_section.rb +1 -1
- data/test/hexapdf/content/common.rb +2 -2
- 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_security_handler.rb +4 -0
- 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/test_document.rb +12 -0
- data/test/hexapdf/test_parser.rb +10 -0
- data/test/hexapdf/test_rectangle.rb +14 -0
- data/test/hexapdf/test_revision.rb +3 -0
- data/test/hexapdf/test_serializer.rb +3 -3
- data/test/hexapdf/test_writer.rb +2 -2
- data/test/hexapdf/type/acro_form/test_appearance_generator.rb +515 -0
- data/test/hexapdf/type/acro_form/test_button_field.rb +276 -0
- data/test/hexapdf/type/acro_form/test_choice_field.rb +137 -0
- data/test/hexapdf/type/acro_form/test_field.rb +124 -6
- data/test/hexapdf/type/acro_form/test_form.rb +189 -22
- data/test/hexapdf/type/acro_form/test_text_field.rb +119 -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_type1.rb +8 -0
- data/test/hexapdf/type/test_form.rb +18 -0
- data/test/hexapdf/type/test_image.rb +7 -0
- data/test/hexapdf/type/test_page.rb +37 -6
- data/test/hexapdf/type/test_page_tree_node.rb +20 -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 +13 -1
- data/test/test_helper.rb +1 -1
- metadata +38 -18
- 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
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
require 'hexapdf/data_dir'
|
|
38
38
|
require 'hexapdf/type/font_simple'
|
|
39
39
|
require 'hexapdf/font/type1'
|
|
40
|
+
require 'hexapdf/font/type1_wrapper'
|
|
40
41
|
|
|
41
42
|
module HexaPDF
|
|
42
43
|
module Type
|
|
@@ -105,6 +106,20 @@ module HexaPDF
|
|
|
105
106
|
define_field :Subtype, type: Symbol, required: true, default: :Type1
|
|
106
107
|
define_field :BaseFont, type: Symbol, required: true
|
|
107
108
|
|
|
109
|
+
# Overrides the default to provide a font wrapper in case none is set and the font is one of
|
|
110
|
+
# the standard fonts.
|
|
111
|
+
#
|
|
112
|
+
# See: Font#font_wrapper
|
|
113
|
+
def font_wrapper
|
|
114
|
+
if (tmp = super)
|
|
115
|
+
tmp
|
|
116
|
+
elsif StandardFonts.standard_font?(self[:BaseFont])
|
|
117
|
+
self.font_wrapper = HexaPDF::Font::Type1Wrapper.new(document,
|
|
118
|
+
StandardFonts.font(self[:BaseFont]),
|
|
119
|
+
pdf_object: self)
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
108
123
|
# Returns the unscaled width of the given code point in glyph units, or 0 if the width for the
|
|
109
124
|
# code point is missing.
|
|
110
125
|
def width(code)
|
|
@@ -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/type/form.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
|
|
@@ -126,13 +126,22 @@ module HexaPDF
|
|
|
126
126
|
# The canvas object is cached once it is created so that its graphics state is correctly
|
|
127
127
|
# retained without the need for parsing its contents.
|
|
128
128
|
#
|
|
129
|
+
# If the bounding box of the form XObject doesn't have its origin at (0, 0), the canvas origin
|
|
130
|
+
# is translated into the bottom left corner so that this detail doesn't matter when using the
|
|
131
|
+
# canvas. This means that the canvas' origin is always at the bottom left corner of the
|
|
132
|
+
# bounding box.
|
|
133
|
+
#
|
|
129
134
|
# *Note* that a canvas can only be retrieved for initially empty form XObjects!
|
|
130
135
|
def canvas
|
|
131
136
|
document.cache(@data, :canvas) do
|
|
132
137
|
unless stream.empty?
|
|
133
138
|
raise HexaPDF::Error, "Cannot create a canvas for a form XObjects with contents"
|
|
134
139
|
end
|
|
140
|
+
|
|
135
141
|
canvas = Content::Canvas.new(self)
|
|
142
|
+
if box.left != 0 || box.bottom != 0
|
|
143
|
+
canvas.save_graphics_state.translate(box.left, box.bottom)
|
|
144
|
+
end
|
|
136
145
|
self.stream = canvas.stream_data
|
|
137
146
|
set_filter(:FlateDecode)
|
|
138
147
|
canvas
|
|
@@ -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/type/image.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
|
|
@@ -169,6 +169,8 @@ module HexaPDF
|
|
|
169
169
|
result.writable = false if result.type == :png
|
|
170
170
|
end
|
|
171
171
|
|
|
172
|
+
result.writable = false if self[:SMask]
|
|
173
|
+
|
|
172
174
|
result
|
|
173
175
|
end
|
|
174
176
|
|
data/lib/hexapdf/type/info.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/type/names.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/type/page.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
|
|
@@ -358,6 +358,11 @@ module HexaPDF
|
|
|
358
358
|
# The canvas object is cached once it is created so that its graphics state is correctly
|
|
359
359
|
# retained without the need for parsing its contents.
|
|
360
360
|
#
|
|
361
|
+
# If the media box of the page doesn't have its origin at (0, 0), the canvas origin is
|
|
362
|
+
# translated into the bottom left corner so that this detail doesn't matter when using the
|
|
363
|
+
# canvas. This means that the canvas' origin is always at the bottom left corner of the media
|
|
364
|
+
# box.
|
|
365
|
+
#
|
|
361
366
|
# type::
|
|
362
367
|
# Can either be
|
|
363
368
|
# * :page for getting the canvas for the page itself (only valid for initially empty pages)
|
|
@@ -374,16 +379,25 @@ module HexaPDF
|
|
|
374
379
|
raise HexaPDF::Error, "Cannot get the canvas for a page with contents"
|
|
375
380
|
end
|
|
376
381
|
|
|
382
|
+
create_canvas = lambda do
|
|
383
|
+
Content::Canvas.new(self).tap do |canvas|
|
|
384
|
+
media_box = box(:media)
|
|
385
|
+
if media_box.left != 0 || media_box.bottom != 0
|
|
386
|
+
canvas.translate(media_box.left, media_box.bottom)
|
|
387
|
+
end
|
|
388
|
+
end
|
|
389
|
+
end
|
|
390
|
+
|
|
377
391
|
contents = self[:Contents]
|
|
378
392
|
if contents.nil?
|
|
379
|
-
page_canvas = document.cache(@data, :page_canvas,
|
|
393
|
+
page_canvas = document.cache(@data, :page_canvas, create_canvas.call)
|
|
380
394
|
self[:Contents] = document.add({Filter: :FlateDecode},
|
|
381
395
|
stream: page_canvas.stream_data)
|
|
382
396
|
end
|
|
383
397
|
|
|
384
398
|
if type == :overlay || type == :underlay
|
|
385
|
-
underlay_canvas = document.cache(@data, :underlay_canvas,
|
|
386
|
-
overlay_canvas = document.cache(@data, :overlay_canvas,
|
|
399
|
+
underlay_canvas = document.cache(@data, :underlay_canvas, create_canvas.call)
|
|
400
|
+
overlay_canvas = document.cache(@data, :overlay_canvas, create_canvas.call)
|
|
387
401
|
|
|
388
402
|
stream = HexaPDF::StreamData.new do
|
|
389
403
|
Fiber.yield(" q ")
|
|
@@ -396,11 +410,12 @@ module HexaPDF
|
|
|
396
410
|
underlay = document.add({Filter: :FlateDecode}, stream: stream)
|
|
397
411
|
|
|
398
412
|
stream = HexaPDF::StreamData.new do
|
|
399
|
-
Fiber.yield(" Q ")
|
|
413
|
+
Fiber.yield(" Q q ")
|
|
400
414
|
fiber = overlay_canvas.stream_data.fiber
|
|
401
415
|
while fiber.alive? && (data = fiber.resume)
|
|
402
416
|
Fiber.yield(data)
|
|
403
417
|
end
|
|
418
|
+
" Q "
|
|
404
419
|
end
|
|
405
420
|
overlay = document.add({Filter: :FlateDecode}, stream: stream)
|
|
406
421
|
|
|
@@ -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/dictionary'
|
|
38
|
+
require 'hexapdf/error'
|
|
38
39
|
|
|
39
40
|
module HexaPDF
|
|
40
41
|
module Type
|
|
@@ -159,20 +160,16 @@ module HexaPDF
|
|
|
159
160
|
end
|
|
160
161
|
|
|
161
162
|
# :call-seq:
|
|
162
|
-
# pages.delete_page(page)
|
|
163
|
-
# pages.delete_page(index)
|
|
163
|
+
# pages.delete_page(page)
|
|
164
|
+
# pages.delete_page(index)
|
|
164
165
|
#
|
|
165
166
|
# Deletes the given page or the page at the position specified by the zero-based index from
|
|
166
|
-
# the page tree and
|
|
167
|
-
# returned.
|
|
168
|
-
#
|
|
169
|
-
# Note that the page is *not* deleted from the document itself, only from the page tree! This
|
|
170
|
-
# also means that the /Parent entry of the page is set to +nil+ if deleted.
|
|
167
|
+
# the page tree and the document.
|
|
171
168
|
#
|
|
172
169
|
# Negative indices count backwards from the end, i.e. -1 is the last page.
|
|
173
170
|
def delete_page(page)
|
|
174
171
|
page = self.page(page) if page.kind_of?(Integer)
|
|
175
|
-
return
|
|
172
|
+
return unless page && !page.null? && page[:Parent]
|
|
176
173
|
|
|
177
174
|
parent = page[:Parent]
|
|
178
175
|
index = parent[:Kids].index {|kid| kid.data == page.data }
|
|
@@ -184,10 +181,10 @@ module HexaPDF
|
|
|
184
181
|
|
|
185
182
|
page[:Parent][:Kids].delete_at(index)
|
|
186
183
|
page.delete(:Parent)
|
|
184
|
+
document.delete(page)
|
|
187
185
|
ancestors.each {|node| node[:Count] -= 1 }
|
|
188
|
-
page
|
|
189
186
|
else
|
|
190
|
-
|
|
187
|
+
raise HexaPDF::Error, "Given page not found in page tree"
|
|
191
188
|
end
|
|
192
189
|
end
|
|
193
190
|
|
|
@@ -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
|
|
@@ -69,11 +69,10 @@ module HexaPDF
|
|
|
69
69
|
when :DeviceRGB, :DeviceGray, :DeviceCMYK
|
|
70
70
|
GlobalConfiguration.constantize('color_space.map', name).new
|
|
71
71
|
else
|
|
72
|
-
space_definition =
|
|
72
|
+
space_definition = (name == :Pattern ? name : self[:ColorSpace]&.[](name))
|
|
73
73
|
if space_definition.nil?
|
|
74
74
|
raise HexaPDF::Error, "Color space '#{name}' not found in the resources"
|
|
75
75
|
elsif space_definition.kind_of?(Array)
|
|
76
|
-
space_definition.map! {|item| document.deref(item) }
|
|
77
76
|
space_family = space_definition[0]
|
|
78
77
|
else
|
|
79
78
|
space_family = space_definition
|
|
@@ -168,6 +167,20 @@ module HexaPDF
|
|
|
168
167
|
object_setter(:Properties, 'P', dict)
|
|
169
168
|
end
|
|
170
169
|
|
|
170
|
+
# Returns the pattern dictionary stored under the given name.
|
|
171
|
+
#
|
|
172
|
+
# If the dictionary is not found, an error is raised.
|
|
173
|
+
def pattern(name)
|
|
174
|
+
object_getter(:Pattern, name)
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
# Adds the pattern dictionary to the resources and returns the name under which it is stored.
|
|
178
|
+
#
|
|
179
|
+
# If there already exists a name for the given dictionary, it is just returned.
|
|
180
|
+
def add_pattern(object)
|
|
181
|
+
object_setter(:Pattern, 'P', object)
|
|
182
|
+
end
|
|
183
|
+
|
|
171
184
|
private
|
|
172
185
|
|
|
173
186
|
# Helper method for returning an entry of a subdictionary.
|
data/lib/hexapdf/type/trailer.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
|
|
@@ -54,8 +54,7 @@ module HexaPDF
|
|
|
54
54
|
# HexaPDF::Revision object's trailer dictionary is always of this type. Only when a
|
|
55
55
|
# cross-reference stream is written is the trailer integrated into the stream's dictionary.
|
|
56
56
|
#
|
|
57
|
-
# See: PDF1.7 s7.5.5, s14.4
|
|
58
|
-
# XRefStream
|
|
57
|
+
# See: PDF1.7 s7.5.5, s14.4; XRefStream
|
|
59
58
|
class Trailer < Dictionary
|
|
60
59
|
|
|
61
60
|
define_type :XXTrailer
|
|
@@ -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
|
|
@@ -43,45 +43,59 @@ module HexaPDF
|
|
|
43
43
|
|
|
44
44
|
# Creates a bit field for managing the integer attribute +name+.
|
|
45
45
|
#
|
|
46
|
-
# The +mapping+ argument specifies the mapping of names to bit indices which allows
|
|
47
|
-
# either the bit name or its index when getting or setting. When using an unknown
|
|
48
|
-
# bit index, an error is raised.
|
|
46
|
+
# The +mapping+ argument specifies the mapping of names to zero-based bit indices which allows
|
|
47
|
+
# one to use either the bit name or its index when getting or setting. When using an unknown
|
|
48
|
+
# bit name or bit index, an error is raised.
|
|
49
49
|
#
|
|
50
50
|
# The calling class needs to respond to \#name and \#name= because these methods are used to
|
|
51
|
-
# get and set the raw integer value
|
|
51
|
+
# get and set the raw integer value; or provide custom method names using the +value_getter+
|
|
52
|
+
# and +value_setter+ arguments.
|
|
52
53
|
#
|
|
53
|
-
# After invoking the method the calling class has
|
|
54
|
+
# After invoking the method the calling class has four new instance methods:
|
|
54
55
|
#
|
|
55
56
|
# * NAME_values which returns an array of bit names representing the set bits.
|
|
56
57
|
# * NAME_include?(bit) which returns true if the given bit is set.
|
|
57
58
|
# * set_NAME(*bits, clear_existing: false) for setting the given bits.
|
|
59
|
+
# * unset_NAME(*bits) for clearing the given bits.
|
|
58
60
|
#
|
|
59
|
-
# The method names can be overridden using the arguments +lister+, +getter+ and
|
|
61
|
+
# The method names can be overridden using the arguments +lister+, +getter+, +setter+ and
|
|
62
|
+
# +unsetter+.
|
|
60
63
|
def bit_field(name, mapping, lister: "#{name}_values", getter: "#{name}_include?",
|
|
61
|
-
setter: "set_#{name}"
|
|
62
|
-
|
|
64
|
+
setter: "set_#{name}", unsetter: "unset_#{name}", value_getter: name,
|
|
65
|
+
value_setter: "self.#{name}")
|
|
63
66
|
mapping.default_proc = proc do |h, k|
|
|
64
67
|
if h.value?(k)
|
|
65
|
-
|
|
68
|
+
k
|
|
66
69
|
else
|
|
67
70
|
raise ArgumentError, "Invalid bit field name or index '#{k}' for #{self.name}##{name}"
|
|
68
71
|
end
|
|
69
72
|
end
|
|
70
|
-
value_getter = name
|
|
71
|
-
value_setter = "#{name}="
|
|
72
73
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
74
|
+
module_eval(<<-EOF, __FILE__, __LINE__ + 1)
|
|
75
|
+
#{name.upcase}_BIT_MAPPING = mapping.freeze
|
|
76
|
+
|
|
77
|
+
def #{lister}
|
|
78
|
+
self.class::#{name.upcase}_BIT_MAPPING.keys.map {|n| #{getter}(n) ? n : nil }.compact
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def #{getter}(bit)
|
|
82
|
+
(#{value_getter} || 0)[self.class::#{name.upcase}_BIT_MAPPING[bit]] == 1
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def #{setter}(*bits, clear_existing: false)
|
|
86
|
+
#{value_setter} = 0 if clear_existing || #{value_getter}.nil?
|
|
87
|
+
result = #{value_getter}
|
|
88
|
+
bits.each {|bit| result |= 1 << self.class::#{name.upcase}_BIT_MAPPING[bit] }
|
|
89
|
+
#{value_setter} = result
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def #{unsetter}(*bits)
|
|
93
|
+
result = #{value_getter} || 0
|
|
94
|
+
return if result == 0
|
|
95
|
+
bits.each {|bit| result &= ~(1 << self.class::#{name.upcase}_BIT_MAPPING[bit]) }
|
|
96
|
+
#{value_setter} = result
|
|
97
|
+
end
|
|
98
|
+
EOF
|
|
85
99
|
end
|
|
86
100
|
|
|
87
101
|
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
|
|
@@ -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
|