hexapdf 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +76 -2
- data/CONTRIBUTERS +1 -1
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/examples/boxes.rb +68 -0
- data/examples/graphics.rb +12 -12
- data/examples/{text_box_alignment.rb → text_layouter_alignment.rb} +14 -14
- data/examples/text_layouter_inline_boxes.rb +66 -0
- data/examples/{text_box_line_wrapping.rb → text_layouter_line_wrapping.rb} +9 -10
- data/examples/{text_box_shapes.rb → text_layouter_shapes.rb} +58 -54
- data/examples/text_layouter_styling.rb +125 -0
- data/examples/truetype.rb +5 -7
- data/lib/hexapdf/cli/command.rb +1 -0
- data/lib/hexapdf/configuration.rb +170 -106
- data/lib/hexapdf/content/canvas.rb +41 -36
- data/lib/hexapdf/content/graphics_state.rb +15 -0
- data/lib/hexapdf/content/operator.rb +1 -1
- data/lib/hexapdf/dictionary.rb +20 -8
- data/lib/hexapdf/dictionary_fields.rb +8 -6
- data/lib/hexapdf/document.rb +25 -26
- data/lib/hexapdf/document/fonts.rb +4 -4
- data/lib/hexapdf/document/images.rb +2 -2
- data/lib/hexapdf/document/pages.rb +16 -16
- data/lib/hexapdf/encryption/security_handler.rb +41 -9
- data/lib/hexapdf/filter/flate_decode.rb +1 -1
- data/lib/hexapdf/filter/lzw_decode.rb +1 -1
- data/lib/hexapdf/filter/predictor.rb +7 -1
- data/lib/hexapdf/font/true_type/font.rb +20 -0
- data/lib/hexapdf/font/type1/font.rb +23 -0
- data/lib/hexapdf/font_loader.rb +1 -0
- data/lib/hexapdf/font_loader/from_configuration.rb +2 -3
- data/lib/hexapdf/font_loader/from_file.rb +65 -0
- data/lib/hexapdf/image_loader/png.rb +2 -2
- data/lib/hexapdf/layout.rb +3 -2
- data/lib/hexapdf/layout/box.rb +146 -0
- data/lib/hexapdf/layout/inline_box.rb +40 -31
- data/lib/hexapdf/layout/{line_fragment.rb → line.rb} +12 -13
- data/lib/hexapdf/layout/style.rb +630 -41
- data/lib/hexapdf/layout/text_fragment.rb +80 -12
- data/lib/hexapdf/layout/{text_box.rb → text_layouter.rb} +164 -109
- data/lib/hexapdf/number_tree_node.rb +1 -1
- data/lib/hexapdf/parser.rb +4 -1
- data/lib/hexapdf/revisions.rb +11 -4
- data/lib/hexapdf/stream.rb +8 -9
- data/lib/hexapdf/tokenizer.rb +5 -3
- data/lib/hexapdf/type.rb +3 -0
- data/lib/hexapdf/type/action.rb +56 -0
- data/lib/hexapdf/type/actions.rb +52 -0
- data/lib/hexapdf/type/actions/go_to.rb +52 -0
- data/lib/hexapdf/type/actions/go_to_r.rb +54 -0
- data/lib/hexapdf/type/actions/launch.rb +73 -0
- data/lib/hexapdf/type/actions/uri.rb +65 -0
- data/lib/hexapdf/type/annotation.rb +85 -0
- data/lib/hexapdf/type/annotations.rb +51 -0
- data/lib/hexapdf/type/annotations/link.rb +70 -0
- data/lib/hexapdf/type/annotations/markup_annotation.rb +70 -0
- data/lib/hexapdf/type/annotations/text.rb +81 -0
- data/lib/hexapdf/type/catalog.rb +3 -1
- data/lib/hexapdf/type/embedded_file.rb +6 -11
- data/lib/hexapdf/type/file_specification.rb +4 -6
- data/lib/hexapdf/type/font.rb +3 -1
- data/lib/hexapdf/type/font_descriptor.rb +18 -16
- data/lib/hexapdf/type/form.rb +3 -1
- data/lib/hexapdf/type/graphics_state_parameter.rb +3 -1
- data/lib/hexapdf/type/image.rb +4 -2
- data/lib/hexapdf/type/info.rb +2 -5
- data/lib/hexapdf/type/names.rb +2 -5
- data/lib/hexapdf/type/object_stream.rb +2 -1
- data/lib/hexapdf/type/page.rb +14 -1
- data/lib/hexapdf/type/page_tree_node.rb +9 -6
- data/lib/hexapdf/type/resources.rb +2 -5
- data/lib/hexapdf/type/trailer.rb +2 -5
- data/lib/hexapdf/type/viewer_preferences.rb +2 -5
- data/lib/hexapdf/type/xref_stream.rb +3 -1
- data/lib/hexapdf/version.rb +1 -1
- data/test/hexapdf/common_tokenizer_tests.rb +3 -1
- data/test/hexapdf/content/test_canvas.rb +29 -3
- data/test/hexapdf/content/test_graphics_state.rb +11 -0
- data/test/hexapdf/content/test_operator.rb +3 -2
- data/test/hexapdf/document/test_fonts.rb +8 -8
- data/test/hexapdf/document/test_images.rb +4 -12
- data/test/hexapdf/document/test_pages.rb +7 -7
- data/test/hexapdf/encryption/test_security_handler.rb +1 -5
- data/test/hexapdf/filter/test_predictor.rb +40 -12
- data/test/hexapdf/font/true_type/test_font.rb +16 -0
- data/test/hexapdf/font/type1/test_font.rb +30 -0
- data/test/hexapdf/font_loader/test_from_file.rb +29 -0
- data/test/hexapdf/font_loader/test_standard14.rb +4 -3
- data/test/hexapdf/layout/test_box.rb +104 -0
- data/test/hexapdf/layout/test_inline_box.rb +24 -10
- data/test/hexapdf/layout/{test_line_fragment.rb → test_line.rb} +9 -9
- data/test/hexapdf/layout/test_style.rb +519 -31
- data/test/hexapdf/layout/test_text_fragment.rb +136 -15
- data/test/hexapdf/layout/{test_text_box.rb → test_text_layouter.rb} +224 -144
- data/test/hexapdf/layout/test_text_shaper.rb +1 -1
- data/test/hexapdf/test_configuration.rb +12 -6
- data/test/hexapdf/test_dictionary.rb +27 -2
- data/test/hexapdf/test_dictionary_fields.rb +10 -1
- data/test/hexapdf/test_document.rb +14 -13
- data/test/hexapdf/test_parser.rb +12 -0
- data/test/hexapdf/test_revisions.rb +34 -0
- data/test/hexapdf/test_stream.rb +1 -1
- data/test/hexapdf/test_type.rb +18 -0
- data/test/hexapdf/test_writer.rb +2 -2
- data/test/hexapdf/type/actions/test_launch.rb +24 -0
- data/test/hexapdf/type/actions/test_uri.rb +23 -0
- data/test/hexapdf/type/annotations/test_link.rb +19 -0
- data/test/hexapdf/type/annotations/test_markup_annotation.rb +22 -0
- data/test/hexapdf/type/annotations/test_text.rb +38 -0
- data/test/hexapdf/type/test_annotation.rb +38 -0
- data/test/hexapdf/type/test_file_specification.rb +0 -7
- data/test/hexapdf/type/test_info.rb +0 -5
- data/test/hexapdf/type/test_page.rb +14 -0
- data/test/hexapdf/type/test_page_tree_node.rb +4 -1
- data/test/hexapdf/type/test_trailer.rb +0 -4
- data/test/test_helper.rb +6 -3
- metadata +36 -15
- data/examples/text_box_inline_boxes.rb +0 -56
- data/examples/text_box_styling.rb +0 -72
- data/test/hexapdf/type/test_embedded_file.rb +0 -16
- data/test/hexapdf/type/test_names.rb +0 -9
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
#--
|
|
4
|
+
# This file is part of HexaPDF.
|
|
5
|
+
#
|
|
6
|
+
# HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|
|
7
|
+
# Copyright (C) 2014-2017 Thomas Leitner
|
|
8
|
+
#
|
|
9
|
+
# HexaPDF is free software: you can redistribute it and/or modify it
|
|
10
|
+
# under the terms of the GNU Affero General Public License version 3 as
|
|
11
|
+
# published by the Free Software Foundation with the addition of the
|
|
12
|
+
# following permission added to Section 15 as permitted in Section 7(a):
|
|
13
|
+
# FOR ANY PART OF THE COVERED WORK IN WHICH THE COPYRIGHT IS OWNED BY
|
|
14
|
+
# THOMAS LEITNER, THOMAS LEITNER DISCLAIMS THE WARRANTY OF NON
|
|
15
|
+
# INFRINGEMENT OF THIRD PARTY RIGHTS.
|
|
16
|
+
#
|
|
17
|
+
# HexaPDF is distributed in the hope that it will be useful, but WITHOUT
|
|
18
|
+
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
|
|
20
|
+
# License for more details.
|
|
21
|
+
#
|
|
22
|
+
# You should have received a copy of the GNU Affero General Public License
|
|
23
|
+
# along with HexaPDF. If not, see <http://www.gnu.org/licenses/>.
|
|
24
|
+
#
|
|
25
|
+
# The interactive user interfaces in modified source and object code
|
|
26
|
+
# versions of HexaPDF must display Appropriate Legal Notices, as required
|
|
27
|
+
# under Section 5 of the GNU Affero General Public License version 3.
|
|
28
|
+
#
|
|
29
|
+
# In accordance with Section 7(b) of the GNU Affero General Public
|
|
30
|
+
# License, a covered work must retain the producer line in every PDF that
|
|
31
|
+
# is created or manipulated using HexaPDF.
|
|
32
|
+
#++
|
|
33
|
+
|
|
34
|
+
require 'hexapdf/dictionary'
|
|
35
|
+
require 'hexapdf/utils/bit_field'
|
|
36
|
+
|
|
37
|
+
module HexaPDF
|
|
38
|
+
module Type
|
|
39
|
+
|
|
40
|
+
# Annotations are used to associate objects like notes, sounds or movies with a location on a
|
|
41
|
+
# PDF page or allow the user to interact with a PDF document using a keyboard or mouse.
|
|
42
|
+
#
|
|
43
|
+
# See: PDF1.7 s12.5
|
|
44
|
+
class Annotation < Dictionary
|
|
45
|
+
|
|
46
|
+
extend Utils::BitField
|
|
47
|
+
|
|
48
|
+
define_type :Annot
|
|
49
|
+
|
|
50
|
+
define_field :Type, type: Symbol, default: self.type
|
|
51
|
+
define_field :Subtype, type: Symbol, required: true
|
|
52
|
+
define_field :Rect, type: Rectangle, required: true
|
|
53
|
+
define_field :Contents, type: String
|
|
54
|
+
define_field :P, type: Dictionary, version: '1.3'
|
|
55
|
+
define_field :NM, type: String, version: '1.4'
|
|
56
|
+
define_field :M, type: PDFDate, version: '1.1'
|
|
57
|
+
define_field :F, type: Integer, default: 0, version: '1.1'
|
|
58
|
+
define_field :AP, type: Dictionary, version: '1.2'
|
|
59
|
+
define_field :AS, type: Symbol, version: '1.2'
|
|
60
|
+
define_field :Border, type: Array, default: [0, 0, 1]
|
|
61
|
+
define_field :C, type: Array, version: '1.1'
|
|
62
|
+
define_field :StructParent, type: Integer, version: '1.3'
|
|
63
|
+
define_field :OC, type: Dictionary, version: '1.5'
|
|
64
|
+
|
|
65
|
+
bit_field(:raw_flags, {invisible: 0, hidden: 1, print: 2, no_zoom: 3, no_rotate: 4,
|
|
66
|
+
no_view: 5, read_only: 6, locked: 7, toggle_no_view: 8,
|
|
67
|
+
locked_contents: 9},
|
|
68
|
+
lister: "flags", getter: "flagged?", setter: "flag")
|
|
69
|
+
|
|
70
|
+
private
|
|
71
|
+
|
|
72
|
+
# Helper method for bit field getter access.
|
|
73
|
+
def raw_flags
|
|
74
|
+
self[:F]
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Helper method for bit field setter access.
|
|
78
|
+
def raw_flags=(value)
|
|
79
|
+
self[:F] = value
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
end
|
|
85
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
#--
|
|
4
|
+
# This file is part of HexaPDF.
|
|
5
|
+
#
|
|
6
|
+
# HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|
|
7
|
+
# Copyright (C) 2014-2017 Thomas Leitner
|
|
8
|
+
#
|
|
9
|
+
# HexaPDF is free software: you can redistribute it and/or modify it
|
|
10
|
+
# under the terms of the GNU Affero General Public License version 3 as
|
|
11
|
+
# published by the Free Software Foundation with the addition of the
|
|
12
|
+
# following permission added to Section 15 as permitted in Section 7(a):
|
|
13
|
+
# FOR ANY PART OF THE COVERED WORK IN WHICH THE COPYRIGHT IS OWNED BY
|
|
14
|
+
# THOMAS LEITNER, THOMAS LEITNER DISCLAIMS THE WARRANTY OF NON
|
|
15
|
+
# INFRINGEMENT OF THIRD PARTY RIGHTS.
|
|
16
|
+
#
|
|
17
|
+
# HexaPDF is distributed in the hope that it will be useful, but WITHOUT
|
|
18
|
+
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
|
|
20
|
+
# License for more details.
|
|
21
|
+
#
|
|
22
|
+
# You should have received a copy of the GNU Affero General Public License
|
|
23
|
+
# along with HexaPDF. If not, see <http://www.gnu.org/licenses/>.
|
|
24
|
+
#
|
|
25
|
+
# The interactive user interfaces in modified source and object code
|
|
26
|
+
# versions of HexaPDF must display Appropriate Legal Notices, as required
|
|
27
|
+
# under Section 5 of the GNU Affero General Public License version 3.
|
|
28
|
+
#
|
|
29
|
+
# In accordance with Section 7(b) of the GNU Affero General Public
|
|
30
|
+
# License, a covered work must retain the producer line in every PDF that
|
|
31
|
+
# is created or manipulated using HexaPDF.
|
|
32
|
+
#++
|
|
33
|
+
|
|
34
|
+
module HexaPDF
|
|
35
|
+
module Type
|
|
36
|
+
|
|
37
|
+
autoload(:Annotation, 'hexapdf/type/annotation')
|
|
38
|
+
|
|
39
|
+
# Namespace module for all PDF annotation dictionary types.
|
|
40
|
+
#
|
|
41
|
+
# See: PDF1.7 s12.5.6, Annotation
|
|
42
|
+
module Annotations
|
|
43
|
+
|
|
44
|
+
autoload(:MarkupAnnotation, 'hexapdf/type/annotations/markup_annotation')
|
|
45
|
+
autoload(:Text, 'hexapdf/type/annotations/text')
|
|
46
|
+
autoload(:Link, 'hexapdf/type/annotations/link')
|
|
47
|
+
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
#--
|
|
4
|
+
# This file is part of HexaPDF.
|
|
5
|
+
#
|
|
6
|
+
# HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|
|
7
|
+
# Copyright (C) 2014-2017 Thomas Leitner
|
|
8
|
+
#
|
|
9
|
+
# HexaPDF is free software: you can redistribute it and/or modify it
|
|
10
|
+
# under the terms of the GNU Affero General Public License version 3 as
|
|
11
|
+
# published by the Free Software Foundation with the addition of the
|
|
12
|
+
# following permission added to Section 15 as permitted in Section 7(a):
|
|
13
|
+
# FOR ANY PART OF THE COVERED WORK IN WHICH THE COPYRIGHT IS OWNED BY
|
|
14
|
+
# THOMAS LEITNER, THOMAS LEITNER DISCLAIMS THE WARRANTY OF NON
|
|
15
|
+
# INFRINGEMENT OF THIRD PARTY RIGHTS.
|
|
16
|
+
#
|
|
17
|
+
# HexaPDF is distributed in the hope that it will be useful, but WITHOUT
|
|
18
|
+
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
|
|
20
|
+
# License for more details.
|
|
21
|
+
#
|
|
22
|
+
# You should have received a copy of the GNU Affero General Public License
|
|
23
|
+
# along with HexaPDF. If not, see <http://www.gnu.org/licenses/>.
|
|
24
|
+
#
|
|
25
|
+
# The interactive user interfaces in modified source and object code
|
|
26
|
+
# versions of HexaPDF must display Appropriate Legal Notices, as required
|
|
27
|
+
# under Section 5 of the GNU Affero General Public License version 3.
|
|
28
|
+
#
|
|
29
|
+
# In accordance with Section 7(b) of the GNU Affero General Public
|
|
30
|
+
# License, a covered work must retain the producer line in every PDF that
|
|
31
|
+
# is created or manipulated using HexaPDF.
|
|
32
|
+
#++
|
|
33
|
+
|
|
34
|
+
require 'hexapdf/type/annotation'
|
|
35
|
+
|
|
36
|
+
module HexaPDF
|
|
37
|
+
module Type
|
|
38
|
+
module Annotations
|
|
39
|
+
|
|
40
|
+
# Link annotations represent a link to a destination elsewhere in the PDF document or an
|
|
41
|
+
# action to be performed.
|
|
42
|
+
#
|
|
43
|
+
# See: PDF1.7 s12.5.6.5, HexaPDF::Type::Annotation
|
|
44
|
+
class Link < Annotation
|
|
45
|
+
|
|
46
|
+
define_field :Subtype, type: Symbol, required: true, default: :Link
|
|
47
|
+
define_field :A, type: Dictionary, version: '1.1'
|
|
48
|
+
define_field :Dest, type: [Symbol, PDFByteString, Array]
|
|
49
|
+
define_field :H, type: Symbol, default: :I, version: '1.2'
|
|
50
|
+
define_field :PA, type: Dictionary, version: '1.3'
|
|
51
|
+
define_field :QuadPoints, type: Array, version: '1.6'
|
|
52
|
+
define_field :BS, type: Dictionary, version: '1.6'
|
|
53
|
+
|
|
54
|
+
private
|
|
55
|
+
|
|
56
|
+
HIGHLIGHTING_MODES = [:N, :I, :O, :P].freeze # :nodoc:
|
|
57
|
+
|
|
58
|
+
def perform_validation #:nodoc:
|
|
59
|
+
super
|
|
60
|
+
|
|
61
|
+
if key?(:H) && !HIGHLIGHTING_MODES.include?(self[:H])
|
|
62
|
+
yield("/H contains invalid value #{self[:H]}")
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
#--
|
|
4
|
+
# This file is part of HexaPDF.
|
|
5
|
+
#
|
|
6
|
+
# HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|
|
7
|
+
# Copyright (C) 2014-2017 Thomas Leitner
|
|
8
|
+
#
|
|
9
|
+
# HexaPDF is free software: you can redistribute it and/or modify it
|
|
10
|
+
# under the terms of the GNU Affero General Public License version 3 as
|
|
11
|
+
# published by the Free Software Foundation with the addition of the
|
|
12
|
+
# following permission added to Section 15 as permitted in Section 7(a):
|
|
13
|
+
# FOR ANY PART OF THE COVERED WORK IN WHICH THE COPYRIGHT IS OWNED BY
|
|
14
|
+
# THOMAS LEITNER, THOMAS LEITNER DISCLAIMS THE WARRANTY OF NON
|
|
15
|
+
# INFRINGEMENT OF THIRD PARTY RIGHTS.
|
|
16
|
+
#
|
|
17
|
+
# HexaPDF is distributed in the hope that it will be useful, but WITHOUT
|
|
18
|
+
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
|
|
20
|
+
# License for more details.
|
|
21
|
+
#
|
|
22
|
+
# You should have received a copy of the GNU Affero General Public License
|
|
23
|
+
# along with HexaPDF. If not, see <http://www.gnu.org/licenses/>.
|
|
24
|
+
#
|
|
25
|
+
# The interactive user interfaces in modified source and object code
|
|
26
|
+
# versions of HexaPDF must display Appropriate Legal Notices, as required
|
|
27
|
+
# under Section 5 of the GNU Affero General Public License version 3.
|
|
28
|
+
#
|
|
29
|
+
# In accordance with Section 7(b) of the GNU Affero General Public
|
|
30
|
+
# License, a covered work must retain the producer line in every PDF that
|
|
31
|
+
# is created or manipulated using HexaPDF.
|
|
32
|
+
#++
|
|
33
|
+
|
|
34
|
+
require 'hexapdf/type/annotation'
|
|
35
|
+
|
|
36
|
+
module HexaPDF
|
|
37
|
+
module Type
|
|
38
|
+
module Annotations
|
|
39
|
+
|
|
40
|
+
# Markup annotations are used to "mark up" a PDF document, most of the available PDF
|
|
41
|
+
# annotations are actually markup annotations.
|
|
42
|
+
#
|
|
43
|
+
# See: PDF1.7 s12.5.6.2, HexaPDF::Type::Annotation
|
|
44
|
+
class MarkupAnnotation < Annotation
|
|
45
|
+
|
|
46
|
+
define_field :T, type: String, version: '1.1'
|
|
47
|
+
define_field :Popup, type: :Annotation, version: '1.3'
|
|
48
|
+
define_field :CA, type: Numeric, default: 1.0, version: '1.4'
|
|
49
|
+
define_field :RC, type: [String, Stream], version: '1.5'
|
|
50
|
+
define_field :CreationDate, type: PDFDate, version: '1.5'
|
|
51
|
+
define_field :IRT, type: Dictionary, version: '1.5'
|
|
52
|
+
define_field :Subj, type: String, version: '1.5'
|
|
53
|
+
define_field :RT, type: Symbol, default: :R, version: '1.6'
|
|
54
|
+
define_field :IT, type: Symbol, version: '1.6'
|
|
55
|
+
define_field :ExData, type: Dictionary, version: '1.7'
|
|
56
|
+
|
|
57
|
+
private
|
|
58
|
+
|
|
59
|
+
def perform_validation #:nodoc:
|
|
60
|
+
super
|
|
61
|
+
if key?(:RT) && !key?(:IRT)
|
|
62
|
+
yield("/IRT required if /RT field is set")
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
#--
|
|
4
|
+
# This file is part of HexaPDF.
|
|
5
|
+
#
|
|
6
|
+
# HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|
|
7
|
+
# Copyright (C) 2014-2017 Thomas Leitner
|
|
8
|
+
#
|
|
9
|
+
# HexaPDF is free software: you can redistribute it and/or modify it
|
|
10
|
+
# under the terms of the GNU Affero General Public License version 3 as
|
|
11
|
+
# published by the Free Software Foundation with the addition of the
|
|
12
|
+
# following permission added to Section 15 as permitted in Section 7(a):
|
|
13
|
+
# FOR ANY PART OF THE COVERED WORK IN WHICH THE COPYRIGHT IS OWNED BY
|
|
14
|
+
# THOMAS LEITNER, THOMAS LEITNER DISCLAIMS THE WARRANTY OF NON
|
|
15
|
+
# INFRINGEMENT OF THIRD PARTY RIGHTS.
|
|
16
|
+
#
|
|
17
|
+
# HexaPDF is distributed in the hope that it will be useful, but WITHOUT
|
|
18
|
+
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
|
|
20
|
+
# License for more details.
|
|
21
|
+
#
|
|
22
|
+
# You should have received a copy of the GNU Affero General Public License
|
|
23
|
+
# along with HexaPDF. If not, see <http://www.gnu.org/licenses/>.
|
|
24
|
+
#
|
|
25
|
+
# The interactive user interfaces in modified source and object code
|
|
26
|
+
# versions of HexaPDF must display Appropriate Legal Notices, as required
|
|
27
|
+
# under Section 5 of the GNU Affero General Public License version 3.
|
|
28
|
+
#
|
|
29
|
+
# In accordance with Section 7(b) of the GNU Affero General Public
|
|
30
|
+
# License, a covered work must retain the producer line in every PDF that
|
|
31
|
+
# is created or manipulated using HexaPDF.
|
|
32
|
+
#++
|
|
33
|
+
|
|
34
|
+
require 'hexapdf/type/annotations/markup_annotation'
|
|
35
|
+
|
|
36
|
+
module HexaPDF
|
|
37
|
+
module Type
|
|
38
|
+
module Annotations
|
|
39
|
+
|
|
40
|
+
# Text annotations are "sticky notes" attached to a point in a PDF document. They act as if
|
|
41
|
+
# the NoZoom and NoRotate flags were always set.
|
|
42
|
+
#
|
|
43
|
+
# See: PDF1.7 s12.5.6.4, HexaPDF::Type::MarkupAnnotation
|
|
44
|
+
class Text < MarkupAnnotation
|
|
45
|
+
|
|
46
|
+
define_field :Subtype, type: Symbol, required: true, default: :Text
|
|
47
|
+
define_field :Open, type: Boolean, default: false
|
|
48
|
+
define_field :Name, type: Symbol, default: :Note
|
|
49
|
+
define_field :State, type: String, version: '1.5'
|
|
50
|
+
define_field :StateModel, type: String, version: '1.5'
|
|
51
|
+
|
|
52
|
+
private
|
|
53
|
+
|
|
54
|
+
# :nodoc:
|
|
55
|
+
STATE_TO_STATE_MODEL = {
|
|
56
|
+
"Marked" => "Marked", "Unmarked" => "Marked",
|
|
57
|
+
"Accepted" => "Review", "Rejected" => "Review", "Cancelled" => "Review",
|
|
58
|
+
"Completed" => "Review", "None" => "Review"
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
def perform_validation #:nodoc:
|
|
62
|
+
super
|
|
63
|
+
|
|
64
|
+
if key?(:StateModel) && self[:StateModel] != "Review" && self[:StateModel] != "Marked"
|
|
65
|
+
yield("/StateModel contains invalid value #{self[:StateModel]}")
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
if key?(:State) && !key?(:StateModel)
|
|
69
|
+
state_model = STATE_TO_STATE_MODEL[self[:State]]
|
|
70
|
+
yield("/StateModel required if /State set", !state_model.nil?)
|
|
71
|
+
self[:StateModel] = state_model
|
|
72
|
+
elsif key?(:State) && STATE_TO_STATE_MODEL[self[:State]] != self[:StateModel]
|
|
73
|
+
yield("/State and /StateModel don't agree", false)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
data/lib/hexapdf/type/catalog.rb
CHANGED
|
@@ -46,7 +46,9 @@ module HexaPDF
|
|
|
46
46
|
# See: PDF1.7 s7.7.2, Trailer
|
|
47
47
|
class Catalog < Dictionary
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
define_type :Catalog
|
|
50
|
+
|
|
51
|
+
define_field :Type, type: Symbol, required: true, default: self.type
|
|
50
52
|
define_field :Version, type: Symbol, version: '1.4'
|
|
51
53
|
define_field :Extensions, type: Dictionary, version: '1.7'
|
|
52
54
|
# Pages field is required but this is handled in #perform_validation
|
|
@@ -49,35 +49,30 @@ module HexaPDF
|
|
|
49
49
|
# The type used for the /Mac field of an EmbeddedFile::Parameters dictionary.
|
|
50
50
|
class MacInfo < Dictionary
|
|
51
51
|
|
|
52
|
+
define_type :XXEmbeddedFileParametersMacInfo
|
|
53
|
+
|
|
52
54
|
define_field :Subtype, type: Integer
|
|
53
55
|
define_field :Creator, type: Integer
|
|
54
56
|
define_field :ResFork, type: Stream
|
|
55
57
|
|
|
56
|
-
# Returns +:XXEmbeddedFileParametersMacInfo+
|
|
57
|
-
def type
|
|
58
|
-
:XXEmbeddedFileParametersMacInfo
|
|
59
|
-
end
|
|
60
|
-
|
|
61
58
|
end
|
|
62
59
|
|
|
63
60
|
# The type used for the /Params field of an EmbeddedFileStream.
|
|
64
61
|
class Parameters < Dictionary
|
|
65
62
|
|
|
63
|
+
define_type :XXEmbeddedFileParameters
|
|
64
|
+
|
|
66
65
|
define_field :Size, type: Integer
|
|
67
66
|
define_field :CreationDate, type: PDFDate
|
|
68
67
|
define_field :ModDate, type: PDFDate
|
|
69
68
|
define_field :Mac, type: :XXEmbeddedFileParametersMacInfo
|
|
70
69
|
define_field :CheckSum, type: PDFByteString
|
|
71
70
|
|
|
72
|
-
# Returns +:XXEmbeddedFileParameters+
|
|
73
|
-
def type
|
|
74
|
-
:XXEmbeddedFileParameters
|
|
75
|
-
end
|
|
76
|
-
|
|
77
71
|
end
|
|
78
72
|
|
|
73
|
+
define_type :EmbeddedFile
|
|
79
74
|
|
|
80
|
-
define_field :Type, type: Symbol, default:
|
|
75
|
+
define_field :Type, type: Symbol, default: self.type, version: '1.3'
|
|
81
76
|
define_field :Subtype, type: Symbol
|
|
82
77
|
define_field :Params, type: :XXEmbeddedFileParameters
|
|
83
78
|
|
|
@@ -63,21 +63,19 @@ module HexaPDF
|
|
|
63
63
|
# The type used for the /EF field of a FileSpecification
|
|
64
64
|
class EFDictionary < Dictionary
|
|
65
65
|
|
|
66
|
+
define_type :XXFilespecEFDictionary
|
|
67
|
+
|
|
66
68
|
define_field :F, type: :EmbeddedFile
|
|
67
69
|
define_field :UF, type: :EmbeddedFile
|
|
68
70
|
define_field :DOS, type: :EmbeddedFile
|
|
69
71
|
define_field :Mac, type: :EmbeddedFile
|
|
70
72
|
define_field :Unix, type: :EmbeddedFile
|
|
71
73
|
|
|
72
|
-
# Returns +:XXFilespecEFDictionary+
|
|
73
|
-
def type
|
|
74
|
-
:XXFilespecEFDictionary
|
|
75
|
-
end
|
|
76
|
-
|
|
77
74
|
end
|
|
78
75
|
|
|
76
|
+
define_type :Filespec
|
|
79
77
|
|
|
80
|
-
define_field :Type, type: Symbol, default:
|
|
78
|
+
define_field :Type, type: Symbol, default: self.type, required: true
|
|
81
79
|
define_field :FS, type: Symbol
|
|
82
80
|
define_field :F, type: PDFByteString
|
|
83
81
|
define_field :UF, type: String, version: '1.7'
|
data/lib/hexapdf/type/font.rb
CHANGED
|
@@ -42,7 +42,9 @@ module HexaPDF
|
|
|
42
42
|
# This class is the base class for all font objects, be it simple fonts or composite fonts.
|
|
43
43
|
class Font < Dictionary
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
define_type :Font
|
|
46
|
+
|
|
47
|
+
define_field :Type, type: Symbol, required: true, default: self.type
|
|
46
48
|
define_field :BaseFont, type: Symbol, required: true
|
|
47
49
|
define_field :ToUnicode, type: Stream, version: '1.2'
|
|
48
50
|
|