hexapdf 0.11.7 → 0.12.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|