pdf-reader 2.9.0 → 2.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +11 -0
- data/lib/pdf/reader/cid_widths.rb +5 -5
- data/lib/pdf/reader/error.rb +0 -4
- data/lib/pdf/reader/filter/depredict.rb +1 -1
- data/lib/pdf/reader/filter.rb +9 -10
- data/lib/pdf/reader/font.rb +10 -11
- data/lib/pdf/reader/font_descriptor.rb +3 -1
- data/lib/pdf/reader/form_xobject.rb +4 -1
- data/lib/pdf/reader/lzw.rb +25 -10
- data/lib/pdf/reader/object_hash.rb +12 -6
- data/lib/pdf/reader/object_stream.rb +2 -2
- data/lib/pdf/reader/page.rb +3 -1
- data/lib/pdf/reader/page_state.rb +7 -1
- data/lib/pdf/reader/parser.rb +11 -2
- data/lib/pdf/reader/resources.rb +2 -1
- data/lib/pdf/reader/stream.rb +1 -1
- data/lib/pdf/reader/type_check.rb +46 -0
- data/lib/pdf/reader/validating_receiver.rb +1 -1
- data/lib/pdf/reader/width_calculator/built_in.rb +3 -2
- data/lib/pdf/reader/width_calculator/composite.rb +6 -2
- data/lib/pdf/reader/width_calculator/true_type.rb +10 -12
- data/lib/pdf/reader/width_calculator/type_one_or_three.rb +6 -5
- data/lib/pdf/reader/width_calculator/type_zero.rb +6 -3
- data/rbi/pdf-reader.rbi +150 -103
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 55bfae4c5211a0f3ac70845500183e237d3d5f9cc81d548a27f4b8c5fd5acfc9
|
4
|
+
data.tar.gz: 9e9000474695100c4874afd9abf5f6290ea0b59ffa773c3d03a4a3fc3d2a0a4c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2dc96f064c3b233bd499a5a8140bb6f61fd1bdadb2582ac9bc569adff911e63aaadc16188d6624e0ed766481d453912bf5e0057add84262d753681cc40f51776
|
7
|
+
data.tar.gz: 64dfac4dd2b73a5302be95c47e74e7ca8b94fc6daeaea30c7a33cca6b4be79b68facc571d209f44a59de2632f6241166a290fe0f2835498b2b7d611906b05a31
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
v2.10.0 (12th May 2022)
|
2
|
+
- Various bug fixes
|
3
|
+
- Expanded sorbet type annotations
|
4
|
+
|
5
|
+
v2.9.2 (20th February 2022)
|
6
|
+
- Fix PDF::Reader::ObjectHash#page_references to return an Array of PDF::Reader::Reference (http://github.com/yob/pdf-reader/pull/444)
|
7
|
+
|
8
|
+
v2.9.1 (4th February 2022)
|
9
|
+
- Fix exception in Page#walk introduced in 2.9.0 (http://github.com/yob/pdf-reader/pull/442)
|
10
|
+
- Other small bug fixes
|
11
|
+
|
1
12
|
v2.9.0 (24th January 2022)
|
2
13
|
- Support additional encryption standards (http://github.com/yob/pdf-reader/pull/419)
|
3
14
|
- Return CropBox correctly from Page#rectangles (https://github.com/yob/pdf-reader/pull/420)
|
@@ -1,9 +1,7 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
# typed:
|
2
|
+
# typed: strict
|
3
3
|
# frozen_string_literal: true
|
4
4
|
|
5
|
-
#
|
6
|
-
|
7
5
|
require 'forwardable'
|
8
6
|
|
9
7
|
class PDF::Reader
|
@@ -33,10 +31,10 @@ class PDF::Reader
|
|
33
31
|
params << array.shift
|
34
32
|
|
35
33
|
if params.size == 2 && params.last.is_a?(Array)
|
36
|
-
widths.merge! parse_first_form(params.first, params.last)
|
34
|
+
widths.merge! parse_first_form(params.first.to_i, Array(params.last))
|
37
35
|
params = []
|
38
36
|
elsif params.size == 3
|
39
|
-
widths.merge! parse_second_form(params[0], params[1], params[2])
|
37
|
+
widths.merge! parse_second_form(params[0].to_i, params[1].to_i, params[2].to_i)
|
40
38
|
params = []
|
41
39
|
end
|
42
40
|
end
|
@@ -54,6 +52,8 @@ class PDF::Reader
|
|
54
52
|
|
55
53
|
# this is the form 10 20 123 where all index between 10 and 20 have width 123
|
56
54
|
def parse_second_form(first, final, width)
|
55
|
+
raise MalformedPDFError, "CidWidths: #{first} must be less than #{final}" unless first < final
|
56
|
+
|
57
57
|
(first..final).inject({}) { |accum, index|
|
58
58
|
accum[index] = width
|
59
59
|
accum
|
data/lib/pdf/reader/error.rb
CHANGED
@@ -58,10 +58,6 @@ class PDF::Reader
|
|
58
58
|
def self.validate_not_nil(object, name)
|
59
59
|
raise ArgumentError, "#{object} must not be nil" if object.nil?
|
60
60
|
end
|
61
|
-
################################################################################
|
62
|
-
def self.validate_not_nil_as_malformed(object, name)
|
63
|
-
raise MalformedPDFError, "#{object} must not be nil" if object.nil?
|
64
|
-
end
|
65
61
|
end
|
66
62
|
|
67
63
|
################################################################################
|
data/lib/pdf/reader/filter.rb
CHANGED
@@ -43,16 +43,15 @@ class PDF::Reader
|
|
43
43
|
#
|
44
44
|
def self.with(name, options = {})
|
45
45
|
case name
|
46
|
-
when :ASCII85Decode then PDF::Reader::Filter::Ascii85.new(options)
|
47
|
-
when :ASCIIHexDecode then PDF::Reader::Filter::AsciiHex.new(options)
|
48
|
-
when :CCITTFaxDecode then PDF::Reader::Filter::Null.new(options)
|
49
|
-
when :DCTDecode then PDF::Reader::Filter::Null.new(options)
|
50
|
-
when :FlateDecode
|
51
|
-
when :
|
52
|
-
when :
|
53
|
-
when :
|
54
|
-
when :
|
55
|
-
when :RunLengthDecode then PDF::Reader::Filter::RunLength.new(options)
|
46
|
+
when :ASCII85Decode, :A85 then PDF::Reader::Filter::Ascii85.new(options)
|
47
|
+
when :ASCIIHexDecode, :AHx then PDF::Reader::Filter::AsciiHex.new(options)
|
48
|
+
when :CCITTFaxDecode, :CCF then PDF::Reader::Filter::Null.new(options)
|
49
|
+
when :DCTDecode, :DCT then PDF::Reader::Filter::Null.new(options)
|
50
|
+
when :FlateDecode, :Fl then PDF::Reader::Filter::Flate.new(options)
|
51
|
+
when :JBIG2Decode then PDF::Reader::Filter::Null.new(options)
|
52
|
+
when :JPXDecode then PDF::Reader::Filter::Null.new(options)
|
53
|
+
when :LZWDecode, :LZW then PDF::Reader::Filter::Lzw.new(options)
|
54
|
+
when :RunLengthDecode, :RL then PDF::Reader::Filter::RunLength.new(options)
|
56
55
|
else
|
57
56
|
raise UnsupportedFeatureError, "Unknown filter: #{name}"
|
58
57
|
end
|
data/lib/pdf/reader/font.rb
CHANGED
@@ -205,14 +205,17 @@ class PDF::Reader
|
|
205
205
|
end
|
206
206
|
|
207
207
|
def extract_descendants(obj)
|
208
|
-
return unless obj[:DescendantFonts]
|
209
208
|
# per PDF 32000-1:2008 pp. 280 :DescendentFonts is:
|
210
209
|
# A one-element array specifying the CIDFont dictionary that is the
|
211
210
|
# descendant of this Type 0 font.
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
211
|
+
if obj[:DescendantFonts]
|
212
|
+
descendants = @ohash.deref_array(obj[:DescendantFonts])
|
213
|
+
@descendantfonts = descendants.map { |desc|
|
214
|
+
PDF::Reader::Font.new(@ohash, @ohash.deref_hash(desc))
|
215
|
+
}
|
216
|
+
else
|
217
|
+
@descendantfonts = []
|
218
|
+
end
|
216
219
|
end
|
217
220
|
|
218
221
|
def to_utf8_via_cmap(params)
|
@@ -226,9 +229,7 @@ class PDF::Reader
|
|
226
229
|
@tounicode.decode(c) || PDF::Reader::Encoding::UNKNOWN_CHAR
|
227
230
|
}.flatten.pack("U*")
|
228
231
|
when Array
|
229
|
-
params.collect { |param| to_utf8_via_cmap(param) }
|
230
|
-
else
|
231
|
-
params
|
232
|
+
params.collect { |param| to_utf8_via_cmap(param) }.join("")
|
232
233
|
end
|
233
234
|
end
|
234
235
|
|
@@ -243,9 +244,7 @@ class PDF::Reader
|
|
243
244
|
when String
|
244
245
|
encoding.to_utf8(params)
|
245
246
|
when Array
|
246
|
-
params.collect { |param| to_utf8_via_encoding(param) }
|
247
|
-
else
|
248
|
-
params
|
247
|
+
params.collect { |param| to_utf8_via_encoding(param) }.join("")
|
249
248
|
end
|
250
249
|
end
|
251
250
|
|
@@ -45,7 +45,7 @@ module PDF
|
|
45
45
|
def font_objects
|
46
46
|
raw_fonts = @objects.deref_hash(fonts)
|
47
47
|
::Hash[raw_fonts.map { |label, font|
|
48
|
-
[label, PDF::Reader::Font.new(@objects, @objects.deref_hash(font))]
|
48
|
+
[label, PDF::Reader::Font.new(@objects, @objects.deref_hash(font) || {})]
|
49
49
|
}]
|
50
50
|
end
|
51
51
|
|
@@ -55,6 +55,9 @@ module PDF
|
|
55
55
|
# See the comments on PDF::Reader::Page#walk for more detail.
|
56
56
|
#
|
57
57
|
def walk(*receivers)
|
58
|
+
receivers = receivers.map { |receiver|
|
59
|
+
ValidatingReceiver.new(receiver)
|
60
|
+
}
|
58
61
|
content_stream(receivers, raw_content)
|
59
62
|
end
|
60
63
|
|
data/lib/pdf/reader/lzw.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
# typed:
|
2
|
+
# typed: strict
|
3
3
|
# frozen_string_literal: true
|
4
4
|
|
5
5
|
module PDF
|
@@ -25,12 +25,14 @@ module PDF
|
|
25
25
|
def initialize(data, bits_in_chunk)
|
26
26
|
@data = data
|
27
27
|
@data.force_encoding("BINARY")
|
28
|
-
|
28
|
+
set_bits_in_chunk(bits_in_chunk)
|
29
29
|
@current_pos = 0
|
30
30
|
@bits_left_in_byte = 8
|
31
31
|
end
|
32
32
|
|
33
33
|
def set_bits_in_chunk(bits_in_chunk)
|
34
|
+
raise MalformedPDFError, "invalid LZW bits" if bits_in_chunk < 9 || bits_in_chunk > 12
|
35
|
+
|
34
36
|
@bits_in_chunk = bits_in_chunk
|
35
37
|
end
|
36
38
|
|
@@ -39,7 +41,7 @@ module PDF
|
|
39
41
|
chunk = -1
|
40
42
|
while bits_left_in_chunk > 0 and @current_pos < @data.size
|
41
43
|
chunk = 0 if chunk < 0
|
42
|
-
codepoint = @data[@current_pos, 1].unpack("C*")[0]
|
44
|
+
codepoint = @data[@current_pos, 1].to_s.unpack("C*")[0].to_i
|
43
45
|
current_byte = codepoint & (2**@bits_left_in_byte - 1) #clear consumed bits
|
44
46
|
dif = bits_left_in_chunk - @bits_left_in_byte
|
45
47
|
if dif > 0 then current_byte <<= dif
|
@@ -61,21 +63,25 @@ module PDF
|
|
61
63
|
CODE_CLEAR_TABLE = 256 #clear table
|
62
64
|
|
63
65
|
# stores de pairs code => string
|
64
|
-
class StringTable
|
66
|
+
class StringTable
|
65
67
|
attr_reader :string_table_pos
|
66
68
|
|
67
69
|
def initialize
|
68
|
-
|
70
|
+
@data = Hash.new
|
69
71
|
@string_table_pos = 258 #initial code
|
70
72
|
end
|
71
73
|
|
72
74
|
#if code less than 258 return fixed string
|
73
75
|
def [](key)
|
74
|
-
if key > 257
|
76
|
+
if key > 257
|
77
|
+
@data[key]
|
78
|
+
else
|
79
|
+
key.chr
|
80
|
+
end
|
75
81
|
end
|
76
82
|
|
77
83
|
def add(string)
|
78
|
-
store(@string_table_pos, string)
|
84
|
+
@data.store(@string_table_pos, string)
|
79
85
|
@string_table_pos += 1
|
80
86
|
end
|
81
87
|
end
|
@@ -83,7 +89,7 @@ module PDF
|
|
83
89
|
# Decompresses a LZW compressed string.
|
84
90
|
#
|
85
91
|
def self.decode(data)
|
86
|
-
stream = BitStream.new
|
92
|
+
stream = BitStream.new(data.to_s, 9) # size of codes between 9 and 12 bits
|
87
93
|
string_table = StringTable.new
|
88
94
|
result = "".dup
|
89
95
|
until (code = stream.read) == CODE_EOD
|
@@ -119,8 +125,17 @@ module PDF
|
|
119
125
|
result
|
120
126
|
end
|
121
127
|
|
122
|
-
def self.create_new_string(string_table,some_code, other_code)
|
123
|
-
|
128
|
+
def self.create_new_string(string_table, some_code, other_code)
|
129
|
+
raise MalformedPDFError, "invalid LZW data" if some_code.nil? || other_code.nil?
|
130
|
+
|
131
|
+
item_one = string_table[some_code]
|
132
|
+
item_two = string_table[other_code]
|
133
|
+
|
134
|
+
if item_one && item_two
|
135
|
+
item_one + item_two.chr
|
136
|
+
else
|
137
|
+
raise MalformedPDFError, "invalid LZW data"
|
138
|
+
end
|
124
139
|
end
|
125
140
|
private_class_method :create_new_string
|
126
141
|
|
@@ -243,7 +243,7 @@ class PDF::Reader
|
|
243
243
|
|
244
244
|
obj.tap { |obj|
|
245
245
|
if !obj.is_a?(PDF::Reader::Stream)
|
246
|
-
raise MalformedPDFError, "expected object to be
|
246
|
+
raise MalformedPDFError, "expected object to be a Stream or nil"
|
247
247
|
end
|
248
248
|
}
|
249
249
|
end
|
@@ -496,7 +496,9 @@ class PDF::Reader
|
|
496
496
|
def fetch_object_stream(key)
|
497
497
|
if xref[key].is_a?(PDF::Reader::Reference)
|
498
498
|
container_key = xref[key]
|
499
|
-
|
499
|
+
stream = deref_stream(container_key)
|
500
|
+
raise MalformedPDFError, "Object Stream cannot be nil" if stream.nil?
|
501
|
+
object_streams[container_key] ||= PDF::Reader::ObjectStream.new(stream)
|
500
502
|
object_streams[container_key][key.id]
|
501
503
|
end
|
502
504
|
end
|
@@ -571,12 +573,16 @@ class PDF::Reader
|
|
571
573
|
# the Array is significant and matches the page ordering of the document
|
572
574
|
#
|
573
575
|
def get_page_objects(obj)
|
574
|
-
|
576
|
+
derefed_obj = deref_hash(obj)
|
577
|
+
|
578
|
+
if derefed_obj.nil?
|
579
|
+
raise MalformedPDFError, "Expected Page or Pages object, got nil"
|
580
|
+
elsif derefed_obj[:Type] == :Page
|
575
581
|
[obj]
|
576
|
-
elsif
|
577
|
-
kids = deref_array(
|
582
|
+
elsif derefed_obj[:Kids]
|
583
|
+
kids = deref_array(derefed_obj[:Kids]) || []
|
578
584
|
kids.map { |kid|
|
579
|
-
get_page_objects(
|
585
|
+
get_page_objects(kid)
|
580
586
|
}.flatten
|
581
587
|
else
|
582
588
|
raise MalformedPDFError, "Expected Page or Pages object"
|
@@ -24,7 +24,7 @@ class PDF::Reader
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def size
|
27
|
-
@dict[:N]
|
27
|
+
TypeCheck.cast_to_int!(@dict[:N])
|
28
28
|
end
|
29
29
|
|
30
30
|
private
|
@@ -40,7 +40,7 @@ class PDF::Reader
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def first
|
43
|
-
@dict[:First]
|
43
|
+
TypeCheck.cast_to_int!(@dict[:First])
|
44
44
|
end
|
45
45
|
|
46
46
|
def buffer
|
data/lib/pdf/reader/page.rb
CHANGED
@@ -278,7 +278,9 @@ module PDF
|
|
278
278
|
[]
|
279
279
|
else
|
280
280
|
obj = objects.deref_hash(origin)
|
281
|
-
|
281
|
+
if obj.nil?
|
282
|
+
raise MalformedPDFError, "parent mus not be nil"
|
283
|
+
end
|
282
284
|
[ select_inheritable(obj) ] + ancestors(obj[:Parent])
|
283
285
|
end
|
284
286
|
end
|
@@ -16,7 +16,7 @@ class PDF::Reader
|
|
16
16
|
:h_scaling => 1.0,
|
17
17
|
:text_leading => 0,
|
18
18
|
:text_font => nil,
|
19
|
-
:text_font_size =>
|
19
|
+
:text_font_size => 0,
|
20
20
|
:text_mode => 0,
|
21
21
|
:text_rise => 0,
|
22
22
|
:text_knockout => 0
|
@@ -32,6 +32,12 @@ class PDF::Reader
|
|
32
32
|
@cs_stack = [page.color_spaces]
|
33
33
|
@stack = [DEFAULT_GRAPHICS_STATE.dup]
|
34
34
|
state[:ctm] = identity_matrix
|
35
|
+
|
36
|
+
# These are only valid when inside a `BT` block and we re-initialize them on each
|
37
|
+
# `BT`. However, we need the instance variables set so PDFs with the text operators
|
38
|
+
# out order don't trigger NoMethodError when these are nil
|
39
|
+
@text_matrix = identity_matrix
|
40
|
+
@text_line_matrix = identity_matrix
|
35
41
|
end
|
36
42
|
|
37
43
|
#####################################################
|
data/lib/pdf/reader/parser.rb
CHANGED
@@ -96,7 +96,13 @@ class PDF::Reader
|
|
96
96
|
# id - the object ID to return
|
97
97
|
# gen - the object revision number to return
|
98
98
|
def object(id, gen)
|
99
|
-
|
99
|
+
idCheck = parse_token
|
100
|
+
|
101
|
+
# Sometimes the xref table is corrupt and points to an offset slightly too early in the file.
|
102
|
+
# check the next token, maybe we can find the start of the object we're looking for
|
103
|
+
if idCheck != id
|
104
|
+
Error.assert_equal(parse_token, id)
|
105
|
+
end
|
100
106
|
Error.assert_equal(parse_token, gen)
|
101
107
|
Error.str_assert(parse_token, "obj")
|
102
108
|
|
@@ -222,7 +228,10 @@ class PDF::Reader
|
|
222
228
|
data = @buffer.read(length, :skip_eol => true)
|
223
229
|
|
224
230
|
Error.str_assert(parse_token, "endstream")
|
225
|
-
|
231
|
+
|
232
|
+
# We used to assert that the stream had the correct closing token, but it doesn't *really*
|
233
|
+
# matter if it's missing, and other readers seems to handle its absence just fine
|
234
|
+
# Error.str_assert(parse_token, "endobj")
|
226
235
|
|
227
236
|
PDF::Reader::Stream.new(dict, data)
|
228
237
|
end
|
data/lib/pdf/reader/resources.rb
CHANGED
data/lib/pdf/reader/stream.rb
CHANGED
@@ -40,7 +40,7 @@ class PDF::Reader
|
|
40
40
|
# Creates a new stream with the specified dictionary and data. The dictionary
|
41
41
|
# should be a standard ruby hash, the data should be a standard ruby string.
|
42
42
|
def initialize(hash, data)
|
43
|
-
@hash = hash
|
43
|
+
@hash = TypeCheck.cast_to_pdf_dict!(hash)
|
44
44
|
@data = data
|
45
45
|
@udata = nil
|
46
46
|
end
|
@@ -9,6 +9,18 @@ module PDF
|
|
9
9
|
#
|
10
10
|
class TypeCheck
|
11
11
|
|
12
|
+
def self.cast_to_int!(obj)
|
13
|
+
if obj.is_a?(Integer)
|
14
|
+
obj
|
15
|
+
elsif obj.nil?
|
16
|
+
0
|
17
|
+
elsif obj.respond_to?(:to_i)
|
18
|
+
obj.to_i
|
19
|
+
else
|
20
|
+
raise MalformedPDFError, "Unable to cast to integer"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
12
24
|
def self.cast_to_numeric!(obj)
|
13
25
|
if obj.is_a?(Numeric)
|
14
26
|
obj
|
@@ -46,6 +58,40 @@ module PDF
|
|
46
58
|
raise MalformedPDFError, "Unable to cast to symbol"
|
47
59
|
end
|
48
60
|
end
|
61
|
+
|
62
|
+
def self.cast_to_symbol!(obj)
|
63
|
+
res = cast_to_symbol(obj)
|
64
|
+
if res
|
65
|
+
res
|
66
|
+
else
|
67
|
+
raise MalformedPDFError, "Unable to cast to symbol"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.cast_to_pdf_dict!(obj)
|
72
|
+
if obj.is_a?(Hash)
|
73
|
+
obj
|
74
|
+
elsif obj.respond_to?(:to_h)
|
75
|
+
obj.to_h
|
76
|
+
else
|
77
|
+
raise MalformedPDFError, "Unable to cast to hash"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def self.cast_to_pdf_dict_with_stream_values!(obj)
|
82
|
+
if obj.is_a?(Hash)
|
83
|
+
result = Hash.new
|
84
|
+
obj.each do |k, v|
|
85
|
+
raise MalformedPDFError, "Expected a stream" unless v.is_a?(PDF::Reader::Stream)
|
86
|
+
result[cast_to_symbol!(k)] = v
|
87
|
+
end
|
88
|
+
result
|
89
|
+
elsif obj.respond_to?(:to_h)
|
90
|
+
cast_to_pdf_dict_with_stream_values!(obj.to_h)
|
91
|
+
else
|
92
|
+
raise MalformedPDFError, "Unable to cast to hash"
|
93
|
+
end
|
94
|
+
end
|
49
95
|
end
|
50
96
|
end
|
51
97
|
end
|
@@ -53,12 +53,13 @@ class PDF::Reader
|
|
53
53
|
private
|
54
54
|
|
55
55
|
def control_character?(code_point)
|
56
|
-
@font.encoding.int_to_name(code_point).first.to_s[/\Acontrol..\Z/]
|
56
|
+
match = @font.encoding.int_to_name(code_point).first.to_s[/\Acontrol..\Z/]
|
57
|
+
match ? true : false
|
57
58
|
end
|
58
59
|
|
59
60
|
def extract_basefont(font_name)
|
60
61
|
if BUILTINS.include?(font_name)
|
61
|
-
font_name
|
62
|
+
font_name.to_s
|
62
63
|
else
|
63
64
|
"Times-Roman"
|
64
65
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
# typed:
|
2
|
+
# typed: strict
|
3
3
|
# frozen_string_literal: true
|
4
4
|
|
5
5
|
class PDF::Reader
|
@@ -22,7 +22,11 @@ class PDF::Reader
|
|
22
22
|
|
23
23
|
w = @widths[code_point]
|
24
24
|
# 0 is a valid width
|
25
|
-
|
25
|
+
if w
|
26
|
+
w.to_f
|
27
|
+
else
|
28
|
+
0
|
29
|
+
end
|
26
30
|
end
|
27
31
|
end
|
28
32
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
# typed:
|
2
|
+
# typed: strict
|
3
3
|
# frozen_string_literal: true
|
4
4
|
|
5
5
|
class PDF::Reader
|
@@ -10,8 +10,8 @@ class PDF::Reader
|
|
10
10
|
def initialize(font)
|
11
11
|
@font = font
|
12
12
|
|
13
|
-
if @font.font_descriptor
|
14
|
-
@missing_width =
|
13
|
+
if fd = @font.font_descriptor
|
14
|
+
@missing_width = fd.missing_width
|
15
15
|
else
|
16
16
|
@missing_width = 0
|
17
17
|
end
|
@@ -30,25 +30,23 @@ class PDF::Reader
|
|
30
30
|
|
31
31
|
# in ruby a negative index is valid, and will go from the end of the array
|
32
32
|
# which is undesireable in this case.
|
33
|
-
|
34
|
-
|
33
|
+
first_char = @font.first_char
|
34
|
+
if first_char && first_char <= code_point
|
35
|
+
@font.widths.fetch(code_point - first_char, @missing_width.to_i).to_f
|
35
36
|
else
|
36
37
|
@missing_width.to_f
|
37
38
|
end
|
38
39
|
end
|
39
40
|
|
40
41
|
def glyph_width_from_descriptor(code_point)
|
41
|
-
return unless @font.font_descriptor
|
42
|
-
|
43
42
|
# true type fonts will have most of their information contained
|
44
43
|
# with-in a program inside the font descriptor, however the widths
|
45
44
|
# may not be in standard PDF glyph widths (1000 units => 1 text space unit)
|
46
45
|
# so this width will need to be scaled
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
nil
|
46
|
+
if fd = @font.font_descriptor
|
47
|
+
if w = fd.glyph_width(code_point)
|
48
|
+
w.to_f * fd.glyph_to_pdf_scale_factor.to_f
|
49
|
+
end
|
52
50
|
end
|
53
51
|
end
|
54
52
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
# typed:
|
2
|
+
# typed: strict
|
3
3
|
# frozen_string_literal: true
|
4
4
|
|
5
5
|
class PDF::Reader
|
@@ -10,8 +10,8 @@ class PDF::Reader
|
|
10
10
|
def initialize(font)
|
11
11
|
@font = font
|
12
12
|
|
13
|
-
if @font.font_descriptor
|
14
|
-
@missing_width =
|
13
|
+
if fd = @font.font_descriptor
|
14
|
+
@missing_width = fd.missing_width
|
15
15
|
else
|
16
16
|
@missing_width = 0
|
17
17
|
end
|
@@ -23,8 +23,9 @@ class PDF::Reader
|
|
23
23
|
|
24
24
|
# in ruby a negative index is valid, and will go from the end of the array
|
25
25
|
# which is undesireable in this case.
|
26
|
-
|
27
|
-
|
26
|
+
first_char = @font.first_char
|
27
|
+
if first_char && first_char <= code_point
|
28
|
+
@font.widths.fetch(code_point - first_char, @missing_width.to_i).to_f
|
28
29
|
else
|
29
30
|
@missing_width.to_f
|
30
31
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
# typed:
|
2
|
+
# typed: strict
|
3
3
|
# frozen_string_literal: true
|
4
4
|
|
5
5
|
class PDF::Reader
|
@@ -13,13 +13,16 @@ class PDF::Reader
|
|
13
13
|
|
14
14
|
def initialize(font)
|
15
15
|
@font = font
|
16
|
-
@descendant_font = @font.descendantfonts.first
|
17
16
|
end
|
18
17
|
|
19
18
|
def glyph_width(code_point)
|
20
19
|
return 0 if code_point.nil? || code_point < 0
|
21
20
|
|
22
|
-
@
|
21
|
+
if descendant_font = @font.descendantfonts.first
|
22
|
+
descendant_font.glyph_width(code_point).to_f
|
23
|
+
else
|
24
|
+
0
|
25
|
+
end
|
23
26
|
end
|
24
27
|
end
|
25
28
|
end
|
data/rbi/pdf-reader.rbi
CHANGED
@@ -145,16 +145,18 @@ module PDF
|
|
145
145
|
end
|
146
146
|
|
147
147
|
class CidWidths
|
148
|
-
sig { params(default:
|
149
|
-
def initialize(default, array)
|
148
|
+
sig { params(default: Numeric, array: T::Array[Numeric]).void }
|
149
|
+
def initialize(default, array)
|
150
|
+
@widths = T.let(T.unsafe(nil), T::Hash[Numeric, Numeric])
|
151
|
+
end
|
150
152
|
|
151
|
-
sig { params(default:
|
153
|
+
sig { params(default: Numeric, array: T::Array[Numeric]).returns(T::Hash[Numeric, Numeric]) }
|
152
154
|
def parse_array(default, array); end
|
153
155
|
|
154
|
-
sig { params(first:
|
156
|
+
sig { params(first: Integer, widths: T::Array[Numeric]).returns(T::Hash[Numeric, Numeric]) }
|
155
157
|
def parse_first_form(first, widths); end
|
156
158
|
|
157
|
-
sig { params(first:
|
159
|
+
sig { params(first: Integer, final: Integer, width: Numeric).returns(T::Hash[Numeric, Numeric]) }
|
158
160
|
def parse_second_form(first, final, width); end
|
159
161
|
end
|
160
162
|
|
@@ -279,9 +281,6 @@ module PDF
|
|
279
281
|
|
280
282
|
sig { params(object: Object, name: String).void }
|
281
283
|
def self.validate_not_nil(object, name); end
|
282
|
-
|
283
|
-
sig { params(object: Object, name: String).void }
|
284
|
-
def self.validate_not_nil_as_malformed(object, name); end
|
285
284
|
end
|
286
285
|
|
287
286
|
class MalformedPDFError < RuntimeError
|
@@ -300,138 +299,146 @@ module PDF
|
|
300
299
|
end
|
301
300
|
|
302
301
|
class Font
|
303
|
-
sig { returns(T.
|
302
|
+
sig { returns(T.nilable(Symbol)) }
|
304
303
|
attr_accessor :subtype
|
305
304
|
|
306
|
-
sig { returns(
|
305
|
+
sig { returns(PDF::Reader::Encoding) }
|
307
306
|
attr_accessor :encoding
|
308
307
|
|
309
|
-
sig { returns(T
|
308
|
+
sig { returns(T::Array[PDF::Reader::Font]) }
|
310
309
|
attr_accessor :descendantfonts
|
311
310
|
|
312
|
-
sig { returns(
|
311
|
+
sig { returns(PDF::Reader::CMap) }
|
313
312
|
attr_accessor :tounicode
|
314
313
|
|
315
|
-
sig { returns(T
|
314
|
+
sig { returns(T::Array[Integer]) }
|
316
315
|
attr_reader :widths
|
317
316
|
|
318
|
-
sig { returns(T.
|
317
|
+
sig { returns(T.nilable(Integer)) }
|
319
318
|
attr_reader :first_char
|
320
319
|
|
321
|
-
sig { returns(T.
|
320
|
+
sig { returns(T.nilable(Integer)) }
|
322
321
|
attr_reader :last_char
|
323
322
|
|
324
|
-
sig { returns(T.
|
323
|
+
sig { returns(T.nilable(Symbol)) }
|
325
324
|
attr_reader :basefont
|
326
325
|
|
327
|
-
sig { returns(T.
|
326
|
+
sig { returns(T.nilable(PDF::Reader::FontDescriptor)) }
|
328
327
|
attr_reader :font_descriptor
|
329
328
|
|
330
|
-
sig { returns(T
|
329
|
+
sig { returns(T::Array[Numeric]) }
|
331
330
|
attr_reader :cid_widths
|
332
331
|
|
333
|
-
sig { returns(
|
332
|
+
sig { returns(Numeric) }
|
334
333
|
attr_reader :cid_default_width
|
335
334
|
|
336
|
-
sig { params(ohash:
|
335
|
+
sig { params(ohash: PDF::Reader::ObjectHash, obj: T::Hash[Symbol, T.untyped]).void }
|
337
336
|
def initialize(ohash, obj); end
|
338
337
|
|
339
|
-
sig { params(params: T.untyped).returns(
|
338
|
+
sig { params(params: T.any(Integer, String, T::Array[T.untyped])).returns(String) }
|
340
339
|
def to_utf8(params); end
|
341
340
|
|
342
|
-
sig { params(data:
|
341
|
+
sig { params(data: String).returns(T::Array[T.nilable(T.any(Numeric, String))]) }
|
343
342
|
def unpack(data); end
|
344
343
|
|
345
|
-
sig { params(code_point: T.
|
344
|
+
sig { params(code_point: T.any(String, Integer)).returns(T.untyped) }
|
346
345
|
def glyph_width(code_point); end
|
347
346
|
|
348
|
-
sig { params(font_name:
|
347
|
+
sig { params(font_name: Symbol).returns(PDF::Reader::Encoding) }
|
349
348
|
def default_encoding(font_name); end
|
350
349
|
|
351
|
-
sig {
|
350
|
+
sig {
|
351
|
+
returns(
|
352
|
+
T.any(
|
353
|
+
PDF::Reader::WidthCalculator::BuiltIn,
|
354
|
+
PDF::Reader::WidthCalculator::Composite,
|
355
|
+
PDF::Reader::WidthCalculator::TrueType,
|
356
|
+
PDF::Reader::WidthCalculator::TypeOneOrThree,
|
357
|
+
PDF::Reader::WidthCalculator::TypeZero,
|
358
|
+
)
|
359
|
+
)
|
360
|
+
}
|
352
361
|
def build_width_calculator; end
|
353
362
|
|
354
|
-
sig { params(obj: T.untyped).
|
363
|
+
sig { params(obj: T.untyped).void }
|
355
364
|
def extract_base_info(obj); end
|
356
365
|
|
357
|
-
sig { params(obj: T.untyped).
|
366
|
+
sig { params(obj: T.untyped).void }
|
358
367
|
def extract_descriptor(obj); end
|
359
368
|
|
360
|
-
sig { params(obj: T.untyped).
|
369
|
+
sig { params(obj: T.untyped).void }
|
361
370
|
def extract_descendants(obj); end
|
362
371
|
|
363
|
-
sig { params(params: T.untyped).returns(
|
372
|
+
sig { params(params: T.any(Integer, String, T::Array[T.untyped])).returns(String) }
|
364
373
|
def to_utf8_via_cmap(params); end
|
365
374
|
|
366
|
-
sig { params(params: T.untyped).returns(
|
375
|
+
sig { params(params: T.any(Integer, String, T::Array[T.untyped])).returns(String) }
|
367
376
|
def to_utf8_via_encoding(params); end
|
368
377
|
end
|
369
378
|
|
370
379
|
class FontDescriptor
|
371
|
-
sig { returns(
|
380
|
+
sig { returns(String) }
|
372
381
|
attr_reader :font_name
|
373
382
|
|
374
|
-
sig { returns(T.
|
383
|
+
sig { returns(T.nilable(String)) }
|
375
384
|
attr_reader :font_family
|
376
385
|
|
377
|
-
sig { returns(
|
386
|
+
sig { returns(Symbol) }
|
378
387
|
attr_reader :font_stretch
|
379
388
|
|
380
|
-
sig { returns(
|
389
|
+
sig { returns(Numeric) }
|
381
390
|
attr_reader :font_weight
|
382
391
|
|
383
|
-
sig { returns(T
|
392
|
+
sig { returns(T::Array[Numeric]) }
|
384
393
|
attr_reader :font_bounding_box
|
385
394
|
|
386
|
-
sig { returns(
|
395
|
+
sig { returns(Numeric) }
|
387
396
|
attr_reader :cap_height
|
388
397
|
|
389
|
-
sig { returns(
|
398
|
+
sig { returns(Numeric) }
|
390
399
|
attr_reader :ascent
|
391
400
|
|
392
|
-
sig { returns(
|
401
|
+
sig { returns(Numeric) }
|
393
402
|
attr_reader :descent
|
394
403
|
|
395
|
-
sig { returns(
|
404
|
+
sig { returns(Numeric) }
|
396
405
|
attr_reader :leading
|
397
406
|
|
398
|
-
sig { returns(
|
407
|
+
sig { returns(Numeric) }
|
399
408
|
attr_reader :avg_width
|
400
409
|
|
401
|
-
sig { returns(
|
410
|
+
sig { returns(Numeric) }
|
402
411
|
attr_reader :max_width
|
403
412
|
|
404
|
-
sig { returns(
|
413
|
+
sig { returns(Numeric) }
|
405
414
|
attr_reader :missing_width
|
406
415
|
|
407
|
-
sig { returns(T.
|
416
|
+
sig { returns(T.nilable(Numeric)) }
|
408
417
|
attr_reader :italic_angle
|
409
418
|
|
410
|
-
sig { returns(T.
|
419
|
+
sig { returns(T.nilable(Numeric)) }
|
411
420
|
attr_reader :stem_v
|
412
421
|
|
413
|
-
sig { returns(T.
|
422
|
+
sig { returns(T.nilable(Numeric)) }
|
414
423
|
attr_reader :x_height
|
415
424
|
|
416
|
-
sig { returns(
|
425
|
+
sig { returns(Integer) }
|
417
426
|
attr_reader :font_flags
|
418
427
|
|
419
428
|
sig { params(ohash: PDF::Reader::ObjectHash, fd_hash: T::Hash[T.untyped, T.untyped]).void }
|
420
429
|
def initialize(ohash, fd_hash); end
|
421
430
|
|
422
|
-
sig { params(char_code:
|
431
|
+
sig { params(char_code: Integer).returns(Numeric) }
|
423
432
|
def glyph_width(char_code); end
|
424
433
|
|
425
|
-
sig { returns(
|
434
|
+
sig { returns(Numeric) }
|
426
435
|
def glyph_to_pdf_scale_factor; end
|
427
436
|
|
428
|
-
sig { returns(
|
437
|
+
sig { returns(TTFunk::File) }
|
429
438
|
def ttf_program_stream; end
|
430
439
|
end
|
431
440
|
|
432
441
|
class FormXObject
|
433
|
-
include ResourceMethods
|
434
|
-
|
435
442
|
sig { returns(T.untyped) }
|
436
443
|
attr_reader :xobject
|
437
444
|
|
@@ -517,34 +524,43 @@ module PDF
|
|
517
524
|
CODE_CLEAR_TABLE = 256
|
518
525
|
|
519
526
|
class BitStream
|
520
|
-
sig { params(data:
|
521
|
-
def initialize(data, bits_in_chunk)
|
527
|
+
sig { params(data: String, bits_in_chunk: Integer).void }
|
528
|
+
def initialize(data, bits_in_chunk)
|
529
|
+
@data = T.let(T.unsafe(nil), String)
|
530
|
+
@bits_in_chunk = T.let(T.unsafe(nil), Integer)
|
531
|
+
@current_pos = T.let(T.unsafe(nil), Integer)
|
532
|
+
@bits_left_in_byte = T.let(T.unsafe(nil), Integer)
|
533
|
+
|
534
|
+
end
|
522
535
|
|
523
|
-
sig { params(bits_in_chunk:
|
536
|
+
sig { params(bits_in_chunk: Integer).void }
|
524
537
|
def set_bits_in_chunk(bits_in_chunk); end
|
525
538
|
|
526
|
-
sig { returns(
|
539
|
+
sig { returns(Integer) }
|
527
540
|
def read; end
|
528
541
|
end
|
529
542
|
|
530
|
-
class StringTable
|
531
|
-
sig { returns(
|
543
|
+
class StringTable
|
544
|
+
sig { returns(Integer) }
|
532
545
|
attr_reader :string_table_pos
|
533
546
|
|
534
547
|
sig { void }
|
535
|
-
def initialize
|
548
|
+
def initialize
|
549
|
+
@data = T.let(T.unsafe(nil), T::Hash[Integer, String])
|
550
|
+
@string_table_pos = T.let(T.unsafe(nil), Integer)
|
551
|
+
end
|
536
552
|
|
537
|
-
sig { params(key:
|
553
|
+
sig { params(key: Integer).returns(T.nilable(String)) }
|
538
554
|
def [](key); end
|
539
555
|
|
540
|
-
sig { params(string:
|
556
|
+
sig { params(string: String).void }
|
541
557
|
def add(string); end
|
542
558
|
end
|
543
559
|
|
544
|
-
sig { params(data:
|
560
|
+
sig { params(data: String).returns(String) }
|
545
561
|
def self.decode(data); end
|
546
562
|
|
547
|
-
sig { params(string_table:
|
563
|
+
sig { params(string_table: PDF::Reader::LZW::StringTable, some_code: T.nilable(Integer), other_code: T.nilable(Integer)).returns(String) }
|
548
564
|
def self.create_new_string(string_table, some_code, other_code); end
|
549
565
|
end
|
550
566
|
|
@@ -647,7 +663,7 @@ module PDF
|
|
647
663
|
sig { params(key: T.untyped).returns(T.nilable(T::Array[Numeric])) }
|
648
664
|
def deref_array_of_numbers(key); end
|
649
665
|
|
650
|
-
sig { params(key: T.untyped).returns(T.nilable(T
|
666
|
+
sig { params(key: T.untyped).returns(T.nilable(T::Hash[Symbol, T.untyped])) }
|
651
667
|
def deref_hash(key); end
|
652
668
|
|
653
669
|
sig { params(key: T.untyped).returns(T.nilable(Symbol)) }
|
@@ -674,10 +690,10 @@ module PDF
|
|
674
690
|
sig { params(key: T.untyped).returns(T.untyped) }
|
675
691
|
def deref!(key); end
|
676
692
|
|
677
|
-
sig { params(key: T.untyped).returns(T::Array[T.untyped]) }
|
693
|
+
sig { params(key: T.untyped).returns(T.nilable(T::Array[T.untyped])) }
|
678
694
|
def deref_array!(key); end
|
679
695
|
|
680
|
-
sig { params(key: T.untyped).returns(T::Hash[Symbol, T.untyped]) }
|
696
|
+
sig { params(key: T.untyped).returns(T.nilable(T::Hash[Symbol, T.untyped])) }
|
681
697
|
def deref_hash!(key); end
|
682
698
|
|
683
699
|
sig { params(key: T.untyped, local_default: T.untyped).returns(T.untyped) }
|
@@ -763,22 +779,25 @@ module PDF
|
|
763
779
|
end
|
764
780
|
|
765
781
|
class ObjectStream
|
766
|
-
sig { params(stream:
|
767
|
-
def initialize(stream)
|
782
|
+
sig { params(stream: PDF::Reader::Stream).void }
|
783
|
+
def initialize(stream)
|
784
|
+
@dict = T.let(T.unsafe(nil), T::Hash[Symbol, T.untyped])
|
785
|
+
@data = T.let(T.unsafe(nil), String)
|
786
|
+
end
|
768
787
|
|
769
788
|
sig { params(objid: T.untyped).returns(T.untyped) }
|
770
789
|
def [](objid); end
|
771
790
|
|
772
|
-
sig { returns(
|
791
|
+
sig { returns(Integer) }
|
773
792
|
def size; end
|
774
793
|
|
775
|
-
sig { returns(T
|
794
|
+
sig { returns(T::Hash[Integer, Integer]) }
|
776
795
|
def offsets; end
|
777
796
|
|
778
|
-
sig { returns(
|
797
|
+
sig { returns(Integer) }
|
779
798
|
def first; end
|
780
799
|
|
781
|
-
sig { returns(
|
800
|
+
sig { returns(PDF::Reader::Buffer) }
|
782
801
|
def buffer; end
|
783
802
|
end
|
784
803
|
|
@@ -807,8 +826,6 @@ module PDF
|
|
807
826
|
end
|
808
827
|
|
809
828
|
class Page
|
810
|
-
include ResourceMethods
|
811
|
-
|
812
829
|
sig { returns(PDF::Reader::ObjectHash) }
|
813
830
|
attr_reader :objects
|
814
831
|
|
@@ -881,7 +898,7 @@ module PDF
|
|
881
898
|
sig { params(origin: T.untyped).returns(T.untyped) }
|
882
899
|
def ancestors(origin = @page_object[:Parent]); end
|
883
900
|
|
884
|
-
sig { params(obj: T::Hash[
|
901
|
+
sig { params(obj: T::Hash[Symbol, T.untyped]).returns(T::Hash[Symbol, T.untyped]) }
|
885
902
|
def select_inheritable(obj); end
|
886
903
|
end
|
887
904
|
|
@@ -1386,31 +1403,36 @@ module PDF
|
|
1386
1403
|
def series(*methods); end
|
1387
1404
|
end
|
1388
1405
|
|
1389
|
-
|
1390
|
-
extend T::Helpers
|
1406
|
+
class Resources
|
1391
1407
|
|
1392
|
-
sig {
|
1408
|
+
sig { params(objects: PDF::Reader::ObjectHash, resources: T::Hash[T.untyped, T.untyped]).void }
|
1409
|
+
def initialize(objects, resources)
|
1410
|
+
@objects = T.let(T.unsafe(nil), PDF::Reader::ObjectHash)
|
1411
|
+
@resources = T.let(T.unsafe(nil), T::Hash[Symbol, T.untyped])
|
1412
|
+
end
|
1413
|
+
|
1414
|
+
sig { returns(T::Hash[Symbol, T.untyped]) }
|
1393
1415
|
def color_spaces; end
|
1394
1416
|
|
1395
|
-
sig { returns(T::Hash[
|
1417
|
+
sig { returns(T::Hash[Symbol, T.untyped]) }
|
1396
1418
|
def fonts; end
|
1397
1419
|
|
1398
|
-
sig { returns(T.untyped) }
|
1420
|
+
sig { returns(T::Hash[Symbol, T.untyped]) }
|
1399
1421
|
def graphic_states; end
|
1400
1422
|
|
1401
|
-
sig { returns(T.untyped) }
|
1423
|
+
sig { returns(T::Hash[Symbol, T.untyped]) }
|
1402
1424
|
def patterns; end
|
1403
1425
|
|
1404
|
-
sig { returns(T
|
1426
|
+
sig { returns(T::Array[Symbol]) }
|
1405
1427
|
def procedure_sets; end
|
1406
1428
|
|
1407
|
-
sig { returns(T.untyped) }
|
1429
|
+
sig { returns(T::Hash[Symbol, T.untyped]) }
|
1408
1430
|
def properties; end
|
1409
1431
|
|
1410
|
-
sig { returns(T.untyped) }
|
1432
|
+
sig { returns(T::Hash[Symbol, T.untyped]) }
|
1411
1433
|
def shadings; end
|
1412
1434
|
|
1413
|
-
sig { returns(T
|
1435
|
+
sig { returns(T::Hash[Symbol, PDF::Reader::Stream]) }
|
1414
1436
|
def xobjects; end
|
1415
1437
|
end
|
1416
1438
|
|
@@ -1674,6 +1696,9 @@ module PDF
|
|
1674
1696
|
|
1675
1697
|
class TypeCheck
|
1676
1698
|
|
1699
|
+
sig { params(obj: T.untyped).returns(Integer) }
|
1700
|
+
def self.cast_to_int!(obj); end
|
1701
|
+
|
1677
1702
|
sig { params(obj: T.untyped).returns(Numeric) }
|
1678
1703
|
def self.cast_to_numeric!(obj); end
|
1679
1704
|
|
@@ -1682,6 +1707,15 @@ module PDF
|
|
1682
1707
|
|
1683
1708
|
sig { params(obj: T.untyped).returns(T.nilable(Symbol)) }
|
1684
1709
|
def self.cast_to_symbol(obj); end
|
1710
|
+
|
1711
|
+
sig { params(obj: T.untyped).returns(Symbol) }
|
1712
|
+
def self.cast_to_symbol!(obj); end
|
1713
|
+
|
1714
|
+
sig { params(obj: T.untyped).returns(T::Hash[Symbol, T.untyped]) }
|
1715
|
+
def self.cast_to_pdf_dict!(obj); end
|
1716
|
+
|
1717
|
+
sig { params(obj: T.untyped).returns(T::Hash[Symbol, PDF::Reader::Stream]) }
|
1718
|
+
def self.cast_to_pdf_dict_with_stream_values!(obj); end
|
1685
1719
|
end
|
1686
1720
|
|
1687
1721
|
class ValidatingReceiver
|
@@ -1923,54 +1957,67 @@ module PDF
|
|
1923
1957
|
:ZapfDingbats
|
1924
1958
|
]
|
1925
1959
|
|
1926
|
-
sig { params(font:
|
1927
|
-
def initialize(font)
|
1960
|
+
sig { params(font: PDF::Reader::Font).void }
|
1961
|
+
def initialize(font)
|
1962
|
+
@font = T.let(T.unsafe(nil), PDF::Reader::Font)
|
1963
|
+
end
|
1928
1964
|
|
1929
|
-
sig { params(code_point: T.
|
1965
|
+
sig { params(code_point: T.nilable(Integer)).returns(Numeric) }
|
1930
1966
|
def glyph_width(code_point); end
|
1931
1967
|
|
1932
|
-
sig { params(code_point:
|
1968
|
+
sig { params(code_point: Integer).returns(T::Boolean) }
|
1933
1969
|
def control_character?(code_point); end
|
1934
1970
|
|
1935
|
-
sig { params(font_name: T.
|
1971
|
+
sig { params(font_name: T.nilable(Symbol)).returns(String) }
|
1936
1972
|
def extract_basefont(font_name); end
|
1937
1973
|
end
|
1938
1974
|
|
1939
1975
|
class Composite
|
1940
|
-
sig { params(font:
|
1941
|
-
def initialize(font)
|
1976
|
+
sig { params(font: PDF::Reader::Font).void }
|
1977
|
+
def initialize(font)
|
1978
|
+
@font = T.let(T.unsafe(nil), PDF::Reader::Font)
|
1979
|
+
@widths = T.let(T.unsafe(nil), PDF::Reader::CidWidths)
|
1980
|
+
end
|
1942
1981
|
|
1943
|
-
sig { params(code_point: T.
|
1982
|
+
sig { params(code_point: T.nilable(Integer)).returns(Numeric) }
|
1944
1983
|
def glyph_width(code_point); end
|
1945
1984
|
end
|
1946
1985
|
|
1947
1986
|
class TrueType
|
1948
|
-
sig { params(font:
|
1949
|
-
def initialize(font)
|
1987
|
+
sig { params(font: PDF::Reader::Font).void }
|
1988
|
+
def initialize(font)
|
1989
|
+
@font = T.let(T.unsafe(nil), PDF::Reader::Font)
|
1990
|
+
@missing_width = T.let(T.unsafe(nil), Numeric)
|
1991
|
+
end
|
1950
1992
|
|
1951
|
-
sig { params(code_point: T.
|
1993
|
+
sig { params(code_point: T.nilable(Integer)).returns(Numeric) }
|
1952
1994
|
def glyph_width(code_point); end
|
1953
1995
|
|
1954
|
-
sig { params(code_point:
|
1996
|
+
sig { params(code_point: Integer).returns(T.nilable(Numeric)) }
|
1955
1997
|
def glyph_width_from_font(code_point); end
|
1956
1998
|
|
1957
|
-
sig { params(code_point:
|
1999
|
+
sig { params(code_point: Integer).returns(T.nilable(Numeric)) }
|
1958
2000
|
def glyph_width_from_descriptor(code_point); end
|
1959
2001
|
end
|
1960
2002
|
|
1961
2003
|
class TypeOneOrThree
|
1962
|
-
sig { params(font:
|
1963
|
-
def initialize(font)
|
2004
|
+
sig { params(font: PDF::Reader::Font).void }
|
2005
|
+
def initialize(font)
|
2006
|
+
@font = T.let(T.unsafe(nil), PDF::Reader::Font)
|
2007
|
+
@missing_width = T.let(T.unsafe(nil), Numeric)
|
2008
|
+
end
|
1964
2009
|
|
1965
|
-
sig { params(code_point: T.
|
2010
|
+
sig { params(code_point: T.nilable(Integer)).returns(Numeric) }
|
1966
2011
|
def glyph_width(code_point); end
|
1967
2012
|
end
|
1968
2013
|
|
1969
2014
|
class TypeZero
|
1970
|
-
sig { params(font:
|
1971
|
-
def initialize(font)
|
2015
|
+
sig { params(font: PDF::Reader::Font).void }
|
2016
|
+
def initialize(font)
|
2017
|
+
@font = T.let(T.unsafe(nil), PDF::Reader::Font)
|
2018
|
+
end
|
1972
2019
|
|
1973
|
-
sig { params(code_point: T.
|
2020
|
+
sig { params(code_point: T.nilable(Integer)).returns(Numeric) }
|
1974
2021
|
def glyph_width(code_point); end
|
1975
2022
|
end
|
1976
2023
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pdf-reader
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Healy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-05-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -288,9 +288,9 @@ licenses:
|
|
288
288
|
- MIT
|
289
289
|
metadata:
|
290
290
|
bug_tracker_uri: https://github.com/yob/pdf-reader/issues
|
291
|
-
changelog_uri: https://github.com/yob/pdf-reader/blob/v2.
|
292
|
-
documentation_uri: https://www.rubydoc.info/gems/pdf-reader/2.
|
293
|
-
source_code_uri: https://github.com/yob/pdf-reader/tree/v2.
|
291
|
+
changelog_uri: https://github.com/yob/pdf-reader/blob/v2.10.0/CHANGELOG
|
292
|
+
documentation_uri: https://www.rubydoc.info/gems/pdf-reader/2.10.0
|
293
|
+
source_code_uri: https://github.com/yob/pdf-reader/tree/v2.10.0
|
294
294
|
post_install_message:
|
295
295
|
rdoc_options:
|
296
296
|
- "--title"
|
@@ -311,7 +311,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
311
311
|
- !ruby/object:Gem::Version
|
312
312
|
version: '0'
|
313
313
|
requirements: []
|
314
|
-
rubygems_version: 3.
|
314
|
+
rubygems_version: 3.2.32
|
315
315
|
signing_key:
|
316
316
|
specification_version: 4
|
317
317
|
summary: A library for accessing the content of PDF files
|