pdf-reader 2.15.1 → 2.16.0
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 +24 -1
- data/Rakefile +1 -1
- data/lib/pdf/reader/bounding_rectangle_runs_filter.rb +1 -1
- data/lib/pdf/reader/buffer.rb +82 -30
- data/lib/pdf/reader/cmap.rb +6 -4
- data/lib/pdf/reader/encoding.rb +42 -26
- data/lib/pdf/reader/encoding_utils.rb +128 -0
- data/lib/pdf/reader/error.rb +16 -6
- data/lib/pdf/reader/font.rb +29 -18
- data/lib/pdf/reader/form_xobject.rb +5 -2
- data/lib/pdf/reader/key_builder_v5.rb +0 -1
- data/lib/pdf/reader/object_cache.rb +11 -7
- data/lib/pdf/reader/object_hash.rb +14 -9
- data/lib/pdf/reader/page.rb +2 -2
- data/lib/pdf/reader/page_layout.rb +1 -1
- data/lib/pdf/reader/page_state.rb +73 -29
- data/lib/pdf/reader/page_text_receiver.rb +43 -13
- data/lib/pdf/reader/pages_strategy.rb +1 -1
- data/lib/pdf/reader/parser.rb +52 -18
- data/lib/pdf/reader/point.rb +6 -0
- data/lib/pdf/reader/rc4.rb +43 -0
- data/lib/pdf/reader/rc4_security_handler.rb +2 -2
- data/lib/pdf/reader/rectangle.rb +13 -2
- data/lib/pdf/reader/reference.rb +1 -1
- data/lib/pdf/reader/standard_key_builder.rb +9 -10
- data/lib/pdf/reader/text_run.rb +13 -8
- data/lib/pdf/reader/transformation_matrix.rb +11 -0
- data/lib/pdf/reader/type_check.rb +1 -1
- data/lib/pdf/reader/xref.rb +6 -3
- data/lib/pdf/reader.rb +3 -53
- data/rbi/pdf-reader.rbi +118 -34
- metadata +6 -18
data/lib/pdf/reader/rectangle.rb
CHANGED
|
@@ -70,10 +70,21 @@ module PDF
|
|
|
70
70
|
bottom_right.x - bottom_left.x
|
|
71
71
|
end
|
|
72
72
|
|
|
73
|
+
# Is the point inside this rectangle? Nicer to read and use than contains_xy?(), but
|
|
74
|
+
# allocates more objects so be careful using on hot code paths.
|
|
75
|
+
#
|
|
73
76
|
#: (PDF::Reader::Point) -> bool
|
|
74
77
|
def contains?(point)
|
|
75
|
-
point.x
|
|
76
|
-
|
|
78
|
+
contains_xy?(point.x, point.y)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Is the point inside this rectangle? Worse to read and use than contains?(), but
|
|
82
|
+
# allocates fewer objects so may be preferrable on hot code paths.
|
|
83
|
+
#
|
|
84
|
+
#: (Numeric, Numeric) -> bool
|
|
85
|
+
def contains_xy?(x, y)
|
|
86
|
+
x >= bottom_left.x && x <= top_right.x &&
|
|
87
|
+
y >= bottom_left.y && y <= top_right.y
|
|
77
88
|
end
|
|
78
89
|
|
|
79
90
|
# A pdf-style 4-number array
|
data/lib/pdf/reader/reference.rb
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# typed: strict
|
|
3
3
|
|
|
4
4
|
require 'digest/md5'
|
|
5
|
-
require 'rc4'
|
|
5
|
+
require 'pdf/reader/rc4'
|
|
6
6
|
|
|
7
7
|
class PDF::Reader
|
|
8
8
|
|
|
@@ -91,22 +91,21 @@ class PDF::Reader
|
|
|
91
91
|
#
|
|
92
92
|
#: (String) -> String?
|
|
93
93
|
def auth_owner_pass(pass)
|
|
94
|
+
owner_key = @owner_key
|
|
95
|
+
raise MalformedPDFError, "encrypted PDF is missing an owner key" if owner_key.nil?
|
|
96
|
+
|
|
94
97
|
md5 = Digest::MD5.digest(pad_pass(pass))
|
|
95
98
|
if @revision > 2 then
|
|
96
99
|
50.times { md5 = Digest::MD5.digest(md5) }
|
|
97
100
|
keyBegins = md5[0, @key_length]
|
|
98
101
|
#first iteration decrypt owner_key
|
|
99
|
-
out =
|
|
102
|
+
out = owner_key
|
|
100
103
|
#RC4 keyed with (keyBegins XOR with iteration #) to decrypt previous out
|
|
101
104
|
19.downto(0).each { |i|
|
|
102
|
-
|
|
103
|
-
# know decrypt() returns a string
|
|
104
|
-
out = TypeCheck.cast_to_string!(
|
|
105
|
-
RC4.new(xor_each_byte(keyBegins,i)).decrypt(out)
|
|
106
|
-
)
|
|
105
|
+
out = Rc4.new(xor_each_byte(keyBegins,i)).decrypt(out)
|
|
107
106
|
}
|
|
108
107
|
else
|
|
109
|
-
out =
|
|
108
|
+
out = Rc4.new( md5[0, 5] ).decrypt( owner_key )
|
|
110
109
|
end
|
|
111
110
|
# c) check output as user password
|
|
112
111
|
auth_user_pass( out )
|
|
@@ -129,10 +128,10 @@ class PDF::Reader
|
|
|
129
128
|
#initialize out for first iteration
|
|
130
129
|
out = Digest::MD5.digest(PassPadBytes.pack("C*") + @file_id)
|
|
131
130
|
#zero doesn't matter -> so from 0-19
|
|
132
|
-
20.times{ |i| out=
|
|
131
|
+
20.times{ |i| out=Rc4.new(xor_each_byte(keyBegins, i)).encrypt(out) }
|
|
133
132
|
pass = @user_key.to_s[0, 16] == out
|
|
134
133
|
else
|
|
135
|
-
pass =
|
|
134
|
+
pass = Rc4.new(keyBegins).encrypt(PassPadBytes.pack("C*")) == @user_key
|
|
136
135
|
end
|
|
137
136
|
pass ? keyBegins : nil
|
|
138
137
|
end
|
data/lib/pdf/reader/text_run.rb
CHANGED
|
@@ -7,9 +7,6 @@ class PDF::Reader
|
|
|
7
7
|
class TextRun
|
|
8
8
|
include Comparable
|
|
9
9
|
|
|
10
|
-
#: PDF::Reader::Point
|
|
11
|
-
attr_reader :origin
|
|
12
|
-
|
|
13
10
|
#: Numeric
|
|
14
11
|
attr_reader :width
|
|
15
12
|
|
|
@@ -23,15 +20,23 @@ class PDF::Reader
|
|
|
23
20
|
|
|
24
21
|
#: (Numeric, Numeric, Numeric, Numeric, String) -> void
|
|
25
22
|
def initialize(x, y, width, font_size, text)
|
|
26
|
-
@
|
|
23
|
+
@x = x #: Numeric
|
|
24
|
+
@y = y #: Numeric
|
|
27
25
|
@width = width
|
|
28
26
|
@font_size = font_size
|
|
29
27
|
@text = text
|
|
28
|
+
@origin = nil #: PDF::Reader::Point | nil
|
|
30
29
|
@endx = nil #: Numeric | nil
|
|
31
30
|
@endy = nil #: Numeric | nil
|
|
32
31
|
@mergable_range = nil #: Range[Numeric] | nil
|
|
33
32
|
end
|
|
34
33
|
|
|
34
|
+
# Lazily constructed to avoid allocating a Point on every TextRun
|
|
35
|
+
#: () -> PDF::Reader::Point
|
|
36
|
+
def origin
|
|
37
|
+
@origin ||= PDF::Reader::Point.new(@x, @y)
|
|
38
|
+
end
|
|
39
|
+
|
|
35
40
|
# Allows collections of TextRun objects to be sorted. They will be sorted
|
|
36
41
|
# in order of their position on a cartesian plain - Top Left to Bottom Right
|
|
37
42
|
#: (PDF::Reader::Point) -> Numeric
|
|
@@ -53,22 +58,22 @@ class PDF::Reader
|
|
|
53
58
|
|
|
54
59
|
#: () -> Numeric
|
|
55
60
|
def x
|
|
56
|
-
@
|
|
61
|
+
@x
|
|
57
62
|
end
|
|
58
63
|
|
|
59
64
|
#: () -> Numeric
|
|
60
65
|
def y
|
|
61
|
-
@
|
|
66
|
+
@y
|
|
62
67
|
end
|
|
63
68
|
|
|
64
69
|
#: () -> Numeric
|
|
65
70
|
def endx
|
|
66
|
-
@endx ||= @
|
|
71
|
+
@endx ||= @x + width
|
|
67
72
|
end
|
|
68
73
|
|
|
69
74
|
#: () -> Numeric
|
|
70
75
|
def endy
|
|
71
|
-
@endy ||= @
|
|
76
|
+
@endy ||= @y + font_size
|
|
72
77
|
end
|
|
73
78
|
|
|
74
79
|
#: () -> Numeric
|
|
@@ -54,6 +54,17 @@ class PDF::Reader
|
|
|
54
54
|
@e,@f,1]
|
|
55
55
|
end
|
|
56
56
|
|
|
57
|
+
# Apply a left-multiplication by a translation matrix [1, 0, 0, 1, tx, ty]
|
|
58
|
+
# without allocating a new TransformationMatrix.
|
|
59
|
+
#
|
|
60
|
+
#: (Numeric, Numeric) -> void
|
|
61
|
+
def prepend_translation!(tx, ty)
|
|
62
|
+
new_e = (tx * @a) + (ty * @c) + @e
|
|
63
|
+
new_f = (tx * @b) + (ty * @d) + @f
|
|
64
|
+
@e = new_e
|
|
65
|
+
@f = new_f
|
|
66
|
+
end
|
|
67
|
+
|
|
57
68
|
# multiply this matrix with another.
|
|
58
69
|
#
|
|
59
70
|
# the second matrix is represented by the 6 scalar values that are changeable
|
data/lib/pdf/reader/xref.rb
CHANGED
|
@@ -151,14 +151,17 @@ class PDF::Reader
|
|
|
151
151
|
end
|
|
152
152
|
|
|
153
153
|
objid, count = params[0].to_i, params[1].to_i
|
|
154
|
-
count.times do
|
|
154
|
+
count.times do |entry_index|
|
|
155
155
|
offset = buf.token.to_i
|
|
156
156
|
generation = buf.token.to_i
|
|
157
157
|
state = buf.token
|
|
158
158
|
|
|
159
159
|
# Some PDF writers start numbering at 1 instead of 0. Fix up the number.
|
|
160
|
-
#
|
|
161
|
-
|
|
160
|
+
# Only apply this on the first entry of the section - if entry_index > 0,
|
|
161
|
+
# objid has been incremented from 0 and object 1 is a legitimate free entry.
|
|
162
|
+
if entry_index == 0 and objid == 1 and offset == 0 and generation == 65535 and state == 'f'
|
|
163
|
+
objid = 0
|
|
164
|
+
end
|
|
162
165
|
store(objid, generation, offset + @junk_offset) if state == "n" && offset > 0
|
|
163
166
|
objid += 1
|
|
164
167
|
params.clear
|
data/lib/pdf/reader.rb
CHANGED
|
@@ -130,7 +130,7 @@ module PDF
|
|
|
130
130
|
#: () -> Hash[untyped, untyped]?
|
|
131
131
|
def info
|
|
132
132
|
dict = @objects.deref_hash(@objects.trailer[:Info]) || {}
|
|
133
|
-
|
|
133
|
+
EncodingUtils.obj_to_utf8(dict)
|
|
134
134
|
end
|
|
135
135
|
|
|
136
136
|
# Return a String with extra XML metadata provided by the author of the PDF file. Not
|
|
@@ -234,58 +234,6 @@ module PDF
|
|
|
234
234
|
|
|
235
235
|
private
|
|
236
236
|
|
|
237
|
-
# recursively convert strings from outside a content stream into UTF-8
|
|
238
|
-
#
|
|
239
|
-
#: (untyped) -> untyped
|
|
240
|
-
def doc_strings_to_utf8(obj)
|
|
241
|
-
case obj
|
|
242
|
-
when ::Hash then
|
|
243
|
-
{}.tap { |new_hash|
|
|
244
|
-
obj.each do |key, value|
|
|
245
|
-
new_hash[key] = doc_strings_to_utf8(value)
|
|
246
|
-
end
|
|
247
|
-
}
|
|
248
|
-
when Array then
|
|
249
|
-
obj.map { |item| doc_strings_to_utf8(item) }
|
|
250
|
-
when String then
|
|
251
|
-
if has_utf16_bom?(obj)
|
|
252
|
-
utf16_to_utf8(obj)
|
|
253
|
-
else
|
|
254
|
-
pdfdoc_to_utf8(obj)
|
|
255
|
-
end
|
|
256
|
-
else
|
|
257
|
-
obj
|
|
258
|
-
end
|
|
259
|
-
end
|
|
260
|
-
|
|
261
|
-
#: (String) -> bool
|
|
262
|
-
def has_utf16_bom?(str)
|
|
263
|
-
first_bytes = str[0,2]
|
|
264
|
-
|
|
265
|
-
return false if first_bytes.nil?
|
|
266
|
-
|
|
267
|
-
first_bytes.unpack("C*") == [254, 255]
|
|
268
|
-
end
|
|
269
|
-
|
|
270
|
-
# TODO find a PDF I can use to spec this behaviour
|
|
271
|
-
#
|
|
272
|
-
#: (String) -> String
|
|
273
|
-
def pdfdoc_to_utf8(obj)
|
|
274
|
-
obj.force_encoding("utf-8")
|
|
275
|
-
obj
|
|
276
|
-
end
|
|
277
|
-
|
|
278
|
-
# one day we'll all run on a 1.9 compatible VM and I can just do this with
|
|
279
|
-
# String#encode
|
|
280
|
-
#
|
|
281
|
-
#: (String) -> String
|
|
282
|
-
def utf16_to_utf8(obj)
|
|
283
|
-
str = obj[2, obj.size].to_s
|
|
284
|
-
str = str.unpack("n*").pack("U*")
|
|
285
|
-
str.force_encoding("utf-8")
|
|
286
|
-
str
|
|
287
|
-
end
|
|
288
|
-
|
|
289
237
|
#: () -> Hash[Symbol, untyped]
|
|
290
238
|
def root
|
|
291
239
|
@root ||= @objects.deref_hash(@objects.trailer[:Root]) || {}
|
|
@@ -302,6 +250,7 @@ require 'pdf/reader/bounding_rectangle_runs_filter'
|
|
|
302
250
|
require 'pdf/reader/cid_widths'
|
|
303
251
|
require 'pdf/reader/cmap'
|
|
304
252
|
require 'pdf/reader/encoding'
|
|
253
|
+
require 'pdf/reader/encoding_utils'
|
|
305
254
|
require 'pdf/reader/error'
|
|
306
255
|
require 'pdf/reader/filter'
|
|
307
256
|
require 'pdf/reader/filter/ascii85'
|
|
@@ -333,6 +282,7 @@ require 'pdf/reader/standard_key_builder'
|
|
|
333
282
|
require 'pdf/reader/key_builder_v5'
|
|
334
283
|
require 'pdf/reader/aes_v2_security_handler'
|
|
335
284
|
require 'pdf/reader/aes_v3_security_handler'
|
|
285
|
+
require 'pdf/reader/rc4'
|
|
336
286
|
require 'pdf/reader/rc4_security_handler'
|
|
337
287
|
require 'pdf/reader/unimplemented_security_handler'
|
|
338
288
|
require 'pdf/reader/stream'
|
data/rbi/pdf-reader.rbi
CHANGED
|
@@ -33,21 +33,9 @@ class PDF::Reader
|
|
|
33
33
|
|
|
34
34
|
private
|
|
35
35
|
|
|
36
|
-
sig { params(obj: T.untyped).returns(T.untyped) }
|
|
37
|
-
def doc_strings_to_utf8(obj); end
|
|
38
|
-
|
|
39
|
-
sig { params(str: ::String).returns(T::Boolean) }
|
|
40
|
-
def has_utf16_bom?(str); end
|
|
41
|
-
|
|
42
|
-
sig { params(obj: ::String).returns(::String) }
|
|
43
|
-
def pdfdoc_to_utf8(obj); end
|
|
44
|
-
|
|
45
36
|
sig { returns(T::Hash[::Symbol, T.untyped]) }
|
|
46
37
|
def root; end
|
|
47
38
|
|
|
48
|
-
sig { params(obj: ::String).returns(::String) }
|
|
49
|
-
def utf16_to_utf8(obj); end
|
|
50
|
-
|
|
51
39
|
class << self
|
|
52
40
|
sig do
|
|
53
41
|
params(
|
|
@@ -198,6 +186,9 @@ class PDF::Reader::Buffer
|
|
|
198
186
|
sig { returns(T::Boolean) }
|
|
199
187
|
def in_content_stream?; end
|
|
200
188
|
|
|
189
|
+
sig { params(str: ::String, regexp: ::Regexp).returns(T::Boolean) }
|
|
190
|
+
def match?(str, regexp); end
|
|
191
|
+
|
|
201
192
|
sig { void }
|
|
202
193
|
def merge_indirect_reference; end
|
|
203
194
|
|
|
@@ -237,6 +228,7 @@ PDF::Reader::Buffer::ID = T.let(T.unsafe(nil), String)
|
|
|
237
228
|
PDF::Reader::Buffer::LEFT_PAREN = T.let(T.unsafe(nil), String)
|
|
238
229
|
PDF::Reader::Buffer::LESS_THAN = T.let(T.unsafe(nil), String)
|
|
239
230
|
PDF::Reader::Buffer::LF = T.let(T.unsafe(nil), String)
|
|
231
|
+
PDF::Reader::Buffer::NAME_TERMINATOR_BYTES = T.let(T.unsafe(nil), Array)
|
|
240
232
|
PDF::Reader::Buffer::NULL_BYTE = T.let(T.unsafe(nil), String)
|
|
241
233
|
PDF::Reader::Buffer::STREAM = T.let(T.unsafe(nil), String)
|
|
242
234
|
PDF::Reader::Buffer::TOKEN_DELIMITER = T.let(T.unsafe(nil), Array)
|
|
@@ -282,6 +274,7 @@ class PDF::Reader::CMap
|
|
|
282
274
|
end
|
|
283
275
|
|
|
284
276
|
PDF::Reader::CMap::CMAP_KEYWORDS = T.let(T.unsafe(nil), Hash)
|
|
277
|
+
PDF::Reader::CMap::EMPTY_CODEPOINTS = T.let(T.unsafe(nil), Array)
|
|
285
278
|
PDF::Reader::CMap::HIGH_SURROGATE_RANGE = T.let(T.unsafe(nil), Range)
|
|
286
279
|
|
|
287
280
|
class PDF::Reader::CidWidths
|
|
@@ -329,12 +322,12 @@ class PDF::Reader::Encoding
|
|
|
329
322
|
|
|
330
323
|
private
|
|
331
324
|
|
|
325
|
+
sig { params(file: ::String).returns(T::Hash[::Integer, ::Integer]) }
|
|
326
|
+
def build_file_mapping(file); end
|
|
327
|
+
|
|
332
328
|
sig { params(str: ::String).returns(::String) }
|
|
333
329
|
def convert_to_utf8(str); end
|
|
334
330
|
|
|
335
|
-
sig { returns(T::Hash[::Integer, ::Integer]) }
|
|
336
|
-
def default_mapping; end
|
|
337
|
-
|
|
338
331
|
sig { params(enc: ::Symbol).returns(T.nilable(::String)) }
|
|
339
332
|
def get_mapping_file(enc); end
|
|
340
333
|
|
|
@@ -350,15 +343,47 @@ class PDF::Reader::Encoding
|
|
|
350
343
|
sig { params(times: ::Integer).returns(::String) }
|
|
351
344
|
def little_boxes(times); end
|
|
352
345
|
|
|
353
|
-
sig { params(file: ::String).void }
|
|
354
|
-
def load_mapping(file); end
|
|
355
|
-
|
|
356
346
|
sig { returns(T::Boolean) }
|
|
357
347
|
def utf8_conversion_impossible?; end
|
|
348
|
+
|
|
349
|
+
sig { params(codepoint: ::Integer).returns(T::Boolean) }
|
|
350
|
+
def valid_unicode_scalar?(codepoint); end
|
|
358
351
|
end
|
|
359
352
|
|
|
360
353
|
PDF::Reader::Encoding::CONTROL_CHARS = T.let(T.unsafe(nil), Array)
|
|
354
|
+
PDF::Reader::Encoding::DEFAULT_MAPPING = T.let(T.unsafe(nil), Hash)
|
|
355
|
+
PDF::Reader::Encoding::FILE_MAPPINGS = T.let(T.unsafe(nil), Hash)
|
|
361
356
|
PDF::Reader::Encoding::UNKNOWN_CHAR = T.let(T.unsafe(nil), Integer)
|
|
357
|
+
|
|
358
|
+
class PDF::Reader::EncodingUtils
|
|
359
|
+
sig { params(obj: T.untyped).returns(T.untyped) }
|
|
360
|
+
def obj_to_utf8(obj); end
|
|
361
|
+
|
|
362
|
+
sig { params(str: ::String).returns(::String) }
|
|
363
|
+
def string_to_utf8(str); end
|
|
364
|
+
|
|
365
|
+
private
|
|
366
|
+
|
|
367
|
+
sig { params(str: ::String).returns(T::Boolean) }
|
|
368
|
+
def has_utf16_bom?(str); end
|
|
369
|
+
|
|
370
|
+
sig { params(str: ::String).returns(::String) }
|
|
371
|
+
def pdfdoc_to_utf8(str); end
|
|
372
|
+
|
|
373
|
+
sig { params(obj: ::String).returns(::String) }
|
|
374
|
+
def utf16_to_utf8(obj); end
|
|
375
|
+
|
|
376
|
+
class << self
|
|
377
|
+
sig { params(obj: T.untyped).returns(T.untyped) }
|
|
378
|
+
def obj_to_utf8(obj); end
|
|
379
|
+
|
|
380
|
+
sig { params(str: ::String).returns(::String) }
|
|
381
|
+
def string_to_utf8(str); end
|
|
382
|
+
end
|
|
383
|
+
end
|
|
384
|
+
|
|
385
|
+
PDF::Reader::EncodingUtils::PDFDOC_CODEPOINTS = T.let(T.unsafe(nil), Hash)
|
|
386
|
+
PDF::Reader::EncodingUtils::UTF16_BOM = T.let(T.unsafe(nil), Array)
|
|
362
387
|
class PDF::Reader::EncryptedPDFError < ::PDF::Reader::UnsupportedFeatureError; end
|
|
363
388
|
|
|
364
389
|
class PDF::Reader::Error
|
|
@@ -375,10 +400,10 @@ class PDF::Reader::Error
|
|
|
375
400
|
sig { params(object: ::Object, name: ::String).void }
|
|
376
401
|
def validate_not_nil(object, name); end
|
|
377
402
|
|
|
378
|
-
sig { params(object: ::Object, name: ::String, klass: ::Module).void }
|
|
403
|
+
sig { params(object: ::Object, name: ::String, klass: T::Module[T.untyped]).void }
|
|
379
404
|
def validate_type(object, name, klass); end
|
|
380
405
|
|
|
381
|
-
sig { params(object: ::Object, name: ::String, klass: ::Module).void }
|
|
406
|
+
sig { params(object: ::Object, name: ::String, klass: T::Module[T.untyped]).void }
|
|
382
407
|
def validate_type_as_malformed(object, name, klass); end
|
|
383
408
|
end
|
|
384
409
|
end
|
|
@@ -558,8 +583,8 @@ class PDF::Reader::Font
|
|
|
558
583
|
sig { params(obj: T::Hash[::Symbol, T.untyped]).void }
|
|
559
584
|
def extract_type3_info(obj); end
|
|
560
585
|
|
|
561
|
-
sig { params(
|
|
562
|
-
def font_matrix_transform(
|
|
586
|
+
sig { params(pt: ::PDF::Reader::Point).returns(::PDF::Reader::Point) }
|
|
587
|
+
def font_matrix_transform(pt); end
|
|
563
588
|
|
|
564
589
|
sig do
|
|
565
590
|
params(
|
|
@@ -825,25 +850,34 @@ class PDF::Reader::ObjectCache
|
|
|
825
850
|
def has_key?(key); end
|
|
826
851
|
def has_value?(value); end
|
|
827
852
|
|
|
828
|
-
sig { returns(
|
|
853
|
+
sig { returns(::Integer) }
|
|
829
854
|
def hits; end
|
|
830
855
|
|
|
831
856
|
def include?(key); end
|
|
832
857
|
def key?(key); end
|
|
858
|
+
|
|
859
|
+
sig { returns(T::Array[T.untyped]) }
|
|
833
860
|
def keys; end
|
|
861
|
+
|
|
834
862
|
def length; end
|
|
835
863
|
def member?(key); end
|
|
836
864
|
|
|
837
|
-
sig { returns(
|
|
865
|
+
sig { returns(::Integer) }
|
|
838
866
|
def misses; end
|
|
839
867
|
|
|
840
868
|
def size; end
|
|
869
|
+
|
|
870
|
+
sig { returns(::String) }
|
|
841
871
|
def to_s; end
|
|
872
|
+
|
|
873
|
+
sig { returns(T::Array[T.untyped]) }
|
|
842
874
|
def values; end
|
|
843
875
|
|
|
844
876
|
private
|
|
845
877
|
|
|
878
|
+
sig { params(obj: T.untyped).returns(T.nilable(T::Boolean)) }
|
|
846
879
|
def cacheable?(obj); end
|
|
880
|
+
|
|
847
881
|
def update_stats(key); end
|
|
848
882
|
end
|
|
849
883
|
|
|
@@ -852,7 +886,7 @@ PDF::Reader::ObjectCache::CACHEABLE_TYPES = T.let(T.unsafe(nil), Array)
|
|
|
852
886
|
class PDF::Reader::ObjectHash
|
|
853
887
|
include ::Enumerable
|
|
854
888
|
|
|
855
|
-
sig { params(input: T.
|
|
889
|
+
sig { params(input: T.untyped, opts: T::Hash[::Symbol, T.untyped]).void }
|
|
856
890
|
def initialize(input, opts = T.unsafe(nil)); end
|
|
857
891
|
|
|
858
892
|
sig { params(key: T.any(::Integer, ::PDF::Reader::Reference)).returns(T.untyped) }
|
|
@@ -1004,7 +1038,7 @@ class PDF::Reader::ObjectHash
|
|
|
1004
1038
|
end
|
|
1005
1039
|
def deref_internal!(key, seen); end
|
|
1006
1040
|
|
|
1007
|
-
sig { params(input: T.
|
|
1041
|
+
sig { params(input: T.untyped).returns(T.untyped) }
|
|
1008
1042
|
def extract_io_from(input); end
|
|
1009
1043
|
|
|
1010
1044
|
sig do
|
|
@@ -1241,7 +1275,13 @@ class PDF::Reader::PageState
|
|
|
1241
1275
|
def begin_text_object; end
|
|
1242
1276
|
def clone_state; end
|
|
1243
1277
|
def concatenate_matrix(a, b, c, d, e, f); end
|
|
1278
|
+
|
|
1279
|
+
sig { params(x: ::Numeric, y: ::Numeric).returns([::Numeric]) }
|
|
1244
1280
|
def ctm_transform(x, y); end
|
|
1281
|
+
|
|
1282
|
+
sig { params(pt: T.any(::Numeric, ::PDF::Reader::Point), opt_y: ::Numeric).returns(::PDF::Reader::Point) }
|
|
1283
|
+
def ctm_transform_point(pt, opt_y = T.unsafe(nil)); end
|
|
1284
|
+
|
|
1245
1285
|
def current_font; end
|
|
1246
1286
|
def end_text_object; end
|
|
1247
1287
|
def find_color_space(label); end
|
|
@@ -1272,8 +1312,13 @@ class PDF::Reader::PageState
|
|
|
1272
1312
|
def set_word_spacing(word_spacing); end
|
|
1273
1313
|
def show_text_with_positioning(params); end
|
|
1274
1314
|
def stack_depth; end
|
|
1315
|
+
|
|
1316
|
+
sig { params(x: ::Numeric, y: ::Numeric).returns(T::Array[::Numeric]) }
|
|
1275
1317
|
def trm_transform(x, y); end
|
|
1276
1318
|
|
|
1319
|
+
sig { params(pt: T.any(::Numeric, ::PDF::Reader::Point), opt_y: ::Numeric).returns(::PDF::Reader::Point) }
|
|
1320
|
+
def trm_transform_point(pt, opt_y = T.unsafe(nil)); end
|
|
1321
|
+
|
|
1277
1322
|
private
|
|
1278
1323
|
|
|
1279
1324
|
def build_fonts(raw_fonts); end
|
|
@@ -1288,9 +1333,14 @@ PDF::Reader::PageState::DEFAULT_GRAPHICS_STATE = T.let(T.unsafe(nil), Hash)
|
|
|
1288
1333
|
class PDF::Reader::PageTextReceiver
|
|
1289
1334
|
extend ::Forwardable
|
|
1290
1335
|
|
|
1336
|
+
def begin_marked_content_with_pl(tag, properties); end
|
|
1291
1337
|
def begin_text_object(*args, **_arg1, &block); end
|
|
1292
1338
|
def concatenate_matrix(*args, **_arg1, &block); end
|
|
1339
|
+
|
|
1340
|
+
sig { returns(::String) }
|
|
1293
1341
|
def content; end
|
|
1342
|
+
|
|
1343
|
+
def end_marked_content; end
|
|
1294
1344
|
def end_text_object(*args, **_arg1, &block); end
|
|
1295
1345
|
def font_size(*args, **_arg1, &block); end
|
|
1296
1346
|
def invoke_xobject(label); end
|
|
@@ -1323,9 +1373,15 @@ class PDF::Reader::PageTextReceiver
|
|
|
1323
1373
|
|
|
1324
1374
|
private
|
|
1325
1375
|
|
|
1326
|
-
|
|
1376
|
+
sig { params(pt: ::PDF::Reader::Point).returns(::PDF::Reader::Point) }
|
|
1377
|
+
def apply_rotation(pt); end
|
|
1378
|
+
|
|
1327
1379
|
def group_chars_into_runs(chars); end
|
|
1380
|
+
|
|
1381
|
+
sig { params(string: ::String).void }
|
|
1328
1382
|
def internal_show_text(string); end
|
|
1383
|
+
|
|
1384
|
+
sig { params(runs: T::Array[::PDF::Reader::TextRun]).returns(T::Array[::PDF::Reader::TextRun]) }
|
|
1329
1385
|
def merge_runs(runs); end
|
|
1330
1386
|
end
|
|
1331
1387
|
|
|
@@ -1334,8 +1390,15 @@ class PDF::Reader::PagesStrategy; end
|
|
|
1334
1390
|
PDF::Reader::PagesStrategy::OPERATORS = T.let(T.unsafe(nil), Hash)
|
|
1335
1391
|
|
|
1336
1392
|
class PDF::Reader::Parser
|
|
1337
|
-
sig
|
|
1338
|
-
|
|
1393
|
+
sig do
|
|
1394
|
+
params(
|
|
1395
|
+
buffer: ::PDF::Reader::Buffer,
|
|
1396
|
+
operators: T::Hash[T.any(::PDF::Reader::Token, ::String), ::Symbol],
|
|
1397
|
+
objects: T.nilable(::PDF::Reader::ObjectHash),
|
|
1398
|
+
relaxed_dictionaries: T::Boolean
|
|
1399
|
+
).void
|
|
1400
|
+
end
|
|
1401
|
+
def initialize(buffer, operators: T.unsafe(nil), objects: T.unsafe(nil), relaxed_dictionaries: T.unsafe(nil)); end
|
|
1339
1402
|
|
|
1340
1403
|
sig do
|
|
1341
1404
|
params(
|
|
@@ -1346,11 +1409,9 @@ class PDF::Reader::Parser
|
|
|
1346
1409
|
def object(id, gen); end
|
|
1347
1410
|
|
|
1348
1411
|
sig do
|
|
1349
|
-
|
|
1350
|
-
operators: T::Hash[T.any(::PDF::Reader::Token, ::String), ::Symbol]
|
|
1351
|
-
).returns(T.nilable(T.any(::Numeric, ::PDF::Reader::Reference, ::PDF::Reader::Token, ::String, ::Symbol, T::Array[T.untyped], T::Hash[T.untyped, T.untyped])))
|
|
1412
|
+
returns(T.nilable(T.any(::Numeric, ::PDF::Reader::Reference, ::PDF::Reader::Token, ::String, ::Symbol, T::Array[T.untyped], T::Hash[T.untyped, T.untyped])))
|
|
1352
1413
|
end
|
|
1353
|
-
def parse_token
|
|
1414
|
+
def parse_token; end
|
|
1354
1415
|
|
|
1355
1416
|
private
|
|
1356
1417
|
|
|
@@ -1363,6 +1424,9 @@ class PDF::Reader::Parser
|
|
|
1363
1424
|
sig { returns(::String) }
|
|
1364
1425
|
def hex_string; end
|
|
1365
1426
|
|
|
1427
|
+
sig { params(str: ::String, regexp: ::Regexp).returns(T::Boolean) }
|
|
1428
|
+
def match?(str, regexp); end
|
|
1429
|
+
|
|
1366
1430
|
sig { returns(::Symbol) }
|
|
1367
1431
|
def pdf_name; end
|
|
1368
1432
|
|
|
@@ -1373,6 +1437,7 @@ class PDF::Reader::Parser
|
|
|
1373
1437
|
def string; end
|
|
1374
1438
|
end
|
|
1375
1439
|
|
|
1440
|
+
PDF::Reader::Parser::INTERNED_TOKENS = T.let(T.unsafe(nil), Hash)
|
|
1376
1441
|
PDF::Reader::Parser::MAPPING = T.let(T.unsafe(nil), Hash)
|
|
1377
1442
|
PDF::Reader::Parser::STRATEGIES = T.let(T.unsafe(nil), Hash)
|
|
1378
1443
|
PDF::Reader::Parser::TOKEN_STRATEGY = T.let(T.unsafe(nil), Proc)
|
|
@@ -1391,6 +1456,9 @@ class PDF::Reader::Point
|
|
|
1391
1456
|
def y; end
|
|
1392
1457
|
end
|
|
1393
1458
|
|
|
1459
|
+
PDF::Reader::Point::ONE_ONE = T.let(T.unsafe(nil), PDF::Reader::Point)
|
|
1460
|
+
PDF::Reader::Point::ZERO_ZERO = T.let(T.unsafe(nil), PDF::Reader::Point)
|
|
1461
|
+
|
|
1394
1462
|
class PDF::Reader::PrintReceiver
|
|
1395
1463
|
sig { params(methodname: ::Symbol, args: T.untyped).void }
|
|
1396
1464
|
def method_missing(methodname, *args); end
|
|
@@ -1399,6 +1467,16 @@ class PDF::Reader::PrintReceiver
|
|
|
1399
1467
|
def respond_to?(meth); end
|
|
1400
1468
|
end
|
|
1401
1469
|
|
|
1470
|
+
class PDF::Reader::Rc4
|
|
1471
|
+
sig { params(key: ::String).void }
|
|
1472
|
+
def initialize(key); end
|
|
1473
|
+
|
|
1474
|
+
sig { params(data: ::String).returns(::String) }
|
|
1475
|
+
def decrypt(data); end
|
|
1476
|
+
|
|
1477
|
+
def encrypt(*args, **_arg1, &blk); end
|
|
1478
|
+
end
|
|
1479
|
+
|
|
1402
1480
|
class PDF::Reader::Rc4SecurityHandler
|
|
1403
1481
|
sig { params(key: ::String).void }
|
|
1404
1482
|
def initialize(key); end
|
|
@@ -1426,6 +1504,9 @@ class PDF::Reader::Rectangle
|
|
|
1426
1504
|
sig { params(point: ::PDF::Reader::Point).returns(T::Boolean) }
|
|
1427
1505
|
def contains?(point); end
|
|
1428
1506
|
|
|
1507
|
+
sig { params(x: ::Numeric, y: ::Numeric).returns(T::Boolean) }
|
|
1508
|
+
def contains_xy?(x, y); end
|
|
1509
|
+
|
|
1429
1510
|
sig { returns(::Numeric) }
|
|
1430
1511
|
def height; end
|
|
1431
1512
|
|
|
@@ -1743,6 +1824,9 @@ class PDF::Reader::TransformationMatrix
|
|
|
1743
1824
|
end
|
|
1744
1825
|
def multiply!(a, b, c, d, e, f); end
|
|
1745
1826
|
|
|
1827
|
+
sig { params(tx: ::Numeric, ty: ::Numeric).void }
|
|
1828
|
+
def prepend_translation!(tx, ty); end
|
|
1829
|
+
|
|
1746
1830
|
sig { returns([::Numeric]) }
|
|
1747
1831
|
def to_a; end
|
|
1748
1832
|
|
|
@@ -1781,7 +1865,7 @@ class PDF::Reader::TypeCheck
|
|
|
1781
1865
|
sig { params(string: T.untyped).returns(::String) }
|
|
1782
1866
|
def cast_to_string!(string); end
|
|
1783
1867
|
|
|
1784
|
-
sig { params(obj: T.untyped).returns(::Symbol) }
|
|
1868
|
+
sig { params(obj: T.untyped).returns(T.nilable(::Symbol)) }
|
|
1785
1869
|
def cast_to_symbol(obj); end
|
|
1786
1870
|
|
|
1787
1871
|
sig { params(obj: T.untyped).returns(::Symbol) }
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: pdf-reader
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.16.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- James Healy
|
|
@@ -119,20 +119,6 @@ dependencies:
|
|
|
119
119
|
- - "!="
|
|
120
120
|
- !ruby/object:Gem::Version
|
|
121
121
|
version: 2.0.0
|
|
122
|
-
- !ruby/object:Gem::Dependency
|
|
123
|
-
name: ruby-rc4
|
|
124
|
-
requirement: !ruby/object:Gem::Requirement
|
|
125
|
-
requirements:
|
|
126
|
-
- - ">="
|
|
127
|
-
- !ruby/object:Gem::Version
|
|
128
|
-
version: '0'
|
|
129
|
-
type: :runtime
|
|
130
|
-
prerelease: false
|
|
131
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
132
|
-
requirements:
|
|
133
|
-
- - ">="
|
|
134
|
-
- !ruby/object:Gem::Version
|
|
135
|
-
version: '0'
|
|
136
122
|
- !ruby/object:Gem::Dependency
|
|
137
123
|
name: hashery
|
|
138
124
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -240,6 +226,7 @@ files:
|
|
|
240
226
|
- lib/pdf/reader/cid_widths.rb
|
|
241
227
|
- lib/pdf/reader/cmap.rb
|
|
242
228
|
- lib/pdf/reader/encoding.rb
|
|
229
|
+
- lib/pdf/reader/encoding_utils.rb
|
|
243
230
|
- lib/pdf/reader/encodings/mac_expert.txt
|
|
244
231
|
- lib/pdf/reader/encodings/mac_roman.txt
|
|
245
232
|
- lib/pdf/reader/encodings/pdf_doc.txt
|
|
@@ -278,6 +265,7 @@ files:
|
|
|
278
265
|
- lib/pdf/reader/parser.rb
|
|
279
266
|
- lib/pdf/reader/point.rb
|
|
280
267
|
- lib/pdf/reader/print_receiver.rb
|
|
268
|
+
- lib/pdf/reader/rc4.rb
|
|
281
269
|
- lib/pdf/reader/rc4_security_handler.rb
|
|
282
270
|
- lib/pdf/reader/rectangle.rb
|
|
283
271
|
- lib/pdf/reader/reference.rb
|
|
@@ -307,9 +295,9 @@ licenses:
|
|
|
307
295
|
- MIT
|
|
308
296
|
metadata:
|
|
309
297
|
bug_tracker_uri: https://github.com/yob/pdf-reader/issues
|
|
310
|
-
changelog_uri: https://github.com/yob/pdf-reader/blob/v2.
|
|
311
|
-
documentation_uri: https://www.rubydoc.info/gems/pdf-reader/2.
|
|
312
|
-
source_code_uri: https://github.com/yob/pdf-reader/tree/v2.
|
|
298
|
+
changelog_uri: https://github.com/yob/pdf-reader/blob/v2.16.0/CHANGELOG
|
|
299
|
+
documentation_uri: https://www.rubydoc.info/gems/pdf-reader/2.16.0
|
|
300
|
+
source_code_uri: https://github.com/yob/pdf-reader/tree/v2.16.0
|
|
313
301
|
rdoc_options:
|
|
314
302
|
- "--title"
|
|
315
303
|
- PDF::Reader Documentation
|