module PDF::Core

Public Instance Methods

encrypted_pdf_object(obj, key, id, gen, in_content_stream = false) click to toggle source

Like pdf_object, but returns an encrypted result if required. For direct objects, requires the object identifier and generation number from the indirect object referencing obj.

@private

# File lib/prawn/security.rb, line 219
def encrypted_pdf_object(obj, key, id, gen, in_content_stream = false)
  case obj
  when Array
    '[' + obj.map do |e|
      encrypted_pdf_object(e, key, id, gen, in_content_stream)
    end.join(' ') + ']'
  when LiteralString
    obj = ByteString.new(
      Prawn::Document::Security.encrypt_string(obj, key, id, gen)
    ).gsub(/[\\\n\(\)]/) { |m| "\\#{m}" }
    "(#{obj})"
  when Time
    obj = obj.strftime('D:%Y%m%d%H%M%S%z').chop.chop + "'00'"
    obj = ByteString.new(
      Prawn::Document::Security.encrypt_string(obj, key, id, gen)
    ).gsub(/[\\\n\(\)]/) { |m| "\\#{m}" }
    "(#{obj})"
  when String
    pdf_object(
      ByteString.new(
        Prawn::Document::Security.encrypt_string(obj, key, id, gen)
      ),
      in_content_stream
    )
  when ::Hash
    '<< ' +
      obj.map do |k, v|
        unless k.is_a?(String) || k.is_a?(Symbol)
          raise PDF::Core::Errors::FailedObjectConversion,
            'A PDF Dictionary must be keyed by names'
        end
        pdf_object(k.to_sym, in_content_stream) + ' ' +
          encrypted_pdf_object(v, key, id, gen, in_content_stream) + "\n"
      end.join('') +
      '>>'
  when NameTree::Value
    pdf_object(obj.name) + ' ' +
      encrypted_pdf_object(obj.value, key, id, gen, in_content_stream)
  when PDF::Core::OutlineRoot, PDF::Core::OutlineItem
    encrypted_pdf_object(obj.to_hash, key, id, gen, in_content_stream)
  else # delegate back to pdf_object
    pdf_object(obj, in_content_stream)
  end
end