hexapdf 0.10.0 → 0.11.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 +33 -0
- data/CONTRIBUTERS +1 -1
- data/Rakefile +35 -50
- data/VERSION +1 -1
- data/lib/hexapdf/cli.rb +4 -0
- data/lib/hexapdf/cli/command.rb +6 -2
- data/lib/hexapdf/cli/image2pdf.rb +141 -0
- data/lib/hexapdf/cli/info.rb +1 -1
- data/lib/hexapdf/cli/inspect.rb +32 -2
- data/lib/hexapdf/cli/modify.rb +1 -1
- data/lib/hexapdf/cli/optimize.rb +1 -1
- data/lib/hexapdf/cli/watermark.rb +130 -0
- data/lib/hexapdf/composer.rb +2 -2
- data/lib/hexapdf/configuration.rb +7 -1
- data/lib/hexapdf/content/canvas.rb +2 -2
- data/lib/hexapdf/content/graphic_object/arc.rb +2 -2
- data/lib/hexapdf/content/graphic_object/endpoint_arc.rb +2 -2
- data/lib/hexapdf/content/graphic_object/geom2d.rb +1 -1
- data/lib/hexapdf/content/graphic_object/solid_arc.rb +1 -1
- data/lib/hexapdf/dictionary.rb +11 -3
- data/lib/hexapdf/dictionary_fields.rb +32 -3
- data/lib/hexapdf/document.rb +7 -3
- data/lib/hexapdf/document/files.rb +1 -1
- data/lib/hexapdf/document/fonts.rb +21 -1
- data/lib/hexapdf/document/pages.rb +2 -2
- data/lib/hexapdf/encryption/standard_security_handler.rb +2 -2
- data/lib/hexapdf/font/cmap/parser.rb +1 -1
- data/lib/hexapdf/font/true_type/table/head.rb +2 -2
- data/lib/hexapdf/font/true_type/table/os2.rb +4 -4
- data/lib/hexapdf/font/true_type_wrapper.rb +16 -16
- data/lib/hexapdf/font/type1_wrapper.rb +16 -16
- data/lib/hexapdf/font_loader.rb +2 -0
- data/lib/hexapdf/font_loader/from_configuration.rb +5 -0
- data/lib/hexapdf/font_loader/standard14.rb +5 -0
- data/lib/hexapdf/image_loader/png.rb +1 -1
- data/lib/hexapdf/layout/box.rb +2 -2
- data/lib/hexapdf/layout/image_box.rb +1 -1
- data/lib/hexapdf/layout/style.rb +50 -24
- data/lib/hexapdf/layout/text_box.rb +1 -1
- data/lib/hexapdf/layout/text_fragment.rb +2 -2
- data/lib/hexapdf/layout/text_layouter.rb +14 -10
- data/lib/hexapdf/name_tree_node.rb +3 -3
- data/lib/hexapdf/number_tree_node.rb +3 -3
- data/lib/hexapdf/pdf_array.rb +207 -0
- data/lib/hexapdf/rectangle.rb +12 -12
- data/lib/hexapdf/serializer.rb +1 -1
- data/lib/hexapdf/stream.rb +6 -4
- data/lib/hexapdf/task/optimize.rb +3 -3
- data/lib/hexapdf/type.rb +2 -0
- data/lib/hexapdf/type/acro_form.rb +51 -0
- data/lib/hexapdf/type/acro_form/field.rb +129 -0
- data/lib/hexapdf/type/acro_form/form.rb +124 -0
- data/lib/hexapdf/type/action.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/annotation.rb +2 -2
- data/lib/hexapdf/type/annotations.rb +1 -0
- data/lib/hexapdf/type/annotations/link.rb +4 -15
- data/lib/hexapdf/type/annotations/markup_annotation.rb +2 -1
- data/lib/hexapdf/type/annotations/text.rb +3 -6
- data/lib/hexapdf/type/annotations/widget.rb +90 -0
- data/lib/hexapdf/type/catalog.rb +12 -9
- data/lib/hexapdf/type/cid_font.rb +3 -3
- data/lib/hexapdf/type/file_specification.rb +2 -2
- data/lib/hexapdf/type/font_descriptor.rb +5 -2
- data/lib/hexapdf/type/font_simple.rb +1 -1
- data/lib/hexapdf/type/font_type0.rb +1 -1
- data/lib/hexapdf/type/font_type3.rb +1 -1
- data/lib/hexapdf/type/form.rb +2 -2
- data/lib/hexapdf/type/graphics_state_parameter.rb +11 -6
- data/lib/hexapdf/type/icon_fit.rb +58 -0
- data/lib/hexapdf/type/image.rb +14 -8
- data/lib/hexapdf/type/info.rb +2 -1
- data/lib/hexapdf/type/page.rb +4 -4
- data/lib/hexapdf/type/page_tree_node.rb +3 -7
- data/lib/hexapdf/type/resources.rb +1 -1
- data/lib/hexapdf/type/trailer.rb +4 -4
- data/lib/hexapdf/type/viewer_preferences.rb +7 -4
- data/lib/hexapdf/type/xref_stream.rb +2 -2
- data/lib/hexapdf/utils/sorted_tree_node.rb +1 -1
- data/lib/hexapdf/version.rb +1 -1
- data/man/man1/hexapdf.1 +77 -8
- data/test/hexapdf/content/test_canvas.rb +2 -2
- data/test/hexapdf/content/test_processor.rb +3 -3
- data/test/hexapdf/document/test_files.rb +4 -4
- data/test/hexapdf/document/test_fonts.rb +13 -1
- data/test/hexapdf/document/test_images.rb +6 -6
- data/test/hexapdf/document/test_pages.rb +8 -8
- data/test/hexapdf/encryption/test_security_handler.rb +7 -7
- data/test/hexapdf/encryption/test_standard_security_handler.rb +5 -5
- data/test/hexapdf/font/test_true_type_wrapper.rb +2 -2
- data/test/hexapdf/font_loader/test_from_configuration.rb +4 -0
- data/test/hexapdf/font_loader/test_standard14.rb +10 -0
- data/test/hexapdf/image_loader/test_jpeg.rb +1 -1
- data/test/hexapdf/image_loader/test_png.rb +3 -3
- data/test/hexapdf/layout/test_box.rb +2 -2
- data/test/hexapdf/layout/test_frame.rb +1 -1
- data/test/hexapdf/layout/test_image_box.rb +1 -1
- data/test/hexapdf/layout/test_style.rb +18 -13
- data/test/hexapdf/layout/test_text_box.rb +1 -1
- data/test/hexapdf/layout/test_text_layouter.rb +11 -6
- data/test/hexapdf/task/test_dereference.rb +2 -2
- data/test/hexapdf/task/test_optimize.rb +11 -11
- data/test/hexapdf/test_composer.rb +1 -1
- data/test/hexapdf/test_dictionary.rb +10 -2
- data/test/hexapdf/test_dictionary_fields.rb +27 -3
- data/test/hexapdf/test_document.rb +16 -15
- data/test/hexapdf/test_importer.rb +4 -4
- data/test/hexapdf/test_object.rb +1 -1
- data/test/hexapdf/test_pdf_array.rb +162 -0
- data/test/hexapdf/test_rectangle.rb +3 -5
- data/test/hexapdf/test_serializer.rb +1 -1
- data/test/hexapdf/test_stream.rb +1 -0
- data/test/hexapdf/test_writer.rb +3 -3
- data/test/hexapdf/type/acro_form/test_field.rb +85 -0
- data/test/hexapdf/type/acro_form/test_form.rb +69 -0
- data/test/hexapdf/type/annotations/test_text.rb +2 -6
- data/test/hexapdf/type/annotations/test_widget.rb +24 -0
- data/test/hexapdf/type/test_annotation.rb +1 -1
- data/test/hexapdf/type/test_catalog.rb +1 -1
- data/test/hexapdf/type/test_cid_font.rb +3 -3
- data/test/hexapdf/type/test_font.rb +2 -2
- data/test/hexapdf/type/test_font_descriptor.rb +2 -1
- data/test/hexapdf/type/test_font_simple.rb +3 -3
- data/test/hexapdf/type/test_font_true_type.rb +6 -6
- data/test/hexapdf/type/test_font_type0.rb +5 -5
- data/test/hexapdf/type/test_font_type1.rb +8 -8
- data/test/hexapdf/type/test_font_type3.rb +4 -4
- data/test/hexapdf/type/test_image.rb +16 -12
- data/test/hexapdf/type/test_page.rb +11 -11
- data/test/hexapdf/type/test_page_tree_node.rb +20 -20
- data/test/hexapdf/type/test_resources.rb +6 -6
- data/test/hexapdf/type/test_trailer.rb +5 -2
- data/test/hexapdf/type/test_xref_stream.rb +1 -0
- data/test/hexapdf/utils/test_sorted_tree_node.rb +35 -35
- metadata +23 -7
- data/test/hexapdf/type/annotations/test_link.rb +0 -19
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# -*- encoding: utf-8; frozen_string_literal: true -*-
|
|
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-2019 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
|
+
# If the GNU Affero General Public License doesn't fit your need,
|
|
34
|
+
# commercial licenses are available at <https://gettalong.at/hexapdf/>.
|
|
35
|
+
#++
|
|
36
|
+
|
|
37
|
+
require 'hexapdf/dictionary'
|
|
38
|
+
require 'hexapdf/stream'
|
|
39
|
+
require 'hexapdf/utils/bit_field'
|
|
40
|
+
|
|
41
|
+
module HexaPDF
|
|
42
|
+
module Type
|
|
43
|
+
module AcroForm
|
|
44
|
+
|
|
45
|
+
# Represents the PDF's interactive form dictionary. It is linked from the catalog dictionary
|
|
46
|
+
# via the /AcroForm entry.
|
|
47
|
+
#
|
|
48
|
+
# See: PDF1.7 s12.7.2
|
|
49
|
+
class Form < Dictionary
|
|
50
|
+
|
|
51
|
+
extend Utils::BitField
|
|
52
|
+
|
|
53
|
+
define_type :XXAcroForm
|
|
54
|
+
|
|
55
|
+
define_field :Fields, type: PDFArray, required: true, version: '1.2'
|
|
56
|
+
define_field :NeedAppearances, type: Boolean, default: false
|
|
57
|
+
define_field :SigFlags, type: Integer, version: '1.3'
|
|
58
|
+
define_field :CO, type: PDFArray, version: '1.3'
|
|
59
|
+
define_field :DR, type: :Ressources
|
|
60
|
+
define_field :DA, type: String
|
|
61
|
+
define_field :XFA, type: [Stream, PDFArray], version: '1.5'
|
|
62
|
+
|
|
63
|
+
bit_field(:raw_signature_flags, {signatures_exist: 0, append_only: 1},
|
|
64
|
+
lister: "signature_flags", getter: "signature_flag?", setter: "signature_flag")
|
|
65
|
+
|
|
66
|
+
# Returns an array with all root fields that were found in the PDF document.
|
|
67
|
+
def find_root_fields
|
|
68
|
+
result = []
|
|
69
|
+
document.pages.each do |page|
|
|
70
|
+
page[:Annots].each do |annot|
|
|
71
|
+
if !annot.key?(:Parent) && annot.key?(:FT)
|
|
72
|
+
result << document.wrap(annot, type: :XXAcroFormField)
|
|
73
|
+
elsif annot.key?(:Parent)
|
|
74
|
+
field = annot[:Parent]
|
|
75
|
+
field = field[:Parent] while field[:Parent]
|
|
76
|
+
result << document.wrap(field, type: :XXAcroFormField)
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
result
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Finds all root fields and sets /Fields appropriately.
|
|
84
|
+
#
|
|
85
|
+
# See: #find_root_fields
|
|
86
|
+
def find_root_fields!
|
|
87
|
+
self[:Fields] = find_root_fields
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# :call-seq:
|
|
91
|
+
# acroform.each_field(terminal_only: true) {|field| block} -> acroform
|
|
92
|
+
# acroform.each_field(terminal_only: true) -> Enumerator
|
|
93
|
+
#
|
|
94
|
+
# Yields all terminal fields or all fields, depending on the +terminal_only+ argument.
|
|
95
|
+
def each_field(terminal_only: true)
|
|
96
|
+
return to_enum(__method__, terminal_only: terminal_only) unless block_given?
|
|
97
|
+
|
|
98
|
+
process_field = lambda do |field|
|
|
99
|
+
field = document.wrap(field, type: :XXAcroFormField)
|
|
100
|
+
yield(field) if field.terminal_field? || !terminal_only
|
|
101
|
+
field[:Kids].each(&process_field) unless field.terminal_field?
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
self[:Fields]&.each(&process_field)
|
|
105
|
+
self
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
private
|
|
109
|
+
|
|
110
|
+
# Helper method for bit field getter access.
|
|
111
|
+
def raw_signature_flags
|
|
112
|
+
self[:SigFlags]
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Helper method for bit field setter access.
|
|
116
|
+
def raw_signature_flags=(value)
|
|
117
|
+
self[:SigFlags] = value
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
data/lib/hexapdf/type/action.rb
CHANGED
|
@@ -51,7 +51,7 @@ module HexaPDF
|
|
|
51
51
|
|
|
52
52
|
define_field :Type, type: Symbol, default: type
|
|
53
53
|
define_field :S, type: Symbol, required: true
|
|
54
|
-
define_field :Next, type: [Dictionary,
|
|
54
|
+
define_field :Next, type: [Dictionary, PDFArray], version: '1.2'
|
|
55
55
|
|
|
56
56
|
end
|
|
57
57
|
|
|
@@ -46,7 +46,7 @@ module HexaPDF
|
|
|
46
46
|
class GoTo < Action
|
|
47
47
|
|
|
48
48
|
define_field :S, type: Symbol, required: true, default: :GoTo
|
|
49
|
-
define_field :D, type: [Symbol, PDFByteString,
|
|
49
|
+
define_field :D, type: [Symbol, PDFByteString, PDFArray], required: true
|
|
50
50
|
|
|
51
51
|
end
|
|
52
52
|
|
|
@@ -47,7 +47,7 @@ module HexaPDF
|
|
|
47
47
|
|
|
48
48
|
define_field :S, type: Symbol, required: true, default: :GoToR
|
|
49
49
|
define_field :F, type: :Filespec, required: true
|
|
50
|
-
define_field :D, type: [Symbol, PDFByteString,
|
|
50
|
+
define_field :D, type: [Symbol, PDFByteString, PDFArray], required: true
|
|
51
51
|
define_field :NewWindow, type: Boolean, version: '1.2'
|
|
52
52
|
|
|
53
53
|
end
|
|
@@ -52,7 +52,7 @@ module HexaPDF
|
|
|
52
52
|
|
|
53
53
|
define_field :F, type: PDFByteString, required: true
|
|
54
54
|
define_field :D, type: PDFByteString
|
|
55
|
-
define_field :O, type: String
|
|
55
|
+
define_field :O, type: String, default: 'open', allowed_values: ['open', 'print']
|
|
56
56
|
define_field :P, type: PDFByteString
|
|
57
57
|
|
|
58
58
|
end
|
|
@@ -60,8 +60,8 @@ module HexaPDF
|
|
|
60
60
|
define_field :F, type: Integer, default: 0, version: '1.1'
|
|
61
61
|
define_field :AP, type: Dictionary, version: '1.2'
|
|
62
62
|
define_field :AS, type: Symbol, version: '1.2'
|
|
63
|
-
define_field :Border, type:
|
|
64
|
-
define_field :C, type:
|
|
63
|
+
define_field :Border, type: PDFArray, default: [0, 0, 1]
|
|
64
|
+
define_field :C, type: PDFArray, version: '1.1'
|
|
65
65
|
define_field :StructParent, type: Integer, version: '1.3'
|
|
66
66
|
define_field :OC, type: Dictionary, version: '1.5'
|
|
67
67
|
|
|
@@ -47,6 +47,7 @@ module HexaPDF
|
|
|
47
47
|
autoload(:MarkupAnnotation, 'hexapdf/type/annotations/markup_annotation')
|
|
48
48
|
autoload(:Text, 'hexapdf/type/annotations/text')
|
|
49
49
|
autoload(:Link, 'hexapdf/type/annotations/link')
|
|
50
|
+
autoload(:Widget, 'hexapdf/type/annotations/widget')
|
|
50
51
|
|
|
51
52
|
end
|
|
52
53
|
|
|
@@ -48,24 +48,13 @@ module HexaPDF
|
|
|
48
48
|
|
|
49
49
|
define_field :Subtype, type: Symbol, required: true, default: :Link
|
|
50
50
|
define_field :A, type: Dictionary, version: '1.1'
|
|
51
|
-
define_field :Dest, type: [Symbol, PDFByteString,
|
|
52
|
-
define_field :H, type: Symbol, default: :I,
|
|
51
|
+
define_field :Dest, type: [Symbol, PDFByteString, PDFArray]
|
|
52
|
+
define_field :H, type: Symbol, default: :I, allowed_values: [:N, :I, :O, :P],
|
|
53
|
+
version: '1.2'
|
|
53
54
|
define_field :PA, type: Dictionary, version: '1.3'
|
|
54
|
-
define_field :QuadPoints, type:
|
|
55
|
+
define_field :QuadPoints, type: PDFArray, version: '1.6'
|
|
55
56
|
define_field :BS, type: Dictionary, version: '1.6'
|
|
56
57
|
|
|
57
|
-
private
|
|
58
|
-
|
|
59
|
-
HIGHLIGHTING_MODES = [:N, :I, :O, :P].freeze # :nodoc:
|
|
60
|
-
|
|
61
|
-
def perform_validation #:nodoc:
|
|
62
|
-
super
|
|
63
|
-
|
|
64
|
-
if key?(:H) && !HIGHLIGHTING_MODES.include?(self[:H])
|
|
65
|
-
yield("/H contains invalid value #{self[:H]}")
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
58
|
end
|
|
70
59
|
|
|
71
60
|
end
|
|
@@ -53,7 +53,8 @@ module HexaPDF
|
|
|
53
53
|
define_field :CreationDate, type: PDFDate, version: '1.5'
|
|
54
54
|
define_field :IRT, type: Dictionary, version: '1.5'
|
|
55
55
|
define_field :Subj, type: String, version: '1.5'
|
|
56
|
-
define_field :RT, type: Symbol, default: :R,
|
|
56
|
+
define_field :RT, type: Symbol, default: :R, allowed_values: [:R, :Group],
|
|
57
|
+
version: '1.6'
|
|
57
58
|
define_field :IT, type: Symbol, version: '1.6'
|
|
58
59
|
define_field :ExData, type: Dictionary, version: '1.7'
|
|
59
60
|
|
|
@@ -49,8 +49,9 @@ module HexaPDF
|
|
|
49
49
|
define_field :Subtype, type: Symbol, required: true, default: :Text
|
|
50
50
|
define_field :Open, type: Boolean, default: false
|
|
51
51
|
define_field :Name, type: Symbol, default: :Note
|
|
52
|
-
define_field :State, type: String, version: '1.5'
|
|
53
|
-
|
|
52
|
+
define_field :State, type: String, version: '1.5',
|
|
53
|
+
allowed_values: %w[Marked Unmarked Accepted Rejected Cancelled Completed None]
|
|
54
|
+
define_field :StateModel, type: String, allowed_values: ['Review', 'Marked'], version: '1.5'
|
|
54
55
|
|
|
55
56
|
private
|
|
56
57
|
|
|
@@ -64,10 +65,6 @@ module HexaPDF
|
|
|
64
65
|
def perform_validation #:nodoc:
|
|
65
66
|
super
|
|
66
67
|
|
|
67
|
-
if key?(:StateModel) && self[:StateModel] != "Review" && self[:StateModel] != "Marked"
|
|
68
|
-
yield("/StateModel contains invalid value #{self[:StateModel]}")
|
|
69
|
-
end
|
|
70
|
-
|
|
71
68
|
if key?(:State) && !key?(:StateModel)
|
|
72
69
|
state_model = STATE_TO_STATE_MODEL[self[:State]]
|
|
73
70
|
yield("/StateModel required if /State set", !state_model.nil?)
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# -*- encoding: utf-8; frozen_string_literal: true -*-
|
|
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-2019 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
|
+
# If the GNU Affero General Public License doesn't fit your need,
|
|
34
|
+
# commercial licenses are available at <https://gettalong.at/hexapdf/>.
|
|
35
|
+
#++
|
|
36
|
+
|
|
37
|
+
require 'hexapdf/type/annotation'
|
|
38
|
+
|
|
39
|
+
module HexaPDF
|
|
40
|
+
module Type
|
|
41
|
+
module Annotations
|
|
42
|
+
|
|
43
|
+
# Widget annotations are used by interactive forms to represent the appearance of fields and
|
|
44
|
+
# to manage user interactions.
|
|
45
|
+
#
|
|
46
|
+
# See: PDF1.7 s12.5.6.19, HexaPDF::Type::Annotation
|
|
47
|
+
class Widget < Annotation
|
|
48
|
+
|
|
49
|
+
# The dictionary used by the /MK key of the widget annotation.
|
|
50
|
+
class AppearanceCharacteristics < Dictionary
|
|
51
|
+
|
|
52
|
+
define_type :XXAppearanceCharacteristics
|
|
53
|
+
|
|
54
|
+
define_field :R, type: Integer, default: 0
|
|
55
|
+
define_field :BC, type: PDFArray
|
|
56
|
+
define_field :BG, type: PDFArray
|
|
57
|
+
define_field :CA, type: String
|
|
58
|
+
define_field :RC, type: String
|
|
59
|
+
define_field :AC, type: String
|
|
60
|
+
define_field :I, type: Stream
|
|
61
|
+
define_field :RI, type: Stream
|
|
62
|
+
define_field :IX, type: Stream
|
|
63
|
+
define_field :IF, type: :XXIconFit
|
|
64
|
+
define_field :TP, type: Integer, default: 0, allowed_values: [0, 1, 2, 3, 4, 5, 6]
|
|
65
|
+
|
|
66
|
+
private
|
|
67
|
+
|
|
68
|
+
def perform_validation #:nodoc:
|
|
69
|
+
super
|
|
70
|
+
|
|
71
|
+
if key?(:R) && self[:R] % 90 != 0
|
|
72
|
+
yield("Value of field R needs to be a multiple of 90")
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
define_field :Subtype, type: Symbol, required: true, default: :Widget
|
|
79
|
+
define_field :H, type: Symbol, allowed_values: [:N, :I, :O, :P, :T]
|
|
80
|
+
define_field :MK, type: :XXAppearanceCharacteristics
|
|
81
|
+
define_field :A, type: Dictionary, version: '1.1'
|
|
82
|
+
define_field :AA, type: Dictionary, version: '1.2'
|
|
83
|
+
define_field :BS, type: Dictionary, version: '1.2'
|
|
84
|
+
define_field :Parent, type: Dictionary
|
|
85
|
+
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
data/lib/hexapdf/type/catalog.rb
CHANGED
|
@@ -60,25 +60,28 @@ module HexaPDF
|
|
|
60
60
|
define_field :Names, type: :XXNames, version: '1.2'
|
|
61
61
|
define_field :Dests, type: Dictionary, version: '1.1'
|
|
62
62
|
define_field :ViewerPreferences, type: :XXViewerPreferences, version: '1.2'
|
|
63
|
-
define_field :PageLayout, type: Symbol, default: :SinglePage
|
|
64
|
-
|
|
63
|
+
define_field :PageLayout, type: Symbol, default: :SinglePage,
|
|
64
|
+
allowed_values: [:SinglePage, :OneColumn, :TwoColumnLeft, :TwoColumnRight,
|
|
65
|
+
:TwoPageLeft, :TwoPageRight]
|
|
66
|
+
define_field :PageMode, type: Symbol, default: :UseNone,
|
|
67
|
+
allowed_values: [:UseNone, :UseOutlines, :UseThumbs, :FullScreen, :UseOC, :UseAttachments]
|
|
65
68
|
define_field :Outlines, type: Dictionary, indirect: true
|
|
66
|
-
define_field :Threads, type:
|
|
67
|
-
define_field :OpenAction, type: [Dictionary,
|
|
69
|
+
define_field :Threads, type: PDFArray, version: '1.1'
|
|
70
|
+
define_field :OpenAction, type: [Dictionary, PDFArray], version: '1.1'
|
|
68
71
|
define_field :AA, type: Dictionary, version: '1.4'
|
|
69
72
|
define_field :URI, type: Dictionary, version: '1.1'
|
|
70
|
-
define_field :AcroForm, type:
|
|
73
|
+
define_field :AcroForm, type: :XXAcroForm, version: '1.2'
|
|
71
74
|
define_field :Metadata, type: Stream, indirect: true, version: '1.4'
|
|
72
75
|
define_field :StructTreeRoot, type: Dictionary, version: '1.3'
|
|
73
76
|
define_field :MarkInfo, type: Dictionary, version: '1.4'
|
|
74
77
|
define_field :Lang, type: String, version: '1.4'
|
|
75
78
|
define_field :SpiderInfo, type: Dictionary, version: '1.3'
|
|
76
|
-
define_field :OutputIntents, type:
|
|
79
|
+
define_field :OutputIntents, type: PDFArray, version: '1.4'
|
|
77
80
|
define_field :PieceInfo, type: Dictionary, version: '1.4'
|
|
78
81
|
define_field :OCProperties, type: Dictionary, version: '1.5'
|
|
79
82
|
define_field :Perms, type: Dictionary, version: '1.5'
|
|
80
83
|
define_field :Legal, type: Dictionary, version: '1.5'
|
|
81
|
-
define_field :Requirements, type:
|
|
84
|
+
define_field :Requirements, type: PDFArray, version: '1.7'
|
|
82
85
|
define_field :Collection, type: Dictionary, version: '1.7'
|
|
83
86
|
define_field :NeedsRendering, type: Boolean, version: '1.7'
|
|
84
87
|
|
|
@@ -91,7 +94,7 @@ module HexaPDF
|
|
|
91
94
|
#
|
|
92
95
|
# See: PageTreeNode
|
|
93
96
|
def pages
|
|
94
|
-
self[:Pages] ||= document.add(Type: :Pages)
|
|
97
|
+
self[:Pages] ||= document.add({Type: :Pages})
|
|
95
98
|
end
|
|
96
99
|
|
|
97
100
|
private
|
|
@@ -101,7 +104,7 @@ module HexaPDF
|
|
|
101
104
|
super
|
|
102
105
|
unless key?(:Pages)
|
|
103
106
|
yield("A PDF document needs a page tree", true)
|
|
104
|
-
value[:Pages] = document.add(Type: :Pages)
|
|
107
|
+
value[:Pages] = document.add({Type: :Pages})
|
|
105
108
|
value[:Pages].validate {|msg, correctable| yield(msg, correctable) }
|
|
106
109
|
end
|
|
107
110
|
end
|
|
@@ -51,9 +51,9 @@ module HexaPDF
|
|
|
51
51
|
define_field :CIDSystemInfo, type: Dictionary, required: true
|
|
52
52
|
define_field :FontDescriptor, type: :FontDescriptor, indirect: true, required: true
|
|
53
53
|
define_field :DW, type: Integer, default: DEFAULT_WIDTH
|
|
54
|
-
define_field :W, type:
|
|
55
|
-
define_field :DW2, type:
|
|
56
|
-
define_field :W2, type:
|
|
54
|
+
define_field :W, type: PDFArray
|
|
55
|
+
define_field :DW2, type: PDFArray, default: [880, -1100]
|
|
56
|
+
define_field :W2, type: PDFArray
|
|
57
57
|
|
|
58
58
|
# Returns the unscaled width of the given CID in glyph units, or 0 if the width for the CID is
|
|
59
59
|
# missing.
|
|
@@ -85,7 +85,7 @@ module HexaPDF
|
|
|
85
85
|
define_field :DOS, type: PDFByteString
|
|
86
86
|
define_field :Mac, type: PDFByteString
|
|
87
87
|
define_field :Unix, type: PDFByteString
|
|
88
|
-
define_field :ID, type:
|
|
88
|
+
define_field :ID, type: PDFArray
|
|
89
89
|
define_field :V, type: Boolean, version: '1.2'
|
|
90
90
|
define_field :EF, type: :XXFilespecEFDictionary, version: '1.7'
|
|
91
91
|
define_field :RF, type: Dictionary, version: '1.3'
|
|
@@ -192,7 +192,7 @@ module HexaPDF
|
|
|
192
192
|
self.path = name
|
|
193
193
|
|
|
194
194
|
self[:EF] ||= {}
|
|
195
|
-
ef_stream = self[:EF][:UF] = self[:EF][:F] = document.add(Type: :EmbeddedFile)
|
|
195
|
+
ef_stream = self[:EF][:UF] = self[:EF][:F] = document.add({Type: :EmbeddedFile})
|
|
196
196
|
stat = if file_or_io.kind_of?(String)
|
|
197
197
|
File.stat(file_or_io)
|
|
198
198
|
elsif file_or_io.respond_to?(:stat)
|
|
@@ -54,8 +54,11 @@ module HexaPDF
|
|
|
54
54
|
define_field :Type, type: Symbol, required: true, default: type
|
|
55
55
|
define_field :FontName, type: Symbol, required: true
|
|
56
56
|
define_field :FontFamily, type: PDFByteString, version: '1.5'
|
|
57
|
-
define_field :FontStretch, type: Symbol, version: '1.5'
|
|
58
|
-
|
|
57
|
+
define_field :FontStretch, type: Symbol, version: '1.5',
|
|
58
|
+
allowed_values: [:UltraCondensed, :ExtraCondensed, :Condensed, :SemiCondensed,
|
|
59
|
+
:Normal, :SemiExpanded, :Expanded, :ExtraExpanded, :UltraExpanded]
|
|
60
|
+
define_field :FontWeight, type: Numeric, version: '1.5',
|
|
61
|
+
allowed_values: [100, 200, 300, 400, 500, 600, 700, 800, 900]
|
|
59
62
|
define_field :Flags, type: Integer, required: true
|
|
60
63
|
define_field :FontBBox, type: Rectangle
|
|
61
64
|
define_field :ItalicAngle, type: Numeric, required: true
|
|
@@ -49,7 +49,7 @@ module HexaPDF
|
|
|
49
49
|
|
|
50
50
|
define_field :FirstChar, type: Integer
|
|
51
51
|
define_field :LastChar, type: Integer
|
|
52
|
-
define_field :Widths, type:
|
|
52
|
+
define_field :Widths, type: PDFArray
|
|
53
53
|
define_field :FontDescriptor, type: :FontDescriptor, indirect: true
|
|
54
54
|
define_field :Encoding, type: [Dictionary, Symbol]
|
|
55
55
|
|