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.
@@ -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 >= bottom_left.x && point.x <= top_right.x &&
76
- point.y >= bottom_left.y && point.y <= top_right.y
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
@@ -71,7 +71,7 @@ class PDF::Reader
71
71
  # return an identical hash
72
72
  #: () -> Integer
73
73
  def hash
74
- "#{self.id}:#{self.gen}".hash
74
+ (id << 16) ^ gen
75
75
  end
76
76
  ################################################################################
77
77
  end
@@ -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 = @owner_key
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
- # The RC4 gem doen't have type annotations, so the type checker doesn't
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 = RC4.new( md5[0, 5] ).decrypt( @owner_key )
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=RC4.new(xor_each_byte(keyBegins, i)).encrypt(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 = RC4.new(keyBegins).encrypt(PassPadBytes.pack("C*")) == @user_key
134
+ pass = Rc4.new(keyBegins).encrypt(PassPadBytes.pack("C*")) == @user_key
136
135
  end
137
136
  pass ? keyBegins : nil
138
137
  end
@@ -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
- @origin = PDF::Reader::Point.new(x, y) #: PDF::Reader::Point
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
- @origin.x
61
+ @x
57
62
  end
58
63
 
59
64
  #: () -> Numeric
60
65
  def y
61
- @origin.y
66
+ @y
62
67
  end
63
68
 
64
69
  #: () -> Numeric
65
70
  def endx
66
- @endx ||= @origin.x + width
71
+ @endx ||= @x + width
67
72
  end
68
73
 
69
74
  #: () -> Numeric
70
75
  def endy
71
- @endy ||= @origin.y + font_size
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
@@ -50,7 +50,7 @@ module PDF
50
50
  end
51
51
  end
52
52
 
53
- #: (untyped) -> Symbol | nil
53
+ #: (untyped) -> (Symbol | nil)
54
54
  def self.cast_to_symbol(obj)
55
55
  if obj.is_a?(Symbol)
56
56
  obj
@@ -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
- # TODO should this fix be logged?
161
- objid = 0 if objid == 1 and offset == 0 and generation == 65535 and state == 'f'
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
- doc_strings_to_utf8(dict)
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(x: ::Numeric, y: ::Numeric).returns([::Numeric, ::Numeric]) }
562
- def font_matrix_transform(x, y); end
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(T.untyped) }
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(T.untyped) }
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.any(::IO, ::String, ::StringIO, ::Tempfile), opts: T::Hash[::Symbol, T.untyped]).void }
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.any(::IO, ::String, ::StringIO, ::Tempfile)).returns(T.any(::IO, ::StringIO, ::Tempfile)) }
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
- def apply_rotation(x, y); end
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 { params(buffer: ::PDF::Reader::Buffer, objects: T.nilable(::PDF::Reader::ObjectHash)).void }
1338
- def initialize(buffer, objects = T.unsafe(nil)); end
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
- params(
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(operators = T.unsafe(nil)); end
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.15.1
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.15.1/CHANGELOG
311
- documentation_uri: https://www.rubydoc.info/gems/pdf-reader/2.15.1
312
- source_code_uri: https://github.com/yob/pdf-reader/tree/v2.15.1
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