hexapdf 0.10.0 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (139) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +33 -0
  3. data/CONTRIBUTERS +1 -1
  4. data/Rakefile +35 -50
  5. data/VERSION +1 -1
  6. data/lib/hexapdf/cli.rb +4 -0
  7. data/lib/hexapdf/cli/command.rb +6 -2
  8. data/lib/hexapdf/cli/image2pdf.rb +141 -0
  9. data/lib/hexapdf/cli/info.rb +1 -1
  10. data/lib/hexapdf/cli/inspect.rb +32 -2
  11. data/lib/hexapdf/cli/modify.rb +1 -1
  12. data/lib/hexapdf/cli/optimize.rb +1 -1
  13. data/lib/hexapdf/cli/watermark.rb +130 -0
  14. data/lib/hexapdf/composer.rb +2 -2
  15. data/lib/hexapdf/configuration.rb +7 -1
  16. data/lib/hexapdf/content/canvas.rb +2 -2
  17. data/lib/hexapdf/content/graphic_object/arc.rb +2 -2
  18. data/lib/hexapdf/content/graphic_object/endpoint_arc.rb +2 -2
  19. data/lib/hexapdf/content/graphic_object/geom2d.rb +1 -1
  20. data/lib/hexapdf/content/graphic_object/solid_arc.rb +1 -1
  21. data/lib/hexapdf/dictionary.rb +11 -3
  22. data/lib/hexapdf/dictionary_fields.rb +32 -3
  23. data/lib/hexapdf/document.rb +7 -3
  24. data/lib/hexapdf/document/files.rb +1 -1
  25. data/lib/hexapdf/document/fonts.rb +21 -1
  26. data/lib/hexapdf/document/pages.rb +2 -2
  27. data/lib/hexapdf/encryption/standard_security_handler.rb +2 -2
  28. data/lib/hexapdf/font/cmap/parser.rb +1 -1
  29. data/lib/hexapdf/font/true_type/table/head.rb +2 -2
  30. data/lib/hexapdf/font/true_type/table/os2.rb +4 -4
  31. data/lib/hexapdf/font/true_type_wrapper.rb +16 -16
  32. data/lib/hexapdf/font/type1_wrapper.rb +16 -16
  33. data/lib/hexapdf/font_loader.rb +2 -0
  34. data/lib/hexapdf/font_loader/from_configuration.rb +5 -0
  35. data/lib/hexapdf/font_loader/standard14.rb +5 -0
  36. data/lib/hexapdf/image_loader/png.rb +1 -1
  37. data/lib/hexapdf/layout/box.rb +2 -2
  38. data/lib/hexapdf/layout/image_box.rb +1 -1
  39. data/lib/hexapdf/layout/style.rb +50 -24
  40. data/lib/hexapdf/layout/text_box.rb +1 -1
  41. data/lib/hexapdf/layout/text_fragment.rb +2 -2
  42. data/lib/hexapdf/layout/text_layouter.rb +14 -10
  43. data/lib/hexapdf/name_tree_node.rb +3 -3
  44. data/lib/hexapdf/number_tree_node.rb +3 -3
  45. data/lib/hexapdf/pdf_array.rb +207 -0
  46. data/lib/hexapdf/rectangle.rb +12 -12
  47. data/lib/hexapdf/serializer.rb +1 -1
  48. data/lib/hexapdf/stream.rb +6 -4
  49. data/lib/hexapdf/task/optimize.rb +3 -3
  50. data/lib/hexapdf/type.rb +2 -0
  51. data/lib/hexapdf/type/acro_form.rb +51 -0
  52. data/lib/hexapdf/type/acro_form/field.rb +129 -0
  53. data/lib/hexapdf/type/acro_form/form.rb +124 -0
  54. data/lib/hexapdf/type/action.rb +1 -1
  55. data/lib/hexapdf/type/actions/go_to.rb +1 -1
  56. data/lib/hexapdf/type/actions/go_to_r.rb +1 -1
  57. data/lib/hexapdf/type/actions/launch.rb +1 -1
  58. data/lib/hexapdf/type/annotation.rb +2 -2
  59. data/lib/hexapdf/type/annotations.rb +1 -0
  60. data/lib/hexapdf/type/annotations/link.rb +4 -15
  61. data/lib/hexapdf/type/annotations/markup_annotation.rb +2 -1
  62. data/lib/hexapdf/type/annotations/text.rb +3 -6
  63. data/lib/hexapdf/type/annotations/widget.rb +90 -0
  64. data/lib/hexapdf/type/catalog.rb +12 -9
  65. data/lib/hexapdf/type/cid_font.rb +3 -3
  66. data/lib/hexapdf/type/file_specification.rb +2 -2
  67. data/lib/hexapdf/type/font_descriptor.rb +5 -2
  68. data/lib/hexapdf/type/font_simple.rb +1 -1
  69. data/lib/hexapdf/type/font_type0.rb +1 -1
  70. data/lib/hexapdf/type/font_type3.rb +1 -1
  71. data/lib/hexapdf/type/form.rb +2 -2
  72. data/lib/hexapdf/type/graphics_state_parameter.rb +11 -6
  73. data/lib/hexapdf/type/icon_fit.rb +58 -0
  74. data/lib/hexapdf/type/image.rb +14 -8
  75. data/lib/hexapdf/type/info.rb +2 -1
  76. data/lib/hexapdf/type/page.rb +4 -4
  77. data/lib/hexapdf/type/page_tree_node.rb +3 -7
  78. data/lib/hexapdf/type/resources.rb +1 -1
  79. data/lib/hexapdf/type/trailer.rb +4 -4
  80. data/lib/hexapdf/type/viewer_preferences.rb +7 -4
  81. data/lib/hexapdf/type/xref_stream.rb +2 -2
  82. data/lib/hexapdf/utils/sorted_tree_node.rb +1 -1
  83. data/lib/hexapdf/version.rb +1 -1
  84. data/man/man1/hexapdf.1 +77 -8
  85. data/test/hexapdf/content/test_canvas.rb +2 -2
  86. data/test/hexapdf/content/test_processor.rb +3 -3
  87. data/test/hexapdf/document/test_files.rb +4 -4
  88. data/test/hexapdf/document/test_fonts.rb +13 -1
  89. data/test/hexapdf/document/test_images.rb +6 -6
  90. data/test/hexapdf/document/test_pages.rb +8 -8
  91. data/test/hexapdf/encryption/test_security_handler.rb +7 -7
  92. data/test/hexapdf/encryption/test_standard_security_handler.rb +5 -5
  93. data/test/hexapdf/font/test_true_type_wrapper.rb +2 -2
  94. data/test/hexapdf/font_loader/test_from_configuration.rb +4 -0
  95. data/test/hexapdf/font_loader/test_standard14.rb +10 -0
  96. data/test/hexapdf/image_loader/test_jpeg.rb +1 -1
  97. data/test/hexapdf/image_loader/test_png.rb +3 -3
  98. data/test/hexapdf/layout/test_box.rb +2 -2
  99. data/test/hexapdf/layout/test_frame.rb +1 -1
  100. data/test/hexapdf/layout/test_image_box.rb +1 -1
  101. data/test/hexapdf/layout/test_style.rb +18 -13
  102. data/test/hexapdf/layout/test_text_box.rb +1 -1
  103. data/test/hexapdf/layout/test_text_layouter.rb +11 -6
  104. data/test/hexapdf/task/test_dereference.rb +2 -2
  105. data/test/hexapdf/task/test_optimize.rb +11 -11
  106. data/test/hexapdf/test_composer.rb +1 -1
  107. data/test/hexapdf/test_dictionary.rb +10 -2
  108. data/test/hexapdf/test_dictionary_fields.rb +27 -3
  109. data/test/hexapdf/test_document.rb +16 -15
  110. data/test/hexapdf/test_importer.rb +4 -4
  111. data/test/hexapdf/test_object.rb +1 -1
  112. data/test/hexapdf/test_pdf_array.rb +162 -0
  113. data/test/hexapdf/test_rectangle.rb +3 -5
  114. data/test/hexapdf/test_serializer.rb +1 -1
  115. data/test/hexapdf/test_stream.rb +1 -0
  116. data/test/hexapdf/test_writer.rb +3 -3
  117. data/test/hexapdf/type/acro_form/test_field.rb +85 -0
  118. data/test/hexapdf/type/acro_form/test_form.rb +69 -0
  119. data/test/hexapdf/type/annotations/test_text.rb +2 -6
  120. data/test/hexapdf/type/annotations/test_widget.rb +24 -0
  121. data/test/hexapdf/type/test_annotation.rb +1 -1
  122. data/test/hexapdf/type/test_catalog.rb +1 -1
  123. data/test/hexapdf/type/test_cid_font.rb +3 -3
  124. data/test/hexapdf/type/test_font.rb +2 -2
  125. data/test/hexapdf/type/test_font_descriptor.rb +2 -1
  126. data/test/hexapdf/type/test_font_simple.rb +3 -3
  127. data/test/hexapdf/type/test_font_true_type.rb +6 -6
  128. data/test/hexapdf/type/test_font_type0.rb +5 -5
  129. data/test/hexapdf/type/test_font_type1.rb +8 -8
  130. data/test/hexapdf/type/test_font_type3.rb +4 -4
  131. data/test/hexapdf/type/test_image.rb +16 -12
  132. data/test/hexapdf/type/test_page.rb +11 -11
  133. data/test/hexapdf/type/test_page_tree_node.rb +20 -20
  134. data/test/hexapdf/type/test_resources.rb +6 -6
  135. data/test/hexapdf/type/test_trailer.rb +5 -2
  136. data/test/hexapdf/type/test_xref_stream.rb +1 -0
  137. data/test/hexapdf/utils/test_sorted_tree_node.rb +35 -35
  138. metadata +23 -7
  139. 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].last)
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].shift
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, *); HexaPDF::Dictionary.new(obj, oid: (obj.oid rescue 0)); end
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(Array, @obj[:ID])
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])
@@ -7,6 +7,7 @@ describe HexaPDF::Type::XRefStream do
7
7
  before do
8
8
  @doc = Object.new
9
9
  def (@doc).deref(obj); obj; end
10
+ def (@doc).wrap(obj, **); obj; end
10
11
  @obj = HexaPDF::Type::XRefStream.new({}, oid: 1, document: @doc)
11
12
  end
12
13
 
@@ -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(obj, @root.find_entry('c'))
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.value.key?(:Kids))
148
- refute(@root.value.key?(:Limits))
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', obj, 'f', 1], @kid11.each_entry.to_a.flatten)
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.10.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-10-02 00:00:00.000000000 Z
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 files.
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 PDF files into one, extracting meta information, text, images and files from PDF files, securing PDF files by encrypting them and optimizing PDF files for smaller file size or other criteria.
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 computing when possible and tries to produce small PDF files by default.
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