Class: Okab::PDF::Writer
- Inherits:
-
Object
- Object
- Okab::PDF::Writer
- Defined in:
- lib/okab/pdf/writer.rb
Instance Method Summary collapse
- #add(value) ⇒ Object
-
#initialize ⇒ Writer
constructor
A new instance of Writer.
- #render(root:, info:) ⇒ Object
- #reserve ⇒ Object
- #set(reference, value) ⇒ Object
- #stream(data, dictionary = "") ⇒ Object
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
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
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 |