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.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/lib/pdfrb/annotation/base.rb +2 -2
  3. data/lib/pdfrb/appearance/generator.rb +1 -1
  4. data/lib/pdfrb/cli/images.rb +1 -1
  5. data/lib/pdfrb/cli.rb +3 -3
  6. data/lib/pdfrb/color/default_profile.rb +1 -1
  7. data/lib/pdfrb/compare/comparator.rb +2 -4
  8. data/lib/pdfrb/conformance/ltv.rb +1 -1
  9. data/lib/pdfrb/conformance/pades.rb +4 -4
  10. data/lib/pdfrb/conformance/pdf_2_af.rb +2 -2
  11. data/lib/pdfrb/conformance/pdf_a.rb +10 -20
  12. data/lib/pdfrb/conformance/pdf_x.rb +6 -16
  13. data/lib/pdfrb/conformance/tagged_pdf.rb +1 -1
  14. data/lib/pdfrb/content/canvas.rb +25 -33
  15. data/lib/pdfrb/content/hidden_text_detector.rb +2 -3
  16. data/lib/pdfrb/content/shading/base.rb +1 -1
  17. data/lib/pdfrb/content/tiling_pattern.rb +1 -1
  18. data/lib/pdfrb/digital_signature/signing.rb +2 -2
  19. data/lib/pdfrb/document/annotations.rb +10 -10
  20. data/lib/pdfrb/document/associated_files.rb +2 -2
  21. data/lib/pdfrb/document/colors.rb +1 -1
  22. data/lib/pdfrb/document/destinations.rb +4 -4
  23. data/lib/pdfrb/document/encryption.rb +1 -1
  24. data/lib/pdfrb/document/files.rb +5 -5
  25. data/lib/pdfrb/document/fonts/subsetting.rb +87 -0
  26. data/lib/pdfrb/document/fonts.rb +10 -80
  27. data/lib/pdfrb/document/form.rb +9 -9
  28. data/lib/pdfrb/document/form_xobject.rb +1 -1
  29. data/lib/pdfrb/document/graphics_state.rb +1 -1
  30. data/lib/pdfrb/document/images.rb +1 -6
  31. data/lib/pdfrb/document/info.rb +1 -1
  32. data/lib/pdfrb/document/layers.rb +1 -1
  33. data/lib/pdfrb/document/metadata.rb +1 -1
  34. data/lib/pdfrb/document/outline.rb +8 -8
  35. data/lib/pdfrb/document/output_intents.rb +3 -3
  36. data/lib/pdfrb/document/pages.rb +19 -8
  37. data/lib/pdfrb/document/pdf_a.rb +1 -1
  38. data/lib/pdfrb/document/portfolio.rb +3 -3
  39. data/lib/pdfrb/document/shadings.rb +2 -9
  40. data/lib/pdfrb/document/stamps.rb +2 -2
  41. data/lib/pdfrb/document/structure.rb +9 -9
  42. data/lib/pdfrb/document.rb +19 -2
  43. data/lib/pdfrb/encryption/security_handler.rb +1 -2
  44. data/lib/pdfrb/font/cff/subsetter.rb +0 -0
  45. data/lib/pdfrb/font/sfnt.rb +73 -0
  46. data/lib/pdfrb/font/true_type/subsetter.rb +1 -57
  47. data/lib/pdfrb/font/true_type/wrapper.rb +3 -3
  48. data/lib/pdfrb/font.rb +1 -0
  49. data/lib/pdfrb/font_loader/true_type.rb +2 -2
  50. data/lib/pdfrb/font_loader/type3.rb +1 -1
  51. data/lib/pdfrb/importer.rb +3 -3
  52. data/lib/pdfrb/linearization/writer.rb +1 -1
  53. data/lib/pdfrb/model/object.rb +7 -0
  54. data/lib/pdfrb/model/type/action_hide.rb +1 -1
  55. data/lib/pdfrb/model/type/action_sound.rb +2 -2
  56. data/lib/pdfrb/model/type/add_action_catalog.rb +1 -1
  57. data/lib/pdfrb/model/type/add_action_form_field.rb +1 -1
  58. data/lib/pdfrb/model/type/add_action_page_object.rb +1 -1
  59. data/lib/pdfrb/model/type/add_action_screen_annotation.rb +1 -1
  60. data/lib/pdfrb/model/type/add_action_widget_annotation.rb +1 -1
  61. data/lib/pdfrb/model/type/alternate_image.rb +2 -2
  62. data/lib/pdfrb/model/type/bead.rb +4 -4
  63. data/lib/pdfrb/model/type/catalog.rb +1 -1
  64. data/lib/pdfrb/model/type/d_part.rb +4 -4
  65. data/lib/pdfrb/model/type/document_security_store.rb +1 -1
  66. data/lib/pdfrb/model/type/dss.rb +1 -1
  67. data/lib/pdfrb/model/type/function_stitching.rb +1 -1
  68. data/lib/pdfrb/model/type/generic_appearance.rb +1 -1
  69. data/lib/pdfrb/model/type/opt_content_ext.rb +2 -2
  70. data/lib/pdfrb/model/type/optional_content_membership.rb +2 -2
  71. data/lib/pdfrb/model/type/page.rb +5 -7
  72. data/lib/pdfrb/model/type/page_tree_node.rb +2 -2
  73. data/lib/pdfrb/model/type/rich_media_configuration.rb +1 -1
  74. data/lib/pdfrb/model/type/struct_elem.rb +2 -2
  75. data/lib/pdfrb/model/type/struct_tree_root.rb +2 -2
  76. data/lib/pdfrb/model/type/thread.rb +3 -3
  77. data/lib/pdfrb/model/type/three_d_stream.rb +1 -1
  78. data/lib/pdfrb/model/type/viewport.rb +1 -1
  79. data/lib/pdfrb/model/type/vri.rb +1 -1
  80. data/lib/pdfrb/model/type/web_capture_command.rb +1 -1
  81. data/lib/pdfrb/model/type/web_capture_image_set.rb +1 -1
  82. data/lib/pdfrb/model/type/web_capture_page_set.rb +2 -2
  83. data/lib/pdfrb/pdf_version.rb +23 -0
  84. data/lib/pdfrb/task/extract_images.rb +1 -2
  85. data/lib/pdfrb/task/extract_text.rb +1 -1
  86. data/lib/pdfrb/task/merge.rb +3 -3
  87. data/lib/pdfrb/task/optimize.rb +2 -6
  88. data/lib/pdfrb/task/thumbnail.rb +1 -1
  89. data/lib/pdfrb/version.rb +1 -1
  90. data/lib/pdfrb/writer.rb +7 -15
  91. data/lib/pdfrb/xmp.rb +2 -2
  92. data/lib/pdfrb.rb +1 -0
  93. metadata +5 -2
@@ -35,13 +35,13 @@ module Pdfrb
35
35
  )
36
36
  catalog = document.catalog
37
37
  catalog.value[:StructTreeRoot] =
38
- Pdfrb::Model::Reference.new(root_elem.oid, root_elem.gen)
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
- Pdfrb::Model::Reference.new(mark_info.oid, mark_info.gen)
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
- Pdfrb::Model::Reference.new(page.oid, page.gen)
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 << Pdfrb::Model::Reference.new(elem.oid, elem.gen)
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 = page.is_a?(Pdfrb::Model::Reference) ? document.object(page) : page
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] = [Pdfrb::Model::Reference.new(child.oid, child.gen)]
218
+ parent.value[:K] = [child.ref]
219
219
  elsif children.is_a?(::Array)
220
- children << Pdfrb::Model::Reference.new(child.oid, child.gen)
220
+ children << child.ref
221
221
  else
222
222
  parent.value[:K] = [
223
223
  children,
224
- Pdfrb::Model::Reference.new(child.oid, child.gen),
224
+ child.ref,
225
225
  ]
226
226
  end
227
- child.value[:P] = Pdfrb::Model::Reference.new(parent.oid, parent.gen)
227
+ child.value[:P] = parent.ref
228
228
  end
229
229
 
230
230
  public
@@ -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: Pdfrb::Model::Reference.new(pages.oid, 0) })
450
+ catalog = add({ Type: :Catalog, Pages: pages.ref })
434
451
  @catalog = catalog
435
- @empty_trailer = { Size: @next_oid, Root: Pdfrb::Model::Reference.new(catalog.oid, 0) }
452
+ @empty_trailer = { Size: @next_oid, Root: catalog.ref }
436
453
  end
437
454
 
438
455
  def recover_or_raise(error)
@@ -21,8 +21,7 @@ module Pdfrb
21
21
  ref = trailer[:Encrypt]
22
22
  return nil unless ref
23
23
 
24
- encrypt = ref.is_a?(Pdfrb::Model::Reference) ?
25
- document.object(ref) : ref
24
+ encrypt = document.resolve(ref)
26
25
  return nil unless encrypt
27
26
 
28
27
  filter = encrypt[:Filter] || :Standard
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
- checksum_placeholder = [0].pack("N")
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] = Pdfrb::Model::Reference.new(font_file.oid, font_file.gen)
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: Pdfrb::Model::Reference.new(fd.oid, fd.gen),
30
- ToUnicode: Pdfrb::Model::Reference.new(tu_stream.oid, tu_stream.gen),
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: Pdfrb::Model::Reference.new(font_stream.oid, 0)
48
+ FontFile2: font_stream.ref
49
49
  },
50
50
  type: Pdfrb::Model::Type::FontDescriptor
51
51
  )
52
52
  font_dict.value[:FontDescriptor] =
53
- Pdfrb::Model::Reference.new(descriptor.oid, 0)
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] = Pdfrb::Model::Reference.new(stream.oid, stream.gen)
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
@@ -38,10 +38,10 @@ module Pdfrb
38
38
 
39
39
  def import_reference(ref, source_doc)
40
40
  cached = @mappings[ref.oid]
41
- return Pdfrb::Model::Reference.new(cached.oid, cached.gen) if cached
41
+ return cached.ref if cached
42
42
 
43
43
  in_progress = @in_progress[ref.oid]
44
- return Pdfrb::Model::Reference.new(in_progress.oid, in_progress.gen) if in_progress
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
- Pdfrb::Model::Reference.new(stub.oid, stub.gen)
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
- Pdfrb::Model::Reference.new(root.oid, root.gen)
242
+ root.ref
243
243
  end
244
244
  size = [@document.next_oid || 1, 2].max
245
245
 
@@ -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
@@ -17,7 +17,7 @@ module Pdfrb
17
17
 
18
18
  arr = targets.is_a?(Array) ? targets : [targets]
19
19
  arr.each do |ref|
20
- obj = ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
20
+ obj = document.resolve(ref)
21
21
  yield obj if obj
22
22
  end
23
23
  end
@@ -23,7 +23,7 @@ module Pdfrb
23
23
  ref = value[:Sound]
24
24
  return nil unless ref && document
25
25
 
26
- ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
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
- ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
55
+ document.resolve(ref)
56
56
  end
57
57
  end
58
58
  end
@@ -41,7 +41,7 @@ module Pdfrb
41
41
  ref = value[key]
42
42
  return nil unless ref && document
43
43
 
44
- ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
44
+ document.resolve(ref)
45
45
  end
46
46
  end
47
47
  end
@@ -34,7 +34,7 @@ module Pdfrb
34
34
  ref = value[key]
35
35
  return nil unless ref && document
36
36
 
37
- ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
37
+ document.resolve(ref)
38
38
  end
39
39
  end
40
40
  end
@@ -24,7 +24,7 @@ module Pdfrb
24
24
  ref = value[key]
25
25
  return nil unless ref && document
26
26
 
27
- ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
27
+ document.resolve(ref)
28
28
  end
29
29
  end
30
30
  end
@@ -54,7 +54,7 @@ module Pdfrb
54
54
  ref = value[key]
55
55
  return nil unless ref && document
56
56
 
57
- ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
57
+ document.resolve(ref)
58
58
  end
59
59
  end
60
60
  end
@@ -64,7 +64,7 @@ module Pdfrb
64
64
  ref = value[key]
65
65
  return nil unless ref && document
66
66
 
67
- ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
67
+ document.resolve(ref)
68
68
  end
69
69
  end
70
70
  end
@@ -16,7 +16,7 @@ module Pdfrb
16
16
  ref = value[:Image]
17
17
  return nil unless ref && document
18
18
 
19
- ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
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
- ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
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
- ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
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
- ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
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
- ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
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
- ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
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 = entry.is_a?(Pdfrb::Model::Reference) ? document.object(entry) : entry
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 = ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
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
- ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
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
- ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
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
- ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
82
+ document.resolve(ref)
83
83
  end
84
84
 
85
85
  def leaf?
@@ -45,7 +45,7 @@ module Pdfrb
45
45
 
46
46
  arr = certs.is_a?(Pdfrb::Model::PdfArray) ? certs.to_a : certs
47
47
  arr.each do |ref|
48
- obj = ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
48
+ obj = document.resolve(ref)
49
49
  yield obj if obj
50
50
  end
51
51
  end
@@ -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| r.is_a?(Pdfrb::Model::Reference) ? document.object(r) : 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 = ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
27
+ obj = document.resolve(ref)
28
28
  yield obj if obj
29
29
  end
30
30
  end
@@ -31,7 +31,7 @@ module Pdfrb
31
31
  type: Pdfrb::Model::Cos::Stream
32
32
  )
33
33
  stream.stream = "q Q\n"
34
- annotation[:AP] = { N: Pdfrb::Model::Reference.new(stream.oid, stream.gen) }
34
+ annotation[:AP] = { N: stream.ref }
35
35
  stream
36
36
  end
37
37
  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 = ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
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 = ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
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 = ocfgs.is_a?(Pdfrb::Model::Reference) ? document.object(ocfgs) : ocfgs
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 = ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
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] = Pdfrb::Model::Reference.new(new_stream.oid, 0)
26
+ value[:Contents] = new_stream.ref
27
27
  new_stream
28
28
  else
29
- ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
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.is_a?(Pdfrb::Model::Reference) ?
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 = annotations.is_a?(Pdfrb::Model::Reference) ?
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 = entry.is_a?(Pdfrb::Model::Reference) ? document.object(entry) : entry
188
+ obj = document.resolve(entry)
191
189
  yield obj if obj
192
190
  end
193
191
  end