Class: JotPDF::Core::DocumentContext

Inherits:
WriteContext show all
Defined in:
lib/jot_pdf/core.rb

Instance Method Summary collapse

Methods inherited from WriteContext

#initialize, #objects

Constructor Details

This class inherits a constructor from JotPDF::Core::WriteContext

Instance Method Details

#alloc_objObject



220
221
222
# File 'lib/jot_pdf/core.rb', line 220

def alloc_obj
  @writer.new_object
end

#dsl(&block) ⇒ Object



272
273
274
# File 'lib/jot_pdf/core.rb', line 272

def dsl(&block)
  Docile.dsl_eval(self, &block)
end

#header(version = "1.4") ⇒ Object



215
216
217
218
# File 'lib/jot_pdf/core.rb', line 215

def header(version = "1.4")
  @writer << "%PDF-#{version}\n"
  @writer << "%\xff\xff\xff\xff\n"
end

#obj(object_ref = nil, &block) ⇒ Object



224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
# File 'lib/jot_pdf/core.rb', line 224

def obj(object_ref = nil, &block)
  object_ref ||= @writer.new_object
  @writer.update_object_entry(object_ref)
  @writer << "#{object_ref.number} #{object_ref.generation} obj"
  if block
    ObjectWriteContext.new(@writer).dsl(&block)
    @writer << "\nendobj\n"
    object_ref
  else
    # TODO: Why does this need annotation?
    # @type var finalizer: ^() -> ObjectRef
    finalizer = proc { @writer << "\nendobj\n"; object_ref }
    ObjectInterm.new(writer: @writer, finalizer:)
  end
end

#trailer(&block) ⇒ Object



256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
# File 'lib/jot_pdf/core.rb', line 256

def trailer(&block)
  @writer << "trailer\n<<\n"
  DictionaryWriteContext.new(@writer).dsl do
    entry("Size").of_num objects.size
    entry("Prev").of_num @prev_xref_offset if @prev_xref_offset
    dsl(&block)
  end
  @writer << ">>\n"

  @writer << "startxref\n"
  @writer << @xref_offset.to_s
  @writer << "\n"

  @writer << "%%EOF\n"
end

#xrefObject



240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
# File 'lib/jot_pdf/core.rb', line 240

def xref
  @prev_xref_offset = @xref_offset
  @xref_offset = @writer.offset
  @writer << "xref\n"
  section_objs = @writer.finish_section
  section_objs.sort.slice_when { |prev, curr| curr != prev.next }.each do |subsection|
    @writer << "#{subsection.first} #{subsection.size}\n"
    subsection.each do |n|
      object = objects[n]
      u = object.usage == :in_use ? "n" : "f"
      # each entry ends with SP LF
      @writer << "#{object.offset.to_s.rjust(10, "0")} #{object.generation.to_s.rjust(5, "0")} #{u} \n"
    end
  end
end