Class: Okab::PDF::Writer

Inherits:
Object
  • Object
show all
Defined in:
lib/okab/pdf/writer.rb

Instance Method Summary collapse

Constructor Details

#initialize ⇒ Writer

Returns a new instance of Writer.



8
9
10
# File 'lib/okab/pdf/writer.rb', line 8

def initialize
  @objects = []
end

Instance Method Details

#add(value) ⇒ Object



17
18
19
20
# File 'lib/okab/pdf/writer.rb', line 17

def add(value)
  @objects << value.b
  @objects.length
end

#render(root:, info:) ⇒ Object

Raises:



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/okab/pdf/writer.rb', line 33

def render(root:, info:)
  raise InvalidDocument, "unassigned PDF object" if @objects.any?(&:nil?)

  output = +"%PDF-1.7\n%\xE2\xE3\xCF\xD3\n".b
  offsets = [0]
  @objects.each_with_index do |object, index|
    offsets << output.bytesize
    output << "#{index + 1} 0 obj\n".b << object << "\nendobj\n".b
  end
  xref = output.bytesize
  output << "xref\n0 #{@objects.length + 1}\n0000000000 65535 f \n".b
  offsets.drop(1).each { |offset| output << format("%010d 00000 n \n", offset).b }
  output << "trailer\n<< /Size #{@objects.length + 1} /Root #{root} 0 R /Info #{info} 0 R >>\n".b
  output << "startxref\n#{xref}\n%%EOF\n".b
end

#reserve ⇒ Object



12
13
14
15
# File 'lib/okab/pdf/writer.rb', line 12

def reserve
  @objects << nil
  @objects.length
end

#set(reference, value) ⇒ Object

Raises:



22
23
24
25
26
27
# File 'lib/okab/pdf/writer.rb', line 22

def set(reference, value)
  raise InvalidDocument, "invalid PDF object reference" unless reference.between?(1, @objects.length)
  raise InvalidDocument, "PDF object already assigned" if @objects[reference - 1]

  @objects[reference - 1] = value.b
end

#stream(data, dictionary = "") ⇒ Object



29
30
31
# File 'lib/okab/pdf/writer.rb', line 29

def stream(data, dictionary = "")
  add("<< /Length #{data.bytesize} #{dictionary} >>\nstream\n".b + data.b + "\nendstream".b)
end