hexapdf 0.12.1 → 0.14.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +130 -0
- data/examples/019-acro_form.rb +41 -4
- data/lib/hexapdf/cli/command.rb +4 -2
- data/lib/hexapdf/cli/image2pdf.rb +2 -1
- data/lib/hexapdf/cli/info.rb +51 -2
- data/lib/hexapdf/cli/inspect.rb +30 -8
- data/lib/hexapdf/cli/merge.rb +1 -1
- data/lib/hexapdf/cli/split.rb +74 -14
- data/lib/hexapdf/configuration.rb +15 -0
- data/lib/hexapdf/content/graphic_object/arc.rb +3 -3
- data/lib/hexapdf/content/parser.rb +1 -1
- data/lib/hexapdf/dictionary.rb +9 -6
- data/lib/hexapdf/dictionary_fields.rb +1 -9
- data/lib/hexapdf/document.rb +41 -16
- data/lib/hexapdf/document/files.rb +0 -1
- data/lib/hexapdf/encryption/fast_arc4.rb +1 -1
- data/lib/hexapdf/encryption/security_handler.rb +1 -0
- data/lib/hexapdf/encryption/standard_security_handler.rb +1 -0
- data/lib/hexapdf/font/cmap.rb +1 -4
- data/lib/hexapdf/font/true_type/subsetter.rb +12 -3
- data/lib/hexapdf/font/true_type/table/head.rb +1 -0
- data/lib/hexapdf/font/true_type/table/os2.rb +2 -0
- data/lib/hexapdf/font/true_type/table/post.rb +15 -10
- data/lib/hexapdf/font_loader/from_configuration.rb +2 -2
- data/lib/hexapdf/font_loader/from_file.rb +18 -8
- data/lib/hexapdf/image_loader/png.rb +3 -2
- data/lib/hexapdf/importer.rb +3 -2
- data/lib/hexapdf/layout/line.rb +1 -1
- data/lib/hexapdf/layout/style.rb +23 -23
- data/lib/hexapdf/layout/text_layouter.rb +2 -2
- data/lib/hexapdf/layout/text_shaper.rb +3 -2
- data/lib/hexapdf/object.rb +52 -25
- data/lib/hexapdf/parser.rb +96 -4
- data/lib/hexapdf/pdf_array.rb +12 -5
- data/lib/hexapdf/revisions.rb +29 -21
- data/lib/hexapdf/serializer.rb +34 -8
- data/lib/hexapdf/task/optimize.rb +6 -4
- data/lib/hexapdf/tokenizer.rb +4 -3
- data/lib/hexapdf/type/acro_form/appearance_generator.rb +132 -28
- data/lib/hexapdf/type/acro_form/button_field.rb +21 -13
- data/lib/hexapdf/type/acro_form/choice_field.rb +68 -14
- data/lib/hexapdf/type/acro_form/field.rb +35 -5
- data/lib/hexapdf/type/acro_form/form.rb +139 -14
- data/lib/hexapdf/type/acro_form/text_field.rb +70 -4
- data/lib/hexapdf/type/actions/uri.rb +3 -2
- data/lib/hexapdf/type/annotations/widget.rb +3 -4
- data/lib/hexapdf/type/catalog.rb +2 -2
- data/lib/hexapdf/type/cid_font.rb +1 -1
- data/lib/hexapdf/type/file_specification.rb +1 -1
- data/lib/hexapdf/type/font.rb +1 -1
- data/lib/hexapdf/type/font_simple.rb +4 -2
- data/lib/hexapdf/type/font_true_type.rb +6 -2
- data/lib/hexapdf/type/font_type0.rb +4 -4
- data/lib/hexapdf/type/form.rb +15 -2
- data/lib/hexapdf/type/image.rb +2 -2
- data/lib/hexapdf/type/page.rb +37 -13
- data/lib/hexapdf/type/page_tree_node.rb +29 -5
- data/lib/hexapdf/type/resources.rb +1 -0
- data/lib/hexapdf/type/trailer.rb +2 -3
- data/lib/hexapdf/utils/object_hash.rb +0 -1
- data/lib/hexapdf/utils/sorted_tree_node.rb +18 -15
- data/lib/hexapdf/version.rb +1 -1
- data/test/hexapdf/common_tokenizer_tests.rb +6 -1
- data/test/hexapdf/content/graphic_object/test_arc.rb +4 -4
- data/test/hexapdf/content/test_canvas.rb +3 -3
- data/test/hexapdf/content/test_color_space.rb +1 -1
- data/test/hexapdf/encryption/test_aes.rb +4 -4
- data/test/hexapdf/encryption/test_standard_security_handler.rb +11 -11
- data/test/hexapdf/filter/test_ascii85_decode.rb +1 -1
- data/test/hexapdf/filter/test_ascii_hex_decode.rb +1 -1
- data/test/hexapdf/font/true_type/table/test_post.rb +1 -1
- data/test/hexapdf/font/true_type/test_subsetter.rb +5 -0
- data/test/hexapdf/font_loader/test_from_configuration.rb +7 -3
- data/test/hexapdf/font_loader/test_from_file.rb +7 -0
- data/test/hexapdf/layout/test_style.rb +1 -1
- data/test/hexapdf/layout/test_text_layouter.rb +12 -5
- data/test/hexapdf/test_configuration.rb +2 -2
- data/test/hexapdf/test_dictionary.rb +8 -1
- data/test/hexapdf/test_dictionary_fields.rb +2 -2
- data/test/hexapdf/test_document.rb +18 -10
- data/test/hexapdf/test_object.rb +71 -26
- data/test/hexapdf/test_parser.rb +171 -53
- data/test/hexapdf/test_pdf_array.rb +8 -1
- data/test/hexapdf/test_revisions.rb +35 -0
- data/test/hexapdf/test_writer.rb +2 -2
- data/test/hexapdf/type/acro_form/test_appearance_generator.rb +296 -38
- data/test/hexapdf/type/acro_form/test_button_field.rb +22 -2
- data/test/hexapdf/type/acro_form/test_choice_field.rb +92 -9
- data/test/hexapdf/type/acro_form/test_field.rb +39 -0
- data/test/hexapdf/type/acro_form/test_form.rb +87 -15
- data/test/hexapdf/type/acro_form/test_text_field.rb +77 -1
- data/test/hexapdf/type/test_font_simple.rb +2 -1
- data/test/hexapdf/type/test_font_true_type.rb +6 -0
- data/test/hexapdf/type/test_form.rb +26 -1
- data/test/hexapdf/type/test_page.rb +45 -7
- data/test/hexapdf/type/test_page_tree_node.rb +42 -0
- data/test/hexapdf/utils/test_bit_field.rb +2 -0
- data/test/hexapdf/utils/test_object_hash.rb +5 -0
- data/test/hexapdf/utils/test_sorted_tree_node.rb +10 -9
- data/test/test_helper.rb +2 -0
- metadata +6 -11
@@ -161,8 +161,9 @@ describe HexaPDF::Type::FontSimple do
|
|
161
161
|
end
|
162
162
|
|
163
163
|
describe "validation" do
|
164
|
+
before { assert(@font.validate) }
|
165
|
+
|
164
166
|
it "validates the existence of required keys" do
|
165
|
-
assert(@font.validate)
|
166
167
|
@font.delete(:FirstChar)
|
167
168
|
refute(@font.validate)
|
168
169
|
end
|
@@ -16,6 +16,12 @@ describe HexaPDF::Type::FontTrueType do
|
|
16
16
|
end
|
17
17
|
|
18
18
|
describe "validation" do
|
19
|
+
it "ignores some missing fields if the font name is one of the standard PDF fonts" do
|
20
|
+
@font[:BaseFont] = :'Arial,Bold'
|
21
|
+
[:FirstChar, :LastChar, :Widths, :FontDescriptor].each {|field| @font.delete(field) }
|
22
|
+
assert(@font.validate)
|
23
|
+
end
|
24
|
+
|
19
25
|
it "requires that the FontDescriptor key is set" do
|
20
26
|
assert(@font.validate)
|
21
27
|
@font.delete(:FontDescriptor)
|
@@ -43,13 +43,20 @@ describe HexaPDF::Type::Form do
|
|
43
43
|
@form.contents = 'test'
|
44
44
|
assert_equal('test', @form.stream)
|
45
45
|
end
|
46
|
+
|
47
|
+
it "clears the cache to make sure that a new canvas can be created" do
|
48
|
+
@form[:BBox] = [0, 0, 100, 100]
|
49
|
+
canvas = @form.canvas
|
50
|
+
@form.contents = ''
|
51
|
+
refute_same(canvas, @form.canvas)
|
52
|
+
end
|
46
53
|
end
|
47
54
|
|
48
55
|
describe "resources" do
|
49
56
|
it "creates the resource dictionary if it is not found" do
|
50
57
|
resources = @form.resources
|
51
58
|
assert_equal(:XXResources, resources.type)
|
52
|
-
assert_equal({}, resources.value)
|
59
|
+
assert_equal({ProcSet: [:PDF, :Text, :ImageB, :ImageC, :ImageI]}, resources.value)
|
53
60
|
end
|
54
61
|
|
55
62
|
it "returns the already used resource dictionary" do
|
@@ -82,9 +89,27 @@ describe HexaPDF::Type::Form do
|
|
82
89
|
end
|
83
90
|
|
84
91
|
describe "canvas" do
|
92
|
+
# Asserts that the form's contents contains the operators.
|
93
|
+
def assert_operators(form, operators)
|
94
|
+
processor = TestHelper::OperatorRecorder.new
|
95
|
+
form.process_contents(processor)
|
96
|
+
assert_equal(operators, processor.recorded_ops)
|
97
|
+
end
|
98
|
+
|
85
99
|
it "always returns the same Canvas instance" do
|
100
|
+
@form[:BBox] = [0, 0, 100, 100]
|
86
101
|
canvas = @form.canvas
|
87
102
|
assert_same(canvas, @form.canvas)
|
103
|
+
assert_operators(@form, [])
|
104
|
+
end
|
105
|
+
|
106
|
+
it "always moves the origin to the bottom left corner of the bounding box" do
|
107
|
+
@form[:BBox] = [-10, -5, 100, 300]
|
108
|
+
@form.canvas.line_width = 5
|
109
|
+
assert_operators(@form, [[:save_graphics_state],
|
110
|
+
[:concatenate_matrix, [1, 0, 0, 1, -10, -5]],
|
111
|
+
[:set_line_width, [5]],
|
112
|
+
[:restore_graphics_state]])
|
88
113
|
end
|
89
114
|
|
90
115
|
it "fails if the form XObject already has data" do
|
@@ -277,7 +277,7 @@ describe HexaPDF::Type::Page do
|
|
277
277
|
page = @doc.add({Type: :Page, Parent: @doc.pages.root})
|
278
278
|
resources = page.resources
|
279
279
|
assert_equal(:XXResources, resources.type)
|
280
|
-
assert_equal({}, resources.value)
|
280
|
+
assert_equal({ProcSet: [:PDF, :Text, :ImageB, :ImageC, :ImageI]}, resources.value)
|
281
281
|
end
|
282
282
|
|
283
283
|
it "returns the already used resource dictionary" do
|
@@ -319,6 +319,13 @@ describe HexaPDF::Type::Page do
|
|
319
319
|
end
|
320
320
|
end
|
321
321
|
|
322
|
+
it "returns all ancestor page tree nodes of a page" do
|
323
|
+
root = @doc.add({Type: :Pages})
|
324
|
+
kid = @doc.add({Type: :Pages, Parent: root})
|
325
|
+
page = @doc.add({Type: :Page, Parent: kid})
|
326
|
+
assert_equal([kid, root], page.ancestor_nodes)
|
327
|
+
end
|
328
|
+
|
322
329
|
describe "canvas" do
|
323
330
|
before do
|
324
331
|
@page = @doc.pages.add
|
@@ -331,31 +338,36 @@ describe HexaPDF::Type::Page do
|
|
331
338
|
@page.canvas(type: :overlay).line_width = 5
|
332
339
|
assert_operators(@page, [[:save_graphics_state], [:restore_graphics_state],
|
333
340
|
[:save_graphics_state], [:set_line_width, [10]],
|
334
|
-
[:restore_graphics_state], [:
|
341
|
+
[:restore_graphics_state], [:save_graphics_state],
|
342
|
+
[:set_line_width, [5]], [:restore_graphics_state]])
|
335
343
|
|
336
344
|
@page.canvas(type: :underlay).line_width = 2
|
337
345
|
assert_operators(@page, [[:save_graphics_state], [:set_line_width, [2]],
|
338
346
|
[:restore_graphics_state], [:save_graphics_state],
|
339
347
|
[:set_line_width, [10]],
|
340
|
-
[:restore_graphics_state], [:
|
348
|
+
[:restore_graphics_state], [:save_graphics_state],
|
349
|
+
[:set_line_width, [5]], [:restore_graphics_state]])
|
341
350
|
end
|
342
351
|
|
343
352
|
it "works correctly if invoked on an empty page, using type :underlay in first invocation" do
|
344
353
|
@page.canvas(type: :underlay).line_width = 2
|
345
354
|
assert_operators(@page, [[:save_graphics_state], [:set_line_width, [2]],
|
355
|
+
[:restore_graphics_state], [:save_graphics_state],
|
346
356
|
[:restore_graphics_state], [:save_graphics_state],
|
347
357
|
[:restore_graphics_state]])
|
348
358
|
|
349
359
|
@page.canvas.line_width = 10
|
350
360
|
assert_operators(@page, [[:save_graphics_state], [:set_line_width, [2]],
|
351
361
|
[:restore_graphics_state], [:save_graphics_state],
|
352
|
-
[:set_line_width, [10]], [:restore_graphics_state]
|
362
|
+
[:set_line_width, [10]], [:restore_graphics_state],
|
363
|
+
[:save_graphics_state], [:restore_graphics_state]])
|
353
364
|
|
354
365
|
@page.canvas(type: :overlay).line_width = 5
|
355
366
|
assert_operators(@page, [[:save_graphics_state], [:set_line_width, [2]],
|
356
367
|
[:restore_graphics_state], [:save_graphics_state],
|
357
368
|
[:set_line_width, [10]],
|
358
|
-
[:restore_graphics_state], [:
|
369
|
+
[:restore_graphics_state], [:save_graphics_state],
|
370
|
+
[:set_line_width, [5]], [:restore_graphics_state]])
|
359
371
|
end
|
360
372
|
|
361
373
|
it "works correctly if invoked on a page with existing contents" do
|
@@ -364,13 +376,39 @@ describe HexaPDF::Type::Page do
|
|
364
376
|
@page.canvas(type: :overlay).line_width = 5
|
365
377
|
assert_operators(@page, [[:save_graphics_state], [:restore_graphics_state],
|
366
378
|
[:save_graphics_state], [:set_line_width, [10]],
|
367
|
-
[:restore_graphics_state],
|
379
|
+
[:restore_graphics_state],
|
380
|
+
[:save_graphics_state], [:set_line_width, [5]],
|
381
|
+
[:restore_graphics_state]])
|
368
382
|
|
369
383
|
@page.canvas(type: :underlay).line_width = 2
|
370
384
|
assert_operators(@page, [[:save_graphics_state], [:set_line_width, [2]],
|
371
385
|
[:restore_graphics_state], [:save_graphics_state],
|
372
386
|
[:set_line_width, [10]],
|
373
|
-
[:restore_graphics_state],
|
387
|
+
[:restore_graphics_state],
|
388
|
+
[:save_graphics_state], [:set_line_width, [5]],
|
389
|
+
[:restore_graphics_state]])
|
390
|
+
end
|
391
|
+
|
392
|
+
it "works correctly if the page has its origin not at (0,0)" do
|
393
|
+
@page.box(:media, [-10, -5, 100, 300])
|
394
|
+
@page.canvas(type: :underlay).line_width = 2
|
395
|
+
@page.canvas(type: :page).line_width = 2
|
396
|
+
@page.canvas(type: :overlay).line_width = 2
|
397
|
+
|
398
|
+
assert_operators(@page, [[:save_graphics_state],
|
399
|
+
[:concatenate_matrix, [1, 0, 0, 1, -10, -5]],
|
400
|
+
[:set_line_width, [2]],
|
401
|
+
[:restore_graphics_state],
|
402
|
+
|
403
|
+
[:save_graphics_state],
|
404
|
+
[:concatenate_matrix, [1, 0, 0, 1, -10, -5]],
|
405
|
+
[:set_line_width, [2]],
|
406
|
+
[:restore_graphics_state],
|
407
|
+
|
408
|
+
[:save_graphics_state],
|
409
|
+
[:concatenate_matrix, [1, 0, 0, 1, -10, -5]],
|
410
|
+
[:set_line_width, [2]],
|
411
|
+
[:restore_graphics_state]])
|
374
412
|
end
|
375
413
|
|
376
414
|
it "fails if the page canvas is requested for a page with existing contents" do
|
@@ -206,6 +206,48 @@ describe HexaPDF::Type::PageTreeNode do
|
|
206
206
|
end
|
207
207
|
end
|
208
208
|
|
209
|
+
describe "move_page" do
|
210
|
+
before do
|
211
|
+
define_multilevel_page_tree
|
212
|
+
end
|
213
|
+
|
214
|
+
it "moves the page to the first place" do
|
215
|
+
@root.move_page(@pages[1], 0)
|
216
|
+
assert_equal([@pages[1], @pages[0], *@pages[2..-1]], @root.each_page.to_a)
|
217
|
+
assert(@root.validate)
|
218
|
+
end
|
219
|
+
|
220
|
+
it "moves the page to the correct location with a positive index" do
|
221
|
+
@root.move_page(1, 3)
|
222
|
+
assert_equal([@pages[0], @pages[2], @pages[1], *@pages[3..-1]], @root.each_page.to_a)
|
223
|
+
assert(@root.validate)
|
224
|
+
end
|
225
|
+
|
226
|
+
it "moves the page to the last place" do
|
227
|
+
@root.move_page(1, -1)
|
228
|
+
assert_equal([@pages[0], *@pages[2..-1], @pages[1]], @root.each_page.to_a)
|
229
|
+
assert(@root.validate)
|
230
|
+
end
|
231
|
+
|
232
|
+
it "fails if the index to the moving page is invalid" do
|
233
|
+
assert_raises(HexaPDF::Error) { @root.move_page(10, 0) }
|
234
|
+
end
|
235
|
+
|
236
|
+
it "fails if the moving page was deleted/is null" do
|
237
|
+
@doc.delete(@pages[0])
|
238
|
+
assert_raises(HexaPDF::Error) { @root.move_page(@pages[0], 3) }
|
239
|
+
end
|
240
|
+
|
241
|
+
it "fails if the page was not yet added to a page tree" do
|
242
|
+
page = @doc.add({Type: :Page})
|
243
|
+
assert_raises(HexaPDF::Error) { @root.move_page(page, 3) }
|
244
|
+
end
|
245
|
+
|
246
|
+
it "fails if the page is not part of the page tree" do
|
247
|
+
assert_raises(HexaPDF::Error) { @kid1.move_page(@pages[6], 3) }
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
209
251
|
describe "each_page" do
|
210
252
|
before do
|
211
253
|
define_multilevel_page_tree
|
@@ -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]}, type: HexaPDF::NameTreeNode)
|
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]}, type: HexaPDF::NameTreeNode)
|
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)
|
@@ -73,11 +73,11 @@ describe HexaPDF::Utils::SortedTreeNode do
|
|
73
73
|
@root.add_entry('p', 1)
|
74
74
|
@root.add_entry('r', 1)
|
75
75
|
@root.add_entry('v', 1)
|
76
|
-
assert_equal(['a', 'm'], @kid1[:Limits])
|
76
|
+
assert_equal(['a', 'm'], @kid1[:Limits].value)
|
77
77
|
assert_equal(['a', 'f'], @kid11[:Limits].value)
|
78
78
|
assert_equal(['a', 1, 'c', 1, 'e', 1, 'f', 1], @kid11[:Names].value)
|
79
|
-
assert_equal(['g', 'm'], @kid12[:Limits])
|
80
|
-
assert_equal(['g', 1, 'i', 1, 'j', 1, 'm', 1], @kid12[:Names])
|
79
|
+
assert_equal(['g', 'm'], @kid12[:Limits].value)
|
80
|
+
assert_equal(['g', 1, 'i', 1, 'j', 1, 'm', 1], @kid12[:Names].value)
|
81
81
|
assert_equal(['n', 'v'], @kid2[:Limits].value)
|
82
82
|
assert_equal(['n', 'q'], @kid21[:Limits].value)
|
83
83
|
assert_equal(['n', 1, 'o', 1, 'p', 1, 'q', 1], @kid21[:Names].value)
|
@@ -193,15 +193,16 @@ describe HexaPDF::Utils::SortedTreeNode do
|
|
193
193
|
end
|
194
194
|
|
195
195
|
it "checks that all kid objects are indirect objects" do
|
196
|
-
@root[:Kids][0] = HexaPDF::Reference.new(@kid1.oid, @kid1.gen)
|
196
|
+
@root[:Kids][0] = ref = HexaPDF::Reference.new(@kid1.oid, @kid1.gen)
|
197
197
|
assert(@root.validate)
|
198
198
|
|
199
|
-
@root[:Kids][0] =
|
199
|
+
@root[:Kids][0] = ref
|
200
200
|
@kid1.oid = 0
|
201
|
-
|
201
|
+
assert(@root.validate do |message, c|
|
202
202
|
assert_match(/must be indirect objects/, message)
|
203
|
-
|
203
|
+
assert(c)
|
204
204
|
end)
|
205
|
+
assert(@kid1.indirect?)
|
205
206
|
end
|
206
207
|
|
207
208
|
it "checks that leaf node containers have an even number of entries" do
|
data/test/test_helper.rb
CHANGED
@@ -16,6 +16,8 @@ require 'zlib'
|
|
16
16
|
TEST_DATA_DIR = File.join(__dir__, 'data')
|
17
17
|
MINIMAL_PDF = File.read(File.join(TEST_DATA_DIR, 'minimal.pdf')).freeze
|
18
18
|
|
19
|
+
Minitest::Test.make_my_diffs_pretty!
|
20
|
+
|
19
21
|
module TestHelper
|
20
22
|
|
21
23
|
# Asserts that the method +name+ of +object+ gets invoked with the +expected_values+ when
|
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.14.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas Leitner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cmdparse
|
@@ -78,20 +78,14 @@ dependencies:
|
|
78
78
|
requirements:
|
79
79
|
- - "~>"
|
80
80
|
- !ruby/object:Gem::Version
|
81
|
-
version: '0
|
82
|
-
- - ">="
|
83
|
-
- !ruby/object:Gem::Version
|
84
|
-
version: 0.82.0
|
81
|
+
version: '1.0'
|
85
82
|
type: :development
|
86
83
|
prerelease: false
|
87
84
|
version_requirements: !ruby/object:Gem::Requirement
|
88
85
|
requirements:
|
89
86
|
- - "~>"
|
90
87
|
- !ruby/object:Gem::Version
|
91
|
-
version: '0
|
92
|
-
- - ">="
|
93
|
-
- !ruby/object:Gem::Version
|
94
|
-
version: 0.82.0
|
88
|
+
version: '1.0'
|
95
89
|
description: |
|
96
90
|
HexaPDF is a pure Ruby library with an accompanying application for working with PDF
|
97
91
|
files.
|
@@ -637,6 +631,7 @@ files:
|
|
637
631
|
homepage: https://hexapdf.gettalong.org
|
638
632
|
licenses:
|
639
633
|
- AGPL-3.0
|
634
|
+
- Nonstandard
|
640
635
|
metadata: {}
|
641
636
|
post_install_message:
|
642
637
|
rdoc_options: []
|
@@ -653,7 +648,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
653
648
|
- !ruby/object:Gem::Version
|
654
649
|
version: '0'
|
655
650
|
requirements: []
|
656
|
-
rubygems_version: 3.
|
651
|
+
rubygems_version: 3.2.3
|
657
652
|
signing_key:
|
658
653
|
specification_version: 4
|
659
654
|
summary: HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|