hexapdf 0.11.6 → 0.11.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/lib/hexapdf/task/optimize.rb +10 -3
- data/lib/hexapdf/version.rb +1 -1
- data/test/hexapdf/task/test_optimize.rb +24 -8
- data/test/hexapdf/test_writer.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 569e36409af92892e51daffa031686bc87db46bc846933ddb9f47c415fccfd3f
|
4
|
+
data.tar.gz: 88ad0152b80467b2f7936e2431b24091b8fa799b51094efcbfb467af04fb468e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d49c7ae6f7bb2d17cf3124a10043b50d451e832f64fbf9cd6d852e00d00a6eb0fb47fedb624f97629404f5509b6126d4fdf04265164416adbb2020075b0dafd9
|
7
|
+
data.tar.gz: 2fa2a590c07c7e286ab4b57bd110618bab7b3e4f6bfbb00906c1df53e3314f23536644652ba6a143802ca2bc331bd8f1ffa58ee4fbda884ae020c9b517b7f652
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
## 0.11.7 - 2020-06-10
|
2
|
+
|
3
|
+
### Fixed
|
4
|
+
|
5
|
+
* Deletion of object streams in [HexaPDF::Task::Optimize] to avoid accessing
|
6
|
+
then invalid object streams
|
7
|
+
* [HexaPDF::Task::Optimize] to work correctly when deleting object streams and
|
8
|
+
generating xref streams
|
9
|
+
|
1
10
|
## 0.11.6 - 2020-05-27
|
2
11
|
|
3
12
|
### Fixed
|
@@ -127,13 +127,18 @@ module HexaPDF
|
|
127
127
|
when :delete
|
128
128
|
doc.revisions.each_with_index do |rev, rev_index|
|
129
129
|
xref_stream = false
|
130
|
+
objects_to_delete = []
|
130
131
|
rev.each do |obj|
|
131
|
-
if obj.type == :ObjStm
|
132
|
-
|
132
|
+
if obj.type == :ObjStm
|
133
|
+
objects_to_delete << obj
|
134
|
+
elsif obj.type == :XRef
|
135
|
+
xref_stream = true
|
136
|
+
objects_to_delete << obj if xref_streams == :delete
|
133
137
|
else
|
134
138
|
delete_fields_with_defaults(obj)
|
135
139
|
end
|
136
140
|
end
|
141
|
+
objects_to_delete.each {|obj| rev.delete(obj) }
|
137
142
|
if xref_streams == :generate && !xref_stream
|
138
143
|
doc.add({Type: :XRef}, revision: rev_index)
|
139
144
|
end
|
@@ -143,11 +148,12 @@ module HexaPDF
|
|
143
148
|
xref_stream = false
|
144
149
|
count = 0
|
145
150
|
objstms = [doc.wrap({Type: :ObjStm})]
|
151
|
+
old_objstms = []
|
146
152
|
rev.each do |obj|
|
147
153
|
if obj.type == :XRef
|
148
154
|
xref_stream = true
|
149
155
|
elsif obj.type == :ObjStm
|
150
|
-
|
156
|
+
old_objstms << obj
|
151
157
|
end
|
152
158
|
delete_fields_with_defaults(obj)
|
153
159
|
|
@@ -160,6 +166,7 @@ module HexaPDF
|
|
160
166
|
count = 0
|
161
167
|
end
|
162
168
|
end
|
169
|
+
old_objstms.each {|objstm| rev.delete(objstm) }
|
163
170
|
objstms.each {|objstm| doc.add(objstm, revision: rev_index) }
|
164
171
|
doc.add({Type: :XRef}, revision: rev_index) unless xref_stream
|
165
172
|
end
|
data/lib/hexapdf/version.rb
CHANGED
@@ -7,13 +7,15 @@ require 'hexapdf/task/optimize'
|
|
7
7
|
describe HexaPDF::Task::Optimize do
|
8
8
|
class TestType < HexaPDF::Dictionary
|
9
9
|
|
10
|
+
define_type :Test
|
10
11
|
define_field :Optional, type: Symbol, default: :Optional
|
11
12
|
|
12
13
|
end
|
13
14
|
|
14
15
|
before do
|
16
|
+
HexaPDF::GlobalConfiguration['object.type_map'][:Test] = TestType
|
15
17
|
@doc = HexaPDF::Document.new
|
16
|
-
@obj1 = @doc.add(
|
18
|
+
@obj1 = @doc.add({Type: :Test, Optional: :Optional})
|
17
19
|
@doc.trailer[:Test] = @doc.wrap(@obj1)
|
18
20
|
@doc.revisions.add
|
19
21
|
@obj2 = @doc.add({Type: :UsedEntry})
|
@@ -22,6 +24,10 @@ describe HexaPDF::Task::Optimize do
|
|
22
24
|
@obj1[:Test] = @doc.wrap(@obj4, type: TestType)
|
23
25
|
end
|
24
26
|
|
27
|
+
after do
|
28
|
+
HexaPDF::GlobalConfiguration['object.type_map'].delete(:Test)
|
29
|
+
end
|
30
|
+
|
25
31
|
def assert_objstms_generated
|
26
32
|
assert(@doc.revisions.all? {|rev| rev.any? {|obj| obj.type == :ObjStm } })
|
27
33
|
assert(@doc.revisions.all? {|rev| rev.any? {|obj| obj.type == :XRef } })
|
@@ -40,7 +46,7 @@ describe HexaPDF::Task::Optimize do
|
|
40
46
|
end
|
41
47
|
|
42
48
|
def assert_default_deleted
|
43
|
-
refute(@
|
49
|
+
refute(@doc.object(1).key?(:Optional))
|
44
50
|
end
|
45
51
|
|
46
52
|
describe "compact" do
|
@@ -84,21 +90,29 @@ describe HexaPDF::Task::Optimize do
|
|
84
90
|
end
|
85
91
|
|
86
92
|
describe "object_streams" do
|
87
|
-
|
93
|
+
def reload_document_with_objstm_from_io
|
94
|
+
io = StringIO.new
|
88
95
|
objstm = @doc.add({Type: :ObjStm})
|
89
|
-
|
96
|
+
@doc.add({Type: :XRef})
|
97
|
+
objstm.add_object(@doc.add({Type: :Test}))
|
98
|
+
@doc.write(io)
|
99
|
+
io.rewind
|
100
|
+
@doc = HexaPDF::Document.new(io: io)
|
101
|
+
end
|
102
|
+
|
103
|
+
it "generates object streams" do
|
90
104
|
210.times { @doc.add(5) }
|
105
|
+
objstm = @doc.add({Type: :ObjStm})
|
106
|
+
reload_document_with_objstm_from_io
|
91
107
|
@doc.task(:optimize, object_streams: :generate)
|
92
108
|
assert_objstms_generated
|
93
109
|
assert_default_deleted
|
94
110
|
assert_nil(@doc.object(objstm).value)
|
95
|
-
|
96
|
-
assert([xref], @doc.revisions.current.find_all {|obj| obj.type == :XRef })
|
111
|
+
assert_equal(2, @doc.revisions.current.find_all {|obj| obj.type == :ObjStm }.size)
|
97
112
|
end
|
98
113
|
|
99
114
|
it "deletes object and xref streams" do
|
100
|
-
|
101
|
-
@doc.add({Type: :XRef})
|
115
|
+
reload_document_with_objstm_from_io
|
102
116
|
@doc.task(:optimize, object_streams: :delete, xref_streams: :delete)
|
103
117
|
assert_no_objstms
|
104
118
|
assert_no_xrefstms
|
@@ -107,9 +121,11 @@ describe HexaPDF::Task::Optimize do
|
|
107
121
|
|
108
122
|
it "deletes object and generates xref streams" do
|
109
123
|
@doc.add({Type: :ObjStm})
|
124
|
+
xref = @doc.add({Type: :XRef})
|
110
125
|
@doc.task(:optimize, object_streams: :delete, xref_streams: :generate)
|
111
126
|
assert_no_objstms
|
112
127
|
assert_xrefstms_generated
|
128
|
+
assert_equal([xref], @doc.revisions.current.find_all {|obj| obj.type == :XRef })
|
113
129
|
assert_default_deleted
|
114
130
|
end
|
115
131
|
end
|
data/test/hexapdf/test_writer.rb
CHANGED
@@ -40,7 +40,7 @@ describe HexaPDF::Writer do
|
|
40
40
|
219
|
41
41
|
%%EOF
|
42
42
|
3 0 obj
|
43
|
-
<</Producer(HexaPDF version 0.11.
|
43
|
+
<</Producer(HexaPDF version 0.11.7)>>
|
44
44
|
endobj
|
45
45
|
xref
|
46
46
|
3 1
|
@@ -72,7 +72,7 @@ describe HexaPDF::Writer do
|
|
72
72
|
141
|
73
73
|
%%EOF
|
74
74
|
6 0 obj
|
75
|
-
<</Producer(HexaPDF version 0.11.
|
75
|
+
<</Producer(HexaPDF version 0.11.7)>>
|
76
76
|
endobj
|
77
77
|
2 0 obj
|
78
78
|
<</Length 10>>stream
|
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.11.
|
4
|
+
version: 0.11.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas Leitner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-06-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cmdparse
|