hexapdf 0.32.1 → 0.32.2
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 +13 -0
- data/lib/hexapdf/cli.rb +4 -0
- data/lib/hexapdf/parser.rb +1 -1
- data/lib/hexapdf/type/object_stream.rb +5 -2
- data/lib/hexapdf/version.rb +1 -1
- data/test/hexapdf/test_parser.rb +1 -1
- data/test/hexapdf/test_writer.rb +3 -3
- data/test/hexapdf/type/test_object_stream.rb +9 -3
- 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: f0907362b897b39d61fa8f859510ccfb31ebd5ad88b94a9e36ff62c62fae813a
|
|
4
|
+
data.tar.gz: 469465941253bad5e769fc0dd5a57e437c578fdecda52a0fea908370ef8b7169
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2fc77d33ddc2c6fb377a778b82f92f01fed93d9a4e494cd57c97dc0a00fce4baa7cab185776f8a3303507d68b544e4404ac2f33b72c3b1a7cc7c65ee838c7dd7
|
|
7
|
+
data.tar.gz: 21a08984f424b91594a2d8e6fc705a7f9458a990918ee77adef469e758ae2fee976ba905a7a4a696c5c2728831d02f8845dc9b5316c28de4ff5c7f062521a7e3
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
## 0.32.2 - 2023-05-06
|
|
2
|
+
|
|
3
|
+
### Changed
|
|
4
|
+
|
|
5
|
+
* Cross-reference table reconstruction to be more relaxed concerning the
|
|
6
|
+
`endobj` keyword
|
|
7
|
+
|
|
8
|
+
### Fixed
|
|
9
|
+
|
|
10
|
+
* [HexaPDF::Type::ObjectStream] to not compress any encryption dictionary
|
|
11
|
+
instead of only the current one
|
|
12
|
+
|
|
13
|
+
|
|
1
14
|
## 0.32.1 - 2023-04-20
|
|
2
15
|
|
|
3
16
|
### Added
|
data/lib/hexapdf/cli.rb
CHANGED
|
@@ -62,6 +62,10 @@ module HexaPDF
|
|
|
62
62
|
Application.new.parse(args)
|
|
63
63
|
rescue StandardError => e
|
|
64
64
|
$stderr.puts "Problem encountered: #{e.message}"
|
|
65
|
+
unless e.kind_of?(HexaPDF::Error)
|
|
66
|
+
$stderr.puts "--> The problem might indicate a faulty PDF or a bug in HexaPDF."
|
|
67
|
+
$stderr.puts "--> Please report this at https://github.com/gettalong/hexapdf/issues - thanks!"
|
|
68
|
+
end
|
|
65
69
|
exit(1)
|
|
66
70
|
end
|
|
67
71
|
|
data/lib/hexapdf/parser.rb
CHANGED
|
@@ -458,7 +458,7 @@ module HexaPDF
|
|
|
458
458
|
linearized = obj.kind_of?(Hash) && obj.key?(:Linearized)
|
|
459
459
|
@tokenizer.pos = pos
|
|
460
460
|
end
|
|
461
|
-
@tokenizer.scan_until(
|
|
461
|
+
@tokenizer.scan_until(/\bendobj\b/)
|
|
462
462
|
end
|
|
463
463
|
elsif token.kind_of?(Tokenizer::Token) && token == 'trailer'
|
|
464
464
|
obj = @tokenizer.next_object rescue nil
|
|
@@ -172,13 +172,16 @@ module HexaPDF
|
|
|
172
172
|
serializer = Serializer.new
|
|
173
173
|
obj_to_stm = {}
|
|
174
174
|
|
|
175
|
-
|
|
175
|
+
is_encrypt_dict = document.revisions.each.with_object({}) do |rev, hash|
|
|
176
|
+
hash[rev.trailer[:Encrypt]] = true
|
|
177
|
+
end
|
|
176
178
|
while index < objects.size / 2
|
|
177
179
|
obj = revision.object(objects[index])
|
|
178
180
|
|
|
179
181
|
# Due to a bug in Adobe Acrobat, the Catalog may not be in an object stream if the
|
|
180
182
|
# document is encrypted
|
|
181
|
-
if obj.nil? || obj.null? || obj.gen != 0 || obj.kind_of?(Stream) ||
|
|
183
|
+
if obj.nil? || obj.null? || obj.gen != 0 || obj.kind_of?(Stream) ||
|
|
184
|
+
is_encrypt_dict[obj] ||
|
|
182
185
|
obj.type == :Catalog ||
|
|
183
186
|
obj.type == :Sig || obj.type == :DocTimeStamp ||
|
|
184
187
|
(obj.respond_to?(:key?) && obj.key?(:ByteRange) && obj.key?(:Contents))
|
data/lib/hexapdf/version.rb
CHANGED
data/test/hexapdf/test_parser.rb
CHANGED
|
@@ -609,7 +609,7 @@ describe HexaPDF::Parser do
|
|
|
609
609
|
end
|
|
610
610
|
|
|
611
611
|
it "serially parses the contents" do
|
|
612
|
-
create_parser("1 0 obj\n5\
|
|
612
|
+
create_parser("1 0 obj\n5 endobj\n1 0 obj\n6\nendobj\ntrailer\n<</Size 1>>")
|
|
613
613
|
assert_equal(6, @parser.load_object(@xref).value)
|
|
614
614
|
end
|
|
615
615
|
|
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.32.
|
|
43
|
+
<</Producer(HexaPDF version 0.32.2)>>
|
|
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.32.
|
|
75
|
+
<</Producer(HexaPDF version 0.32.2)>>
|
|
76
76
|
endobj
|
|
77
77
|
2 0 obj
|
|
78
78
|
<</Length 10>>stream
|
|
@@ -214,7 +214,7 @@ describe HexaPDF::Writer do
|
|
|
214
214
|
<</Type/Page/MediaBox[0 0 595 842]/Parent 2 0 R/Resources<<>>>>
|
|
215
215
|
endobj
|
|
216
216
|
5 0 obj
|
|
217
|
-
<</Producer(HexaPDF version 0.32.
|
|
217
|
+
<</Producer(HexaPDF version 0.32.2)>>
|
|
218
218
|
endobj
|
|
219
219
|
4 0 obj
|
|
220
220
|
<</Root 1 0 R/Info 5 0 R/Size 6/Type/XRef/W[1 1 2]/Index[0 6]/Filter/FlateDecode/DecodeParms<</Columns 4/Predictor 12>>/Length 33>>stream
|
|
@@ -23,9 +23,14 @@ describe HexaPDF::Type::ObjectStream do
|
|
|
23
23
|
before do
|
|
24
24
|
@doc = Object.new
|
|
25
25
|
@doc.instance_variable_set(:@version, '1.5')
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
@doc.define_singleton_method(:revisions) do
|
|
27
|
+
rev1 = Object.new
|
|
28
|
+
def rev1.trailer; {Encrypt: HexaPDF::Object.new({}, oid: 10)}; end
|
|
29
|
+
rev2 = Object.new
|
|
30
|
+
def rev2.trailer; {Encrypt: HexaPDF::Object.new({}, oid: 9)}; end
|
|
31
|
+
@revisions ||= [rev1, rev2]
|
|
28
32
|
end
|
|
33
|
+
@doc.define_singleton_method(:trailer) { revisions.last.trailer }
|
|
29
34
|
@obj = HexaPDF::Type::ObjectStream.new({N: 2, First: 8}, oid: 1, document: @doc,
|
|
30
35
|
stream: "1 0 5 2 5 [1 2]")
|
|
31
36
|
end
|
|
@@ -96,8 +101,9 @@ describe HexaPDF::Type::ObjectStream do
|
|
|
96
101
|
assert_equal("", @obj.stream)
|
|
97
102
|
end
|
|
98
103
|
|
|
99
|
-
it "doesn't allow
|
|
104
|
+
it "doesn't allow an encryption dictionary to be compressed" do
|
|
100
105
|
@obj.add_object(@doc.trailer[:Encrypt])
|
|
106
|
+
@obj.add_object(@doc.revisions[0].trailer[:Encrypt])
|
|
101
107
|
@obj.write_objects(@revision)
|
|
102
108
|
assert_equal(0, @obj.value[:N])
|
|
103
109
|
assert_equal(0, @obj.value[:First])
|
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.32.
|
|
4
|
+
version: 0.32.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Thomas Leitner
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-
|
|
11
|
+
date: 2023-05-06 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: cmdparse
|