pdfrb 0.8.4 → 0.8.6
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/lib/pdfrb/annotation/base.rb +2 -2
- data/lib/pdfrb/appearance/generator.rb +1 -1
- data/lib/pdfrb/cli/images.rb +1 -1
- data/lib/pdfrb/cli.rb +3 -3
- data/lib/pdfrb/color/default_profile.rb +1 -1
- data/lib/pdfrb/compare/comparator.rb +2 -4
- data/lib/pdfrb/conformance/ltv.rb +1 -1
- data/lib/pdfrb/conformance/pades.rb +4 -4
- data/lib/pdfrb/conformance/pdf_2_af.rb +2 -2
- data/lib/pdfrb/conformance/pdf_a.rb +10 -20
- data/lib/pdfrb/conformance/pdf_x.rb +6 -16
- data/lib/pdfrb/conformance/tagged_pdf.rb +1 -1
- data/lib/pdfrb/content/canvas.rb +25 -33
- data/lib/pdfrb/content/hidden_text_detector.rb +2 -3
- data/lib/pdfrb/content/shading/base.rb +1 -1
- data/lib/pdfrb/content/tiling_pattern.rb +1 -1
- data/lib/pdfrb/digital_signature/signing.rb +2 -2
- data/lib/pdfrb/document/annotations.rb +10 -10
- data/lib/pdfrb/document/associated_files.rb +2 -2
- data/lib/pdfrb/document/colors.rb +1 -1
- data/lib/pdfrb/document/destinations.rb +4 -4
- data/lib/pdfrb/document/encryption.rb +1 -1
- data/lib/pdfrb/document/files.rb +5 -5
- data/lib/pdfrb/document/fonts/subsetting.rb +87 -0
- data/lib/pdfrb/document/fonts.rb +10 -80
- data/lib/pdfrb/document/form.rb +9 -9
- data/lib/pdfrb/document/form_xobject.rb +1 -1
- data/lib/pdfrb/document/graphics_state.rb +1 -1
- data/lib/pdfrb/document/images.rb +1 -6
- data/lib/pdfrb/document/info.rb +1 -1
- data/lib/pdfrb/document/layers.rb +1 -1
- data/lib/pdfrb/document/metadata.rb +1 -1
- data/lib/pdfrb/document/outline.rb +8 -8
- data/lib/pdfrb/document/output_intents.rb +3 -3
- data/lib/pdfrb/document/pages.rb +19 -8
- data/lib/pdfrb/document/pdf_a.rb +1 -1
- data/lib/pdfrb/document/portfolio.rb +3 -3
- data/lib/pdfrb/document/shadings.rb +2 -9
- data/lib/pdfrb/document/stamps.rb +2 -2
- data/lib/pdfrb/document/structure.rb +9 -9
- data/lib/pdfrb/document.rb +19 -2
- data/lib/pdfrb/encryption/security_handler.rb +1 -2
- data/lib/pdfrb/font/cff/subsetter.rb +0 -0
- data/lib/pdfrb/font/sfnt.rb +73 -0
- data/lib/pdfrb/font/true_type/subsetter.rb +1 -57
- data/lib/pdfrb/font/true_type/wrapper.rb +3 -3
- data/lib/pdfrb/font.rb +1 -0
- data/lib/pdfrb/font_loader/true_type.rb +2 -2
- data/lib/pdfrb/font_loader/type3.rb +1 -1
- data/lib/pdfrb/importer.rb +3 -3
- data/lib/pdfrb/linearization/writer.rb +1 -1
- data/lib/pdfrb/model/object.rb +7 -0
- data/lib/pdfrb/model/type/action_hide.rb +1 -1
- data/lib/pdfrb/model/type/action_sound.rb +2 -2
- data/lib/pdfrb/model/type/add_action_catalog.rb +1 -1
- data/lib/pdfrb/model/type/add_action_form_field.rb +1 -1
- data/lib/pdfrb/model/type/add_action_page_object.rb +1 -1
- data/lib/pdfrb/model/type/add_action_screen_annotation.rb +1 -1
- data/lib/pdfrb/model/type/add_action_widget_annotation.rb +1 -1
- data/lib/pdfrb/model/type/alternate_image.rb +2 -2
- data/lib/pdfrb/model/type/bead.rb +4 -4
- data/lib/pdfrb/model/type/catalog.rb +1 -1
- data/lib/pdfrb/model/type/d_part.rb +4 -4
- data/lib/pdfrb/model/type/document_security_store.rb +1 -1
- data/lib/pdfrb/model/type/dss.rb +1 -1
- data/lib/pdfrb/model/type/function_stitching.rb +1 -1
- data/lib/pdfrb/model/type/generic_appearance.rb +1 -1
- data/lib/pdfrb/model/type/opt_content_ext.rb +2 -2
- data/lib/pdfrb/model/type/optional_content_membership.rb +2 -2
- data/lib/pdfrb/model/type/page.rb +5 -7
- data/lib/pdfrb/model/type/page_tree_node.rb +2 -2
- data/lib/pdfrb/model/type/rich_media_configuration.rb +1 -1
- data/lib/pdfrb/model/type/struct_elem.rb +2 -2
- data/lib/pdfrb/model/type/struct_tree_root.rb +2 -2
- data/lib/pdfrb/model/type/thread.rb +3 -3
- data/lib/pdfrb/model/type/three_d_stream.rb +1 -1
- data/lib/pdfrb/model/type/viewport.rb +1 -1
- data/lib/pdfrb/model/type/vri.rb +1 -1
- data/lib/pdfrb/model/type/web_capture_command.rb +1 -1
- data/lib/pdfrb/model/type/web_capture_image_set.rb +1 -1
- data/lib/pdfrb/model/type/web_capture_page_set.rb +2 -2
- data/lib/pdfrb/pdf_version.rb +23 -0
- data/lib/pdfrb/task/extract_images.rb +1 -2
- data/lib/pdfrb/task/extract_text.rb +1 -1
- data/lib/pdfrb/task/merge.rb +3 -3
- data/lib/pdfrb/task/optimize.rb +2 -6
- data/lib/pdfrb/task/thumbnail.rb +1 -1
- data/lib/pdfrb/version.rb +1 -1
- data/lib/pdfrb/writer.rb +7 -15
- data/lib/pdfrb/xmp.rb +2 -2
- data/lib/pdfrb.rb +1 -0
- metadata +5 -2
|
@@ -35,13 +35,13 @@ module Pdfrb
|
|
|
35
35
|
)
|
|
36
36
|
catalog = document.catalog
|
|
37
37
|
catalog.value[:StructTreeRoot] =
|
|
38
|
-
|
|
38
|
+
root_elem.ref
|
|
39
39
|
mark_info = catalog.value[:MarkInfo]
|
|
40
40
|
if mark_info.nil?
|
|
41
41
|
mark_info = document.add({ Marked: true },
|
|
42
42
|
type: Pdfrb::Model::Cos::Dictionary)
|
|
43
43
|
catalog.value[:MarkInfo] =
|
|
44
|
-
|
|
44
|
+
mark_info.ref
|
|
45
45
|
end
|
|
46
46
|
@root = root_elem
|
|
47
47
|
end
|
|
@@ -59,7 +59,7 @@ module Pdfrb
|
|
|
59
59
|
page_ref = if page.is_a?(Pdfrb::Model::Reference)
|
|
60
60
|
page
|
|
61
61
|
else
|
|
62
|
-
|
|
62
|
+
page.ref
|
|
63
63
|
end
|
|
64
64
|
elem.value[:Pg] = page_ref
|
|
65
65
|
end
|
|
@@ -166,7 +166,7 @@ module Pdfrb
|
|
|
166
166
|
nums << page_idx
|
|
167
167
|
nums << entries.length
|
|
168
168
|
entries.each do |_mcid, elem| # rubocop:disable Style/HashEachMethods
|
|
169
|
-
nums <<
|
|
169
|
+
nums << elem.ref
|
|
170
170
|
end
|
|
171
171
|
end
|
|
172
172
|
|
|
@@ -189,7 +189,7 @@ module Pdfrb
|
|
|
189
189
|
return 0 unless page_ref
|
|
190
190
|
|
|
191
191
|
document.pages.each_with_index do |page, idx|
|
|
192
|
-
page_obj =
|
|
192
|
+
page_obj = document.resolve(page)
|
|
193
193
|
return idx if page_obj == page_ref || page == page_ref
|
|
194
194
|
end
|
|
195
195
|
0
|
|
@@ -215,16 +215,16 @@ module Pdfrb
|
|
|
215
215
|
def append_child(parent, child)
|
|
216
216
|
children = parent.value[:K]
|
|
217
217
|
if children.nil?
|
|
218
|
-
parent.value[:K] = [
|
|
218
|
+
parent.value[:K] = [child.ref]
|
|
219
219
|
elsif children.is_a?(::Array)
|
|
220
|
-
children <<
|
|
220
|
+
children << child.ref
|
|
221
221
|
else
|
|
222
222
|
parent.value[:K] = [
|
|
223
223
|
children,
|
|
224
|
-
|
|
224
|
+
child.ref,
|
|
225
225
|
]
|
|
226
226
|
end
|
|
227
|
-
child.value[:P] =
|
|
227
|
+
child.value[:P] = parent.ref
|
|
228
228
|
end
|
|
229
229
|
|
|
230
230
|
public
|
data/lib/pdfrb/document.rb
CHANGED
|
@@ -88,6 +88,13 @@ module Pdfrb
|
|
|
88
88
|
# Resolve a Reference to its Object. New/modified objects take
|
|
89
89
|
# precedence over xref-loaded ones; otherwise consult the
|
|
90
90
|
# ObjectReader (which caches per oid).
|
|
91
|
+
# Resolve a value to the object it denotes: References are
|
|
92
|
+
# dereferenced against this document; anything else is returned
|
|
93
|
+
# unchanged. The single seam for "give me the thing itself".
|
|
94
|
+
def resolve(value)
|
|
95
|
+
value.is_a?(Pdfrb::Model::Reference) ? object(value) : value
|
|
96
|
+
end
|
|
97
|
+
|
|
91
98
|
def object(reference)
|
|
92
99
|
return reference unless reference.is_a?(Pdfrb::Model::Reference)
|
|
93
100
|
|
|
@@ -275,6 +282,16 @@ module Pdfrb
|
|
|
275
282
|
end
|
|
276
283
|
end
|
|
277
284
|
|
|
285
|
+
# Yield every indirect object of +klass+ (e.g. all Streams, all
|
|
286
|
+
# Dictionaries). Enumerator when blockless.
|
|
287
|
+
def each_indirect_of(klass)
|
|
288
|
+
return enum_for(:each_indirect_of, klass) unless block_given?
|
|
289
|
+
|
|
290
|
+
each_indirect_object do |obj|
|
|
291
|
+
yield obj if obj.is_a?(klass)
|
|
292
|
+
end
|
|
293
|
+
end
|
|
294
|
+
|
|
278
295
|
# Walk every revision in the document's incremental-update chain,
|
|
279
296
|
# from the latest (most recent) revision backward via /Prev.
|
|
280
297
|
# Each revision yields a (revision_index, xref, trailer) tuple
|
|
@@ -430,9 +447,9 @@ module Pdfrb
|
|
|
430
447
|
|
|
431
448
|
def seed_empty_structure
|
|
432
449
|
pages = add({ Type: :Pages, Kids: [], Count: 0 })
|
|
433
|
-
catalog = add({ Type: :Catalog, Pages:
|
|
450
|
+
catalog = add({ Type: :Catalog, Pages: pages.ref })
|
|
434
451
|
@catalog = catalog
|
|
435
|
-
@empty_trailer = { Size: @next_oid, Root:
|
|
452
|
+
@empty_trailer = { Size: @next_oid, Root: catalog.ref }
|
|
436
453
|
end
|
|
437
454
|
|
|
438
455
|
def recover_or_raise(error)
|
|
Binary file
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Font
|
|
5
|
+
# sfnt container (OpenType/TTF) table directory: the shared seam
|
|
6
|
+
# for reading and rebuilding the wrapper around font outlines.
|
|
7
|
+
# Both subsetters (TrueType glyf and CFF) rebuild the directory
|
|
8
|
+
# around their subset tables; this module owns that format so
|
|
9
|
+
# the two implementations cannot drift (they once disagreed even
|
|
10
|
+
# on whether checksums are computed).
|
|
11
|
+
module Sfnt
|
|
12
|
+
Entry = Struct.new(:tag, :offset, :byte_length)
|
|
13
|
+
|
|
14
|
+
module_function
|
|
15
|
+
|
|
16
|
+
# Parse the table directory of an sfnt byte string.
|
|
17
|
+
# Returns [sfnt_version, Array<Entry>].
|
|
18
|
+
def parse_directory(sfnt)
|
|
19
|
+
num_tables = (sfnt.getbyte(4) * 256) + sfnt.getbyte(5)
|
|
20
|
+
version = sfnt.byteslice(0, 4)
|
|
21
|
+
entries = (0...num_tables).map do |i|
|
|
22
|
+
base = 12 + (i * 16)
|
|
23
|
+
Entry.new(
|
|
24
|
+
sfnt.byteslice(base, 4),
|
|
25
|
+
sfnt.byteslice(base + 8, 4).unpack1("N"),
|
|
26
|
+
sfnt.byteslice(base + 12, 4).unpack1("N")
|
|
27
|
+
)
|
|
28
|
+
end
|
|
29
|
+
[version, entries]
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Raw bytes of +tag+'s table, or nil.
|
|
33
|
+
def table_bytes(sfnt, tag)
|
|
34
|
+
entry = parse_directory(sfnt)[1].find { |e| e.tag == tag }
|
|
35
|
+
entry && sfnt.byteslice(entry.offset, entry.byte_length)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Rebuild an sfnt wrapper: +sfnt_version+ is the 4-byte magic
|
|
39
|
+
# (e.g. "\x00\x01\x00\x00" or "OTTO"), +tables+ an Array of
|
|
40
|
+
# [tag, data] pairs. Checksums are computed per the sfnt spec
|
|
41
|
+
# (sum of big-endian u32s over zero-padded data).
|
|
42
|
+
def rebuild(sfnt_version, tables)
|
|
43
|
+
num = tables.length
|
|
44
|
+
search_range = (2**Math.log2(num).floor) * 16
|
|
45
|
+
entry_selector = Math.log2(num).floor
|
|
46
|
+
range_shift = (num * 16) - search_range
|
|
47
|
+
|
|
48
|
+
out = +"".b
|
|
49
|
+
out << sfnt_version.b
|
|
50
|
+
out << [num, search_range, entry_selector, range_shift].pack("n4")
|
|
51
|
+
|
|
52
|
+
sorted = tables.sort_by { |tag, _| tag }
|
|
53
|
+
offset = 12 + (num * 16)
|
|
54
|
+
sorted.each do |tag, data|
|
|
55
|
+
out << tag.b << [checksum(data), offset, data.bytesize].pack("NNN")
|
|
56
|
+
offset += (data.bytesize + 3) & ~3
|
|
57
|
+
end
|
|
58
|
+
sorted.to_h.each_value do |data|
|
|
59
|
+
out << data.b
|
|
60
|
+
out << ("\x00".b * ((4 - (out.bytesize % 4)) % 4))
|
|
61
|
+
end
|
|
62
|
+
out
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def checksum(data)
|
|
66
|
+
padded = data + ("\x00".b * ((4 - (data.bytesize % 4)) % 4))
|
|
67
|
+
sum = 0
|
|
68
|
+
padded.unpack("N*").each { |w| sum = (sum + w) & 0xFFFFFFFF }
|
|
69
|
+
sum
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -310,58 +310,7 @@ module Pdfrb
|
|
|
310
310
|
|
|
311
311
|
# rubocop:disable-next Metrics/MethodLength
|
|
312
312
|
def assemble_ttf(tables)
|
|
313
|
-
|
|
314
|
-
num = tables.length
|
|
315
|
-
search_range = power_of_2_floor(num) * 16
|
|
316
|
-
entry_selector = Math.log2(search_range / 16).to_i
|
|
317
|
-
range_shift = (num * 16) - search_range
|
|
318
|
-
|
|
319
|
-
header_size = 12
|
|
320
|
-
dir_size = num * 16
|
|
321
|
-
data_offset = header_size + dir_size
|
|
322
|
-
|
|
323
|
-
# Pad data_offset to 4 bytes
|
|
324
|
-
data_offset = (data_offset + 3) & ~3
|
|
325
|
-
|
|
326
|
-
out = +""
|
|
327
|
-
out << SFNT_VERSION.pack("N") # sfnt version
|
|
328
|
-
out << [num].pack("n")
|
|
329
|
-
out << [search_range].pack("n")
|
|
330
|
-
out << [entry_selector].pack("n")
|
|
331
|
-
out << [range_shift].pack("n")
|
|
332
|
-
|
|
333
|
-
# Sort tables by tag
|
|
334
|
-
sorted = tables.sort_by { |tag, _| tag }
|
|
335
|
-
|
|
336
|
-
# Calculate offsets
|
|
337
|
-
current = data_offset
|
|
338
|
-
offsets = {}
|
|
339
|
-
sorted.each do |tag, data|
|
|
340
|
-
offsets[tag] = current
|
|
341
|
-
current += data.bytesize
|
|
342
|
-
current = (current + 3) & ~3
|
|
343
|
-
|
|
344
|
-
# Directory
|
|
345
|
-
out << tag.to_s
|
|
346
|
-
out << checksum_placeholder # checksum (skip)
|
|
347
|
-
out << [offsets[tag]].pack("N")
|
|
348
|
-
out << [data.bytesize].pack("N")
|
|
349
|
-
end
|
|
350
|
-
|
|
351
|
-
# Pad to data_offset
|
|
352
|
-
while out.bytesize < data_offset
|
|
353
|
-
out << "\x00"
|
|
354
|
-
end
|
|
355
|
-
|
|
356
|
-
# Table data
|
|
357
|
-
sorted.each_value do |data|
|
|
358
|
-
out << data
|
|
359
|
-
while (out.bytesize % 4).nonzero?
|
|
360
|
-
out << "\x00"
|
|
361
|
-
end
|
|
362
|
-
end
|
|
363
|
-
|
|
364
|
-
out.force_encoding(::Encoding::BINARY)
|
|
313
|
+
Pdfrb::Font::Sfnt.rebuild(SFNT_VERSION.pack("N"), tables)
|
|
365
314
|
end
|
|
366
315
|
|
|
367
316
|
# rubocop:disable Naming/MethodName
|
|
@@ -382,11 +331,6 @@ module Pdfrb
|
|
|
382
331
|
def pad_to_even(str); str << "\x00" if (str.bytesize % 2).nonzero?; end
|
|
383
332
|
|
|
384
333
|
# rubocop:enable Naming/MethodName
|
|
385
|
-
def power_of_2_floor(n)
|
|
386
|
-
p = 1
|
|
387
|
-
while p * 2 <= n; p *= 2; end
|
|
388
|
-
p
|
|
389
|
-
end
|
|
390
334
|
end
|
|
391
335
|
end
|
|
392
336
|
end
|
|
@@ -16,7 +16,7 @@ module Pdfrb
|
|
|
16
16
|
tu_stream = build_tounicode(document, ttf)
|
|
17
17
|
font_file = embed_font_file(document, ttf_data)
|
|
18
18
|
|
|
19
|
-
fd.value[:FontFile2] =
|
|
19
|
+
fd.value[:FontFile2] = font_file.ref
|
|
20
20
|
|
|
21
21
|
document.add(
|
|
22
22
|
{
|
|
@@ -26,8 +26,8 @@ module Pdfrb
|
|
|
26
26
|
FirstChar: 0,
|
|
27
27
|
LastChar: 255,
|
|
28
28
|
Widths: widths,
|
|
29
|
-
FontDescriptor:
|
|
30
|
-
ToUnicode:
|
|
29
|
+
FontDescriptor: fd.ref,
|
|
30
|
+
ToUnicode: tu_stream.ref,
|
|
31
31
|
Encoding: :WinAnsiEncoding,
|
|
32
32
|
},
|
|
33
33
|
type: Pdfrb::Model::Type::FontTrueType
|
data/lib/pdfrb/font.rb
CHANGED
|
@@ -10,6 +10,7 @@ module Pdfrb
|
|
|
10
10
|
autoload :CMap, "pdfrb/font/cmap"
|
|
11
11
|
autoload :TrueType, "pdfrb/font/true_type"
|
|
12
12
|
autoload :CFF, "pdfrb/font/cff"
|
|
13
|
+
autoload :Sfnt, "pdfrb/font/sfnt"
|
|
13
14
|
autoload :Type1, "pdfrb/font/type1"
|
|
14
15
|
autoload :Metrics, "pdfrb/font/metrics_helper"
|
|
15
16
|
autoload :MetricsHelper, "pdfrb/font/metrics_helper"
|
|
@@ -45,12 +45,12 @@ module Pdfrb
|
|
|
45
45
|
Descent: -200,
|
|
46
46
|
CapHeight: 700,
|
|
47
47
|
StemV: 80,
|
|
48
|
-
FontFile2:
|
|
48
|
+
FontFile2: font_stream.ref
|
|
49
49
|
},
|
|
50
50
|
type: Pdfrb::Model::Type::FontDescriptor
|
|
51
51
|
)
|
|
52
52
|
font_dict.value[:FontDescriptor] =
|
|
53
|
-
|
|
53
|
+
descriptor.ref
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
font_dict
|
|
@@ -40,7 +40,7 @@ module Pdfrb
|
|
|
40
40
|
stream = document.add({ Length: glyph.procedure.bytesize },
|
|
41
41
|
type: Pdfrb::Model::Cos::Stream)
|
|
42
42
|
stream.stream = glyph.procedure
|
|
43
|
-
char_procs[glyph.name.to_sym] =
|
|
43
|
+
char_procs[glyph.name.to_sym] = stream.ref
|
|
44
44
|
widths[code] = glyph.width
|
|
45
45
|
encoding[:Differences] << code << glyph.name.to_sym
|
|
46
46
|
end
|
data/lib/pdfrb/importer.rb
CHANGED
|
@@ -38,10 +38,10 @@ module Pdfrb
|
|
|
38
38
|
|
|
39
39
|
def import_reference(ref, source_doc)
|
|
40
40
|
cached = @mappings[ref.oid]
|
|
41
|
-
return
|
|
41
|
+
return cached.ref if cached
|
|
42
42
|
|
|
43
43
|
in_progress = @in_progress[ref.oid]
|
|
44
|
-
return
|
|
44
|
+
return in_progress.ref if in_progress
|
|
45
45
|
|
|
46
46
|
source_obj = source_doc.object(ref)
|
|
47
47
|
return nil unless source_obj
|
|
@@ -58,7 +58,7 @@ module Pdfrb
|
|
|
58
58
|
end
|
|
59
59
|
@mappings[ref.oid] = stub
|
|
60
60
|
@in_progress.delete(ref.oid)
|
|
61
|
-
|
|
61
|
+
stub.ref
|
|
62
62
|
end
|
|
63
63
|
|
|
64
64
|
def import_hash(hash, source_doc)
|
|
@@ -239,7 +239,7 @@ module Pdfrb
|
|
|
239
239
|
def build_trailer(xref_offset)
|
|
240
240
|
root = @document.catalog
|
|
241
241
|
root_ref = if root.is_a?(Pdfrb::Model::Object) && root.indirect?
|
|
242
|
-
|
|
242
|
+
root.ref
|
|
243
243
|
end
|
|
244
244
|
size = [@document.next_oid || 1, 2].max
|
|
245
245
|
|
data/lib/pdfrb/model/object.rb
CHANGED
|
@@ -27,6 +27,13 @@ module Pdfrb
|
|
|
27
27
|
@document = document
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
+
# The indirect reference denoting this object. The single
|
|
31
|
+
# seam for "a reference to this" — callers never construct
|
|
32
|
+
# Reference.new(obj.oid, obj.gen) by hand.
|
|
33
|
+
def ref
|
|
34
|
+
Pdfrb::Model::Reference.new(oid, gen)
|
|
35
|
+
end
|
|
36
|
+
|
|
30
37
|
# True when this object is referenced indirectly (oid > 0).
|
|
31
38
|
def indirect?
|
|
32
39
|
@oid > 0
|
|
@@ -23,7 +23,7 @@ module Pdfrb
|
|
|
23
23
|
ref = value[:Sound]
|
|
24
24
|
return nil unless ref && document
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
document.resolve(ref)
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
# /Volume — optional, -1.0 to 1.0 (default 1.0).
|
|
@@ -52,7 +52,7 @@ module Pdfrb
|
|
|
52
52
|
ref = value[:Next]
|
|
53
53
|
return nil unless ref && document
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
document.resolve(ref)
|
|
56
56
|
end
|
|
57
57
|
end
|
|
58
58
|
end
|
|
@@ -16,7 +16,7 @@ module Pdfrb
|
|
|
16
16
|
ref = value[:Image]
|
|
17
17
|
return nil unless ref && document
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
document.resolve(ref)
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
# /DefaultForPrinting — optional, default false. When true,
|
|
@@ -31,7 +31,7 @@ module Pdfrb
|
|
|
31
31
|
ref = value[:OC]
|
|
32
32
|
return nil unless ref && document
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
document.resolve(ref)
|
|
35
35
|
end
|
|
36
36
|
end
|
|
37
37
|
end
|
|
@@ -19,7 +19,7 @@ module Pdfrb
|
|
|
19
19
|
ref = value[:T]
|
|
20
20
|
return nil unless ref && document
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
document.resolve(ref)
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
# /N — required indirect next Bead.
|
|
@@ -27,7 +27,7 @@ module Pdfrb
|
|
|
27
27
|
ref = value[:N]
|
|
28
28
|
return nil unless ref && document
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
document.resolve(ref)
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
# /V — required indirect previous Bead.
|
|
@@ -35,7 +35,7 @@ module Pdfrb
|
|
|
35
35
|
ref = value[:V]
|
|
36
36
|
return nil unless ref && document
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
document.resolve(ref)
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
# /P — required indirect Page the bead sits on.
|
|
@@ -43,7 +43,7 @@ module Pdfrb
|
|
|
43
43
|
ref = value[:P]
|
|
44
44
|
return nil unless ref && document
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
document.resolve(ref)
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
# /R — required rectangle on the page.
|
|
@@ -123,7 +123,7 @@ module Pdfrb
|
|
|
123
123
|
return unless arr.is_a?(Array) || arr.is_a?(Pdfrb::Model::PdfArray)
|
|
124
124
|
|
|
125
125
|
arr.each do |entry|
|
|
126
|
-
obj =
|
|
126
|
+
obj = document.resolve(entry)
|
|
127
127
|
yield obj if obj
|
|
128
128
|
end
|
|
129
129
|
end
|
|
@@ -21,7 +21,7 @@ module Pdfrb
|
|
|
21
21
|
ref = value[:DPartRootNode]
|
|
22
22
|
return nil unless ref && document
|
|
23
23
|
|
|
24
|
-
resolved =
|
|
24
|
+
resolved = document.resolve(ref)
|
|
25
25
|
return nil unless resolved && resolved.value.is_a?(::Hash)
|
|
26
26
|
|
|
27
27
|
DPart.new(resolved.value)
|
|
@@ -57,7 +57,7 @@ module Pdfrb
|
|
|
57
57
|
ref = value[:Parent]
|
|
58
58
|
return nil unless ref && document
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+
document.resolve(ref)
|
|
61
61
|
end
|
|
62
62
|
|
|
63
63
|
# /DParts — array of arrays of child DParts. Mutually
|
|
@@ -71,7 +71,7 @@ module Pdfrb
|
|
|
71
71
|
ref = value[:Start]
|
|
72
72
|
return nil unless ref && document
|
|
73
73
|
|
|
74
|
-
|
|
74
|
+
document.resolve(ref)
|
|
75
75
|
end
|
|
76
76
|
|
|
77
77
|
# /End — indirect ref to the last Page in this part.
|
|
@@ -79,7 +79,7 @@ module Pdfrb
|
|
|
79
79
|
ref = value[:End]
|
|
80
80
|
return nil unless ref && document
|
|
81
81
|
|
|
82
|
-
|
|
82
|
+
document.resolve(ref)
|
|
83
83
|
end
|
|
84
84
|
|
|
85
85
|
def leaf?
|
data/lib/pdfrb/model/type/dss.rb
CHANGED
|
@@ -73,7 +73,7 @@ module Pdfrb
|
|
|
73
73
|
|
|
74
74
|
arr = refs.is_a?(Pdfrb::Model::PdfArray) ? refs.value : refs
|
|
75
75
|
arr = [arr] unless arr.is_a?(::Array)
|
|
76
|
-
arr.filter_map { |r|
|
|
76
|
+
arr.filter_map { |r| document.resolve(r) }
|
|
77
77
|
end
|
|
78
78
|
end
|
|
79
79
|
end
|
|
@@ -24,7 +24,7 @@ module Pdfrb
|
|
|
24
24
|
|
|
25
25
|
arr = sub_functions.is_a?(Pdfrb::Model::PdfArray) ? sub_functions.to_a : sub_functions
|
|
26
26
|
arr.each do |ref|
|
|
27
|
-
obj =
|
|
27
|
+
obj = document.resolve(ref)
|
|
28
28
|
yield obj if obj
|
|
29
29
|
end
|
|
30
30
|
end
|
|
@@ -22,7 +22,7 @@ module Pdfrb
|
|
|
22
22
|
|
|
23
23
|
arr = ocgs.is_a?(Pdfrb::Model::PdfArray) ? ocgs.to_a : ocgs
|
|
24
24
|
arr.each do |ref|
|
|
25
|
-
obj =
|
|
25
|
+
obj = document.resolve(ref)
|
|
26
26
|
yield obj if obj
|
|
27
27
|
end
|
|
28
28
|
end
|
|
@@ -90,7 +90,7 @@ module Pdfrb
|
|
|
90
90
|
|
|
91
91
|
arr = ocgs.is_a?(Pdfrb::Model::PdfArray) ? ocgs.to_a : ocgs
|
|
92
92
|
arr.each do |ref|
|
|
93
|
-
obj =
|
|
93
|
+
obj = document.resolve(ref)
|
|
94
94
|
yield obj if obj
|
|
95
95
|
end
|
|
96
96
|
end
|
|
@@ -33,11 +33,11 @@ module Pdfrb
|
|
|
33
33
|
return enum_for(:each_ocg) unless block_given?
|
|
34
34
|
return unless ocfgs && document
|
|
35
35
|
|
|
36
|
-
arr =
|
|
36
|
+
arr = document.resolve(ocfgs)
|
|
37
37
|
return unless arr.is_a?(Array) || arr.is_a?(Pdfrb::Model::PdfArray)
|
|
38
38
|
|
|
39
39
|
arr.each do |ref|
|
|
40
|
-
obj =
|
|
40
|
+
obj = document.resolve(ref)
|
|
41
41
|
yield obj if obj
|
|
42
42
|
end
|
|
43
43
|
end
|
|
@@ -23,10 +23,10 @@ module Pdfrb
|
|
|
23
23
|
if ref.nil?
|
|
24
24
|
new_stream = document.add({}, type: Pdfrb::Model::Cos::Stream)
|
|
25
25
|
new_stream.stream = ""
|
|
26
|
-
value[:Contents] =
|
|
26
|
+
value[:Contents] = new_stream.ref
|
|
27
27
|
new_stream
|
|
28
28
|
else
|
|
29
|
-
|
|
29
|
+
document.resolve(ref)
|
|
30
30
|
end
|
|
31
31
|
Pdfrb::Content::Canvas.new(stream, document: document)
|
|
32
32
|
end
|
|
@@ -40,8 +40,7 @@ module Pdfrb
|
|
|
40
40
|
|
|
41
41
|
streams = contents.is_a?(::Array) ? contents : [contents]
|
|
42
42
|
streams.each_with_object(+"".b) do |ref_or_stream, buf|
|
|
43
|
-
stream = ref_or_stream
|
|
44
|
-
document&.object(ref_or_stream) : ref_or_stream
|
|
43
|
+
stream = document&.resolve(ref_or_stream)
|
|
45
44
|
next unless stream.is_a?(Pdfrb::Model::Cos::Stream)
|
|
46
45
|
|
|
47
46
|
buf << stream.decoded_stream
|
|
@@ -182,12 +181,11 @@ module Pdfrb
|
|
|
182
181
|
return enum_for(:each_annotation) unless block_given?
|
|
183
182
|
return unless annotations && document
|
|
184
183
|
|
|
185
|
-
arr =
|
|
186
|
-
document.object(annotations) : annotations
|
|
184
|
+
arr = document.resolve(annotations)
|
|
187
185
|
return unless arr.is_a?(Array) || arr.is_a?(Pdfrb::Model::PdfArray)
|
|
188
186
|
|
|
189
187
|
arr.each do |entry|
|
|
190
|
-
obj =
|
|
188
|
+
obj = document.resolve(entry)
|
|
191
189
|
yield obj if obj
|
|
192
190
|
end
|
|
193
191
|
end
|