hexapdf 0.10.0 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +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
@@ -33,16 +33,16 @@ describe HexaPDF::Type::Page do
|
|
33
33
|
end
|
34
34
|
|
35
35
|
it "must always be indirect" do
|
36
|
-
page = @doc.add(Type: :Page)
|
36
|
+
page = @doc.add({Type: :Page})
|
37
37
|
page.must_be_indirect = false
|
38
38
|
assert(page.must_be_indirect?)
|
39
39
|
end
|
40
40
|
|
41
41
|
describe "[]" do
|
42
42
|
before do
|
43
|
-
@root = @doc.add(Type: :Pages)
|
44
|
-
@kid = @doc.add(Type: :Pages, Parent: @root)
|
45
|
-
@page = @doc.add(Type: :Page, Parent: @kid)
|
43
|
+
@root = @doc.add({Type: :Pages})
|
44
|
+
@kid = @doc.add({Type: :Pages, Parent: @root})
|
45
|
+
@page = @doc.add({Type: :Page, Parent: @kid})
|
46
46
|
end
|
47
47
|
|
48
48
|
it "works normal for non-inheritable fields" do
|
@@ -73,8 +73,8 @@ describe HexaPDF::Type::Page do
|
|
73
73
|
|
74
74
|
describe "validation" do
|
75
75
|
it "fails if a required inheritable field is not set" do
|
76
|
-
root = @doc.add(Type: :Pages)
|
77
|
-
page = @doc.add(Type: :Page, Parent: root)
|
76
|
+
root = @doc.add({Type: :Pages})
|
77
|
+
page = @doc.add({Type: :Page, Parent: root})
|
78
78
|
message = ''
|
79
79
|
refute(page.validate {|m, _| message = m })
|
80
80
|
assert_match(/inheritable.*MediaBox/i, message)
|
@@ -274,7 +274,7 @@ describe HexaPDF::Type::Page do
|
|
274
274
|
|
275
275
|
describe "resources" do
|
276
276
|
it "creates the resource dictionary if it is not found" do
|
277
|
-
page = @doc.add(Type: :Page, Parent: @doc.pages.root)
|
277
|
+
page = @doc.add({Type: :Page, Parent: @doc.pages.root})
|
278
278
|
resources = page.resources
|
279
279
|
assert_equal(:XXResources, resources.type)
|
280
280
|
assert_equal({}, resources.value)
|
@@ -282,7 +282,7 @@ describe HexaPDF::Type::Page do
|
|
282
282
|
|
283
283
|
it "returns the already used resource dictionary" do
|
284
284
|
@doc.pages.root[:Resources] = {Font: {F1: nil}}
|
285
|
-
page = @doc.pages.add(@doc.add(Type: :Page))
|
285
|
+
page = @doc.pages.add(@doc.add({Type: :Page}))
|
286
286
|
resources = page.resources
|
287
287
|
assert_equal(:XXResources, resources.type)
|
288
288
|
assert_equal(@doc.pages.root[:Resources], resources)
|
@@ -300,14 +300,14 @@ describe HexaPDF::Type::Page do
|
|
300
300
|
|
301
301
|
describe "index" do
|
302
302
|
it "returns the index of the page in the page tree" do
|
303
|
-
kid1 = @doc.add(Type: :Pages, Parent: @doc.pages.root, Count: 4)
|
303
|
+
kid1 = @doc.add({Type: :Pages, Parent: @doc.pages.root, Count: 4})
|
304
304
|
@doc.pages.root[:Kids] << kid1
|
305
305
|
|
306
|
-
kid11 = @doc.add(Type: :Pages, Parent: kid1)
|
306
|
+
kid11 = @doc.add({Type: :Pages, Parent: kid1})
|
307
307
|
page1 = kid11.add_page
|
308
308
|
kid1[:Kids] << kid11
|
309
309
|
page2 = kid1.add_page
|
310
|
-
kid12 = @doc.add(Type: :Pages, Parent: kid1)
|
310
|
+
kid12 = @doc.add({Type: :Pages, Parent: kid1})
|
311
311
|
page3 = kid12.add_page
|
312
312
|
page4 = kid12.add_page
|
313
313
|
kid1[:Kids] << kid12
|
@@ -7,7 +7,7 @@ require 'hexapdf/type/page_tree_node'
|
|
7
7
|
describe HexaPDF::Type::PageTreeNode do
|
8
8
|
before do
|
9
9
|
@doc = HexaPDF::Document.new
|
10
|
-
@root = @doc.add(Type: :Pages)
|
10
|
+
@root = @doc.add({Type: :Pages})
|
11
11
|
end
|
12
12
|
|
13
13
|
# Defines the following page tree:
|
@@ -26,12 +26,12 @@ describe HexaPDF::Type::PageTreeNode do
|
|
26
26
|
# @pages[6]
|
27
27
|
# @pages[7]
|
28
28
|
def define_multilevel_page_tree
|
29
|
-
@pages = Array.new(8) { @doc.add(Type: :Page) }
|
30
|
-
@kid1 = @doc.add(Type: :Pages, Parent: @root, Count: 5)
|
31
|
-
@kid11 = @doc.add(Type: :Pages, Parent: @kid1)
|
29
|
+
@pages = Array.new(8) { @doc.add({Type: :Page}) }
|
30
|
+
@kid1 = @doc.add({Type: :Pages, Parent: @root, Count: 5})
|
31
|
+
@kid11 = @doc.add({Type: :Pages, Parent: @kid1})
|
32
32
|
@kid11.add_page(@pages[0])
|
33
33
|
@kid11.add_page(@pages[1])
|
34
|
-
@kid12 = @doc.add(Type: :Pages, Parent: @kid1)
|
34
|
+
@kid12 = @doc.add({Type: :Pages, Parent: @kid1})
|
35
35
|
@kid12.add_page(@pages[2])
|
36
36
|
@kid12.add_page(@pages[3])
|
37
37
|
@kid12.add_page(@pages[4])
|
@@ -41,7 +41,7 @@ describe HexaPDF::Type::PageTreeNode do
|
|
41
41
|
@pages[5][:Parent] = @root
|
42
42
|
@root[:Kids] << @pages[5]
|
43
43
|
|
44
|
-
@kid2 = @doc.add(Type: :Pages, Parent: @root)
|
44
|
+
@kid2 = @doc.add({Type: :Pages, Parent: @root})
|
45
45
|
@kid2.add_page(@pages[6])
|
46
46
|
@kid2.add_page(@pages[7])
|
47
47
|
@root[:Kids] << @kid2
|
@@ -49,7 +49,7 @@ describe HexaPDF::Type::PageTreeNode do
|
|
49
49
|
end
|
50
50
|
|
51
51
|
it "must always be indirect" do
|
52
|
-
pages = @doc.add(Type: :Pages)
|
52
|
+
pages = @doc.add({Type: :Pages})
|
53
53
|
pages.must_be_indirect = false
|
54
54
|
assert(pages.must_be_indirect?)
|
55
55
|
end
|
@@ -84,7 +84,7 @@ describe HexaPDF::Type::PageTreeNode do
|
|
84
84
|
@doc.config['page.default_media_box'] = :A4
|
85
85
|
@doc.config['page.default_media_orientation'] = :landscape
|
86
86
|
page = @root.insert_page(3)
|
87
|
-
assert_equal([page], @root[:Kids])
|
87
|
+
assert_equal([page], @root[:Kids].value)
|
88
88
|
assert_equal(1, @root.page_count)
|
89
89
|
assert_equal(:Page, page[:Type])
|
90
90
|
assert_equal(@root, page[:Parent])
|
@@ -101,9 +101,9 @@ describe HexaPDF::Type::PageTreeNode do
|
|
101
101
|
end
|
102
102
|
|
103
103
|
it "inserts the provided page at the given index" do
|
104
|
-
page = @doc.wrap(Type: :Page)
|
104
|
+
page = @doc.wrap({Type: :Page})
|
105
105
|
assert_equal(page, @root.insert_page(3, page))
|
106
|
-
assert_equal([page], @root[:Kids])
|
106
|
+
assert_equal([page], @root[:Kids].value)
|
107
107
|
assert_equal(@root, page[:Parent])
|
108
108
|
refute(@root.value.key?(:Parent))
|
109
109
|
end
|
@@ -112,37 +112,37 @@ describe HexaPDF::Type::PageTreeNode do
|
|
112
112
|
page3 = @root.insert_page(5)
|
113
113
|
page1 = @root.insert_page(0)
|
114
114
|
page2 = @root.insert_page(1)
|
115
|
-
assert_equal([page1, page2, page3], @root[:Kids])
|
115
|
+
assert_equal([page1, page2, page3], @root[:Kids].value)
|
116
116
|
assert_equal(3, @root.page_count)
|
117
117
|
end
|
118
118
|
|
119
119
|
it "inserts multiple pages correctly in a multilevel page tree" do
|
120
120
|
define_multilevel_page_tree
|
121
121
|
page = @root.insert_page(2)
|
122
|
-
assert_equal([@pages[0], @pages[1], page], @kid11[:Kids])
|
122
|
+
assert_equal([@pages[0], @pages[1], page], @kid11[:Kids].value)
|
123
123
|
assert_equal(3, @kid11.page_count)
|
124
124
|
assert_equal(6, @kid1.page_count)
|
125
125
|
assert_equal(9, @root.page_count)
|
126
126
|
|
127
127
|
page = @root.insert_page(4)
|
128
|
-
assert_equal([@pages[2], page, @pages[3], @pages[4]], @kid12[:Kids])
|
128
|
+
assert_equal([@pages[2], page, @pages[3], @pages[4]], @kid12[:Kids].value)
|
129
129
|
assert_equal(4, @kid12.page_count)
|
130
130
|
assert_equal(7, @kid1.page_count)
|
131
131
|
assert_equal(10, @root.page_count)
|
132
132
|
|
133
133
|
page = @root.insert_page(8)
|
134
|
-
assert_equal([@kid1, @pages[5], page, @kid2], @root[:Kids])
|
134
|
+
assert_equal([@kid1, @pages[5], page, @kid2], @root[:Kids].value)
|
135
135
|
assert_equal(11, @root.page_count)
|
136
136
|
|
137
137
|
page = @root.insert_page(100)
|
138
|
-
assert_equal([@kid1, @pages[5], @root[:Kids][2], @kid2, page], @root[:Kids])
|
138
|
+
assert_equal([@kid1, @pages[5], @root[:Kids][2], @kid2, page], @root[:Kids].value)
|
139
139
|
assert_equal(12, @root.page_count)
|
140
140
|
end
|
141
141
|
|
142
142
|
it "allows negative indices to be specified" do
|
143
143
|
define_multilevel_page_tree
|
144
144
|
page = @root.insert_page(-1)
|
145
|
-
assert_equal(page, @root[:Kids]
|
145
|
+
assert_equal(page, @root[:Kids][-1])
|
146
146
|
|
147
147
|
page = @root.insert_page(-4)
|
148
148
|
assert_equal(page, @root[:Kids][2])
|
@@ -183,14 +183,14 @@ describe HexaPDF::Type::PageTreeNode do
|
|
183
183
|
end
|
184
184
|
|
185
185
|
it "does nothing if the page is not in its parent's /Kids array" do
|
186
|
-
@kid12[:Kids].
|
186
|
+
@kid12[:Kids].delete_at(0)
|
187
187
|
assert_nil(@root.delete_page(@pages[2]))
|
188
188
|
assert_equal(8, @root.page_count)
|
189
189
|
end
|
190
190
|
|
191
191
|
it "does nothing if the page is not part of the page tree" do
|
192
|
-
pages = @doc.add(Type: :Pages, Count: 1)
|
193
|
-
page = @doc.add(Type: :Page, Parent: pages)
|
192
|
+
pages = @doc.add({Type: :Pages, Count: 1})
|
193
|
+
page = @doc.add({Type: :Page, Parent: pages})
|
194
194
|
pages[:Kids] << page
|
195
195
|
|
196
196
|
assert_nil(@root.delete_page(page))
|
@@ -253,7 +253,7 @@ describe HexaPDF::Type::PageTreeNode do
|
|
253
253
|
end
|
254
254
|
assert(@root.validate)
|
255
255
|
assert_equal(2, @kid12[:Count])
|
256
|
-
assert_equal([@pages[2], @pages[4]], @kid12[:Kids])
|
256
|
+
assert_equal([@pages[2], @pages[4]], @kid12[:Kids].value)
|
257
257
|
end
|
258
258
|
|
259
259
|
it "needs at least one page node" do
|
@@ -26,7 +26,7 @@ describe HexaPDF::Type::Resources do
|
|
26
26
|
end
|
27
27
|
|
28
28
|
it "returns the universal color space for unknown color spaces, with resolved references" do
|
29
|
-
data = @doc.add(Some: :data)
|
29
|
+
data = @doc.add({Some: :data})
|
30
30
|
@res[:ColorSpace] = {CSName: [:SomeUnknownColorSpace,
|
31
31
|
HexaPDF::Reference.new(data.oid, data.gen)]}
|
32
32
|
color_space = @res.color_space(:CSName)
|
@@ -59,7 +59,7 @@ describe HexaPDF::Type::Resources do
|
|
59
59
|
end
|
60
60
|
|
61
61
|
it "doesn't add the same color space twice" do
|
62
|
-
object = @doc.add(some: :data)
|
62
|
+
object = @doc.add({some: :data})
|
63
63
|
@res[:ColorSpace] = {space: [:DeviceN, HexaPDF::Reference.new(object.oid, object.gen)]}
|
64
64
|
space = HexaPDF::Content::ColorSpace::Universal.new([:DeviceN, object])
|
65
65
|
name = @res.add_color_space(space)
|
@@ -90,14 +90,14 @@ describe HexaPDF::Type::Resources do
|
|
90
90
|
|
91
91
|
describe "private object_setter" do
|
92
92
|
it "adds the object to the specified subdictionary" do
|
93
|
-
obj = @doc.add(some: :xobject)
|
93
|
+
obj = @doc.add({some: :xobject})
|
94
94
|
name = @res.add_xobject(obj)
|
95
95
|
assert(@res[:XObject].key?(name))
|
96
96
|
assert_equal(obj, @res[:XObject][name])
|
97
97
|
end
|
98
98
|
|
99
99
|
it "doesn't add the same object twice" do
|
100
|
-
obj = @doc.add(some: :xobject)
|
100
|
+
obj = @doc.add({some: :xobject})
|
101
101
|
name = @res.add_xobject(obj)
|
102
102
|
name2 = @res.add_xobject(obj)
|
103
103
|
assert_equal(name, name2)
|
@@ -171,13 +171,13 @@ describe HexaPDF::Type::Resources do
|
|
171
171
|
describe "validation" do
|
172
172
|
it "assigns the default value if ProcSet is not set" do
|
173
173
|
@res.validate
|
174
|
-
assert_equal([:PDF, :Text, :ImageB, :ImageC, :ImageI], @res[:ProcSet])
|
174
|
+
assert_equal([:PDF, :Text, :ImageB, :ImageC, :ImageI], @res[:ProcSet].value)
|
175
175
|
end
|
176
176
|
|
177
177
|
it "removes invalid procedure set names from ProcSet" do
|
178
178
|
@res[:ProcSet] = [:PDF, :Unknown]
|
179
179
|
@res.validate
|
180
|
-
assert_equal([:PDF], @res[:ProcSet])
|
180
|
+
assert_equal([:PDF], @res[:ProcSet].value)
|
181
181
|
end
|
182
182
|
end
|
183
183
|
end
|
@@ -11,7 +11,10 @@ describe HexaPDF::Type::Trailer do
|
|
11
11
|
@doc.instance_variable_set(:@version, '1.2')
|
12
12
|
def (@doc).version=(v); @version = v; end
|
13
13
|
def (@doc).deref(obj); obj; end
|
14
|
-
def (@doc).wrap(obj, *)
|
14
|
+
def (@doc).wrap(obj, *)
|
15
|
+
(obj.kind_of?(Array) ? HexaPDF::PDFArray : HexaPDF::Dictionary).
|
16
|
+
new(obj, oid: (obj.oid rescue 0))
|
17
|
+
end
|
15
18
|
root = HexaPDF::Dictionary.new({}, oid: 3)
|
16
19
|
@obj = HexaPDF::Type::Trailer.new({Size: 10, Root: root}, document: @doc)
|
17
20
|
end
|
@@ -37,7 +40,7 @@ describe HexaPDF::Type::Trailer do
|
|
37
40
|
describe "ID field" do
|
38
41
|
it "sets a random ID" do
|
39
42
|
@obj.set_random_id
|
40
|
-
assert_kind_of(
|
43
|
+
assert_kind_of(HexaPDF::PDFArray, @obj[:ID])
|
41
44
|
assert_equal(2, @obj[:ID].length)
|
42
45
|
assert_same(@obj[:ID][0], @obj[:ID][1])
|
43
46
|
assert_kind_of(String, @obj[:ID][0])
|
@@ -13,9 +13,9 @@ describe HexaPDF::Utils::SortedTreeNode do
|
|
13
13
|
|
14
14
|
def add_multilevel_entries
|
15
15
|
@kid11 = @doc.add({Limits: ['c', 'f'], Names: ['c', 1, 'f', 1]}, type: HexaPDF::NameTreeNode)
|
16
|
-
@kid12 = @doc.add(Limits: ['i', 'm'], Names: ['i', 1, 'm', 1])
|
16
|
+
@kid12 = @doc.add({Limits: ['i', 'm'], Names: ['i', 1, 'm', 1]})
|
17
17
|
ref = HexaPDF::Reference.new(@kid11.oid, @kid11.gen)
|
18
|
-
@kid1 = @doc.add(Limits: ['c', 'm'], Kids: [ref, @kid12])
|
18
|
+
@kid1 = @doc.add({Limits: ['c', 'm'], Kids: [ref, @kid12]})
|
19
19
|
@kid21 = @doc.add({Limits: ['o', 'q'], Names: ['o', 1, 'q', 1]}, type: HexaPDF::NameTreeNode)
|
20
20
|
@kid221 = @doc.add({Limits: ['s', 'u'], Names: ['s', 1, 'u', 1]}, type: HexaPDF::NameTreeNode)
|
21
21
|
@kid22 = @doc.add({Limits: ['s', 'u'], Kids: [@kid221]}, type: HexaPDF::NameTreeNode)
|
@@ -32,20 +32,20 @@ describe HexaPDF::Utils::SortedTreeNode do
|
|
32
32
|
@root.add_entry('c', 1)
|
33
33
|
@root.add_entry('a', 2)
|
34
34
|
@root.add_entry('e', 3)
|
35
|
-
assert_equal(['a', 2, 'c', 1, 'e', 3], @root[:Names])
|
35
|
+
assert_equal(['a', 2, 'c', 1, 'e', 3], @root[:Names].value)
|
36
36
|
refute(@root[:Limits])
|
37
37
|
end
|
38
38
|
|
39
39
|
it "replaces an existing entry if overwrite is true" do
|
40
40
|
assert(@root.add_entry('a', 2))
|
41
41
|
assert(@root.add_entry('a', 5))
|
42
|
-
assert_equal(['a', 5], @root[:Names])
|
42
|
+
assert_equal(['a', 5], @root[:Names].value)
|
43
43
|
end
|
44
44
|
|
45
45
|
it "doesn't replace an existing entry if overwrite is false" do
|
46
46
|
assert(@root.add_entry('a', 2))
|
47
47
|
refute(@root.add_entry('a', 5, overwrite: false))
|
48
|
-
assert_equal(['a', 2], @root[:Names])
|
48
|
+
assert_equal(['a', 2], @root[:Names].value)
|
49
49
|
end
|
50
50
|
|
51
51
|
it "works with one level of intermediate nodes" do
|
@@ -57,10 +57,10 @@ describe HexaPDF::Utils::SortedTreeNode do
|
|
57
57
|
@root.add_entry('p', 1)
|
58
58
|
@root.add_entry('r', 1)
|
59
59
|
@root.add_entry('u', 1)
|
60
|
-
assert_equal(['c', 'm'], kid1[:Limits])
|
61
|
-
assert_equal(['c', 1, 'd', 1, 'm', 1], kid1[:Names])
|
62
|
-
assert_equal(['p', 'u'], kid2[:Limits])
|
63
|
-
assert_equal(['p', 1, 'r', 1, 't', 1, 'u', 1], kid2[:Names])
|
60
|
+
assert_equal(['c', 'm'], kid1[:Limits].value)
|
61
|
+
assert_equal(['c', 1, 'd', 1, 'm', 1], kid1[:Names].value)
|
62
|
+
assert_equal(['p', 'u'], kid2[:Limits].value)
|
63
|
+
assert_equal(['p', 1, 'r', 1, 't', 1, 'u', 1], kid2[:Names].value)
|
64
64
|
end
|
65
65
|
|
66
66
|
it "works with multiple levels of intermediate nodes" do
|
@@ -74,16 +74,16 @@ describe HexaPDF::Utils::SortedTreeNode do
|
|
74
74
|
@root.add_entry('r', 1)
|
75
75
|
@root.add_entry('v', 1)
|
76
76
|
assert_equal(['a', 'm'], @kid1[:Limits])
|
77
|
-
assert_equal(['a', 'f'], @kid11[:Limits])
|
78
|
-
assert_equal(['a', 1, 'c', 1, 'e', 1, 'f', 1], @kid11[:Names])
|
77
|
+
assert_equal(['a', 'f'], @kid11[:Limits].value)
|
78
|
+
assert_equal(['a', 1, 'c', 1, 'e', 1, 'f', 1], @kid11[:Names].value)
|
79
79
|
assert_equal(['g', 'm'], @kid12[:Limits])
|
80
80
|
assert_equal(['g', 1, 'i', 1, 'j', 1, 'm', 1], @kid12[:Names])
|
81
|
-
assert_equal(['n', 'v'], @kid2[:Limits])
|
82
|
-
assert_equal(['n', 'q'], @kid21[:Limits])
|
83
|
-
assert_equal(['n', 1, 'o', 1, 'p', 1, 'q', 1], @kid21[:Names])
|
84
|
-
assert_equal(['r', 'v'], @kid22[:Limits])
|
85
|
-
assert_equal(['r', 'v'], @kid221[:Limits])
|
86
|
-
assert_equal(['r', 1, 's', 1, 'u', 1, 'v', 1], @kid221[:Names])
|
81
|
+
assert_equal(['n', 'v'], @kid2[:Limits].value)
|
82
|
+
assert_equal(['n', 'q'], @kid21[:Limits].value)
|
83
|
+
assert_equal(['n', 1, 'o', 1, 'p', 1, 'q', 1], @kid21[:Names].value)
|
84
|
+
assert_equal(['r', 'v'], @kid22[:Limits].value)
|
85
|
+
assert_equal(['r', 'v'], @kid221[:Limits].value)
|
86
|
+
assert_equal(['r', 1, 's', 1, 'u', 1, 'v', 1], @kid221[:Names].value)
|
87
87
|
end
|
88
88
|
|
89
89
|
it "splits nodes if needed" do
|
@@ -92,18 +92,18 @@ describe HexaPDF::Utils::SortedTreeNode do
|
|
92
92
|
refute(@root.value.key?(:Limits))
|
93
93
|
refute(@root.value.key?(:Names))
|
94
94
|
assert_equal(6, @root[:Kids].size)
|
95
|
-
assert_equal(['a', 1, 'b', 1], @root[:Kids][0][:Names])
|
96
|
-
assert_equal(['a', 'b'], @root[:Kids][0][:Limits])
|
97
|
-
assert_equal(['c', 1, 'd', 1], @root[:Kids][1][:Names])
|
98
|
-
assert_equal(['c', 'd'], @root[:Kids][1][:Limits])
|
99
|
-
assert_equal(['e', 1, 'f', 1], @root[:Kids][2][:Names])
|
100
|
-
assert_equal(['e', 'f'], @root[:Kids][2][:Limits])
|
101
|
-
assert_equal(['g', 1, 'h', 1, 'i', 1], @root[:Kids][3][:Names])
|
102
|
-
assert_equal(['g', 'i'], @root[:Kids][3][:Limits])
|
103
|
-
assert_equal(['j', 1, 'k', 1], @root[:Kids][4][:Names])
|
104
|
-
assert_equal(['j', 'k'], @root[:Kids][4][:Limits])
|
105
|
-
assert_equal(['l', 1, 'm', 1], @root[:Kids][5][:Names])
|
106
|
-
assert_equal(['l', 'm'], @root[:Kids][5][:Limits])
|
95
|
+
assert_equal(['a', 1, 'b', 1], @root[:Kids][0][:Names].value)
|
96
|
+
assert_equal(['a', 'b'], @root[:Kids][0][:Limits].value)
|
97
|
+
assert_equal(['c', 1, 'd', 1], @root[:Kids][1][:Names].value)
|
98
|
+
assert_equal(['c', 'd'], @root[:Kids][1][:Limits].value)
|
99
|
+
assert_equal(['e', 1, 'f', 1], @root[:Kids][2][:Names].value)
|
100
|
+
assert_equal(['e', 'f'], @root[:Kids][2][:Limits].value)
|
101
|
+
assert_equal(['g', 1, 'h', 1, 'i', 1], @root[:Kids][3][:Names].value)
|
102
|
+
assert_equal(['g', 'i'], @root[:Kids][3][:Limits].value)
|
103
|
+
assert_equal(['j', 1, 'k', 1], @root[:Kids][4][:Names].value)
|
104
|
+
assert_equal(['j', 'k'], @root[:Kids][4][:Limits].value)
|
105
|
+
assert_equal(['l', 1, 'm', 1], @root[:Kids][5][:Names].value)
|
106
|
+
assert_equal(['l', 'm'], @root[:Kids][5][:Limits].value)
|
107
107
|
end
|
108
108
|
|
109
109
|
it "fails if not called on the root node" do
|
@@ -127,7 +127,7 @@ describe HexaPDF::Utils::SortedTreeNode do
|
|
127
127
|
add_multilevel_entries
|
128
128
|
obj = @doc.add(1)
|
129
129
|
@kid11[:Names][1] = HexaPDF::Reference.new(obj.oid, obj.gen)
|
130
|
-
assert_equal(
|
130
|
+
assert_equal(1, @root.find_entry('c'))
|
131
131
|
end
|
132
132
|
|
133
133
|
it "returns nil for non-existing entries" do
|
@@ -144,9 +144,9 @@ describe HexaPDF::Utils::SortedTreeNode do
|
|
144
144
|
it "works with only the root node" do
|
145
145
|
%w[a b c d e f g].each {|name| @root.add_entry(name, 1) }
|
146
146
|
%w[g b a unknown e d c].each {|name| @root.delete_entry(name) }
|
147
|
-
refute(@root.
|
148
|
-
refute(@root.
|
149
|
-
assert_equal(['f', 1], @root[:Names])
|
147
|
+
refute(@root.key?(:Kids))
|
148
|
+
refute(@root.key?(:Limits))
|
149
|
+
assert_equal(['f', 1], @root[:Names].value)
|
150
150
|
assert_equal(1, @root.delete_entry('f'))
|
151
151
|
end
|
152
152
|
|
@@ -179,7 +179,7 @@ describe HexaPDF::Utils::SortedTreeNode do
|
|
179
179
|
add_multilevel_entries
|
180
180
|
obj = @doc.add(1)
|
181
181
|
@kid11[:Names][1] = HexaPDF::Reference.new(obj.oid, obj.gen)
|
182
|
-
assert_equal(['c',
|
182
|
+
assert_equal(['c', 1, 'f', 1], @kid11.each_entry.to_a.flatten)
|
183
183
|
end
|
184
184
|
|
185
185
|
it "works on an uninitalized tree" do
|
@@ -233,6 +233,6 @@ describe HexaPDF::Utils::SortedTreeNode do
|
|
233
233
|
root = HexaPDF::NumberTreeNode.new({}, document: @doc)
|
234
234
|
root.add_entry(2, 1)
|
235
235
|
root.add_entry(1, 2)
|
236
|
-
assert_equal([1, 2, 2, 1], root[:Nums])
|
236
|
+
assert_equal([1, 2, 2, 1], root[:Nums].value)
|
237
237
|
end
|
238
238
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hexapdf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas Leitner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-11-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cmdparse
|
@@ -84,12 +84,17 @@ dependencies:
|
|
84
84
|
- - ">="
|
85
85
|
- !ruby/object:Gem::Version
|
86
86
|
version: 0.58.2
|
87
|
-
description:
|
88
|
-
HexaPDF is a pure Ruby library with an accompanying application for working with PDF
|
87
|
+
description: |
|
88
|
+
HexaPDF is a pure Ruby library with an accompanying application for working with PDF
|
89
|
+
files.
|
89
90
|
|
90
|
-
In short, it allows creating new PDF files, manipulating existing PDF files, merging multiple
|
91
|
+
In short, it allows creating new PDF files, manipulating existing PDF files, merging multiple
|
92
|
+
PDF files into one, extracting meta information, text, images and files from PDF files, securing
|
93
|
+
PDF files by encrypting them and optimizing PDF files for smaller file size or other
|
94
|
+
criteria.
|
91
95
|
|
92
|
-
HexaPDF was designed with ease of use and performance in mind. It uses lazy loading and lazy
|
96
|
+
HexaPDF was designed with ease of use and performance in mind. It uses lazy loading and lazy
|
97
|
+
computing when possible and tries to produce small PDF files by default.
|
93
98
|
email: t_leitner@gmx.at
|
94
99
|
executables:
|
95
100
|
- hexapdf
|
@@ -214,6 +219,7 @@ files:
|
|
214
219
|
- lib/hexapdf/cli/batch.rb
|
215
220
|
- lib/hexapdf/cli/command.rb
|
216
221
|
- lib/hexapdf/cli/files.rb
|
222
|
+
- lib/hexapdf/cli/image2pdf.rb
|
217
223
|
- lib/hexapdf/cli/images.rb
|
218
224
|
- lib/hexapdf/cli/info.rb
|
219
225
|
- lib/hexapdf/cli/inspect.rb
|
@@ -221,6 +227,7 @@ files:
|
|
221
227
|
- lib/hexapdf/cli/modify.rb
|
222
228
|
- lib/hexapdf/cli/optimize.rb
|
223
229
|
- lib/hexapdf/cli/split.rb
|
230
|
+
- lib/hexapdf/cli/watermark.rb
|
224
231
|
- lib/hexapdf/composer.rb
|
225
232
|
- lib/hexapdf/configuration.rb
|
226
233
|
- lib/hexapdf/content.rb
|
@@ -332,6 +339,7 @@ files:
|
|
332
339
|
- lib/hexapdf/number_tree_node.rb
|
333
340
|
- lib/hexapdf/object.rb
|
334
341
|
- lib/hexapdf/parser.rb
|
342
|
+
- lib/hexapdf/pdf_array.rb
|
335
343
|
- lib/hexapdf/rectangle.rb
|
336
344
|
- lib/hexapdf/reference.rb
|
337
345
|
- lib/hexapdf/revision.rb
|
@@ -343,6 +351,9 @@ files:
|
|
343
351
|
- lib/hexapdf/task/optimize.rb
|
344
352
|
- lib/hexapdf/tokenizer.rb
|
345
353
|
- lib/hexapdf/type.rb
|
354
|
+
- lib/hexapdf/type/acro_form.rb
|
355
|
+
- lib/hexapdf/type/acro_form/field.rb
|
356
|
+
- lib/hexapdf/type/acro_form/form.rb
|
346
357
|
- lib/hexapdf/type/action.rb
|
347
358
|
- lib/hexapdf/type/actions.rb
|
348
359
|
- lib/hexapdf/type/actions/go_to.rb
|
@@ -354,6 +365,7 @@ files:
|
|
354
365
|
- lib/hexapdf/type/annotations/link.rb
|
355
366
|
- lib/hexapdf/type/annotations/markup_annotation.rb
|
356
367
|
- lib/hexapdf/type/annotations/text.rb
|
368
|
+
- lib/hexapdf/type/annotations/widget.rb
|
357
369
|
- lib/hexapdf/type/catalog.rb
|
358
370
|
- lib/hexapdf/type/cid_font.rb
|
359
371
|
- lib/hexapdf/type/embedded_file.rb
|
@@ -367,6 +379,7 @@ files:
|
|
367
379
|
- lib/hexapdf/type/font_type3.rb
|
368
380
|
- lib/hexapdf/type/form.rb
|
369
381
|
- lib/hexapdf/type/graphics_state_parameter.rb
|
382
|
+
- lib/hexapdf/type/icon_fit.rb
|
370
383
|
- lib/hexapdf/type/image.rb
|
371
384
|
- lib/hexapdf/type/info.rb
|
372
385
|
- lib/hexapdf/type/names.rb
|
@@ -559,6 +572,7 @@ files:
|
|
559
572
|
- test/hexapdf/test_importer.rb
|
560
573
|
- test/hexapdf/test_object.rb
|
561
574
|
- test/hexapdf/test_parser.rb
|
575
|
+
- test/hexapdf/test_pdf_array.rb
|
562
576
|
- test/hexapdf/test_rectangle.rb
|
563
577
|
- test/hexapdf/test_reference.rb
|
564
578
|
- test/hexapdf/test_revision.rb
|
@@ -569,11 +583,13 @@ files:
|
|
569
583
|
- test/hexapdf/test_type.rb
|
570
584
|
- test/hexapdf/test_writer.rb
|
571
585
|
- test/hexapdf/test_xref_section.rb
|
586
|
+
- test/hexapdf/type/acro_form/test_field.rb
|
587
|
+
- test/hexapdf/type/acro_form/test_form.rb
|
572
588
|
- test/hexapdf/type/actions/test_launch.rb
|
573
589
|
- test/hexapdf/type/actions/test_uri.rb
|
574
|
-
- test/hexapdf/type/annotations/test_link.rb
|
575
590
|
- test/hexapdf/type/annotations/test_markup_annotation.rb
|
576
591
|
- test/hexapdf/type/annotations/test_text.rb
|
592
|
+
- test/hexapdf/type/annotations/test_widget.rb
|
577
593
|
- test/hexapdf/type/test_annotation.rb
|
578
594
|
- test/hexapdf/type/test_catalog.rb
|
579
595
|
- test/hexapdf/type/test_cid_font.rb
|