def PdfObject(obj, in_content_stream = false)
case(obj)
when NilClass then "null"
when TrueClass then "true"
when FalseClass then "false"
when Numeric then String(obj)
when Array
"[" << obj.map { |e| PdfObject(e, in_content_stream) }.join(' ') << "]"
when Prawn::LiteralString
obj = obj.gsub(/[\\\n\(\)]/) { |m| "\\#{m}" }
"(#{obj})"
when String
obj = "\xFE\xFF" + obj.unpack("U*").pack("n*") unless in_content_stream
"<" << obj.unpack("H*").first << ">"
when Symbol
if (obj = obj.to_s) =~ /\s/
raise Prawn::Errors::FailedObjectConversion,
"A PDF Name cannot contain whitespace"
else
"/" << obj
end
when Hash
output = "<< "
obj.each do |k,v|
unless String === k || Symbol === k
raise Prawn::Errors::FailedObjectConversion,
"A PDF Dictionary must be keyed by names"
end
output << PdfObject(k.to_sym, in_content_stream) << " " <<
PdfObject(v, in_content_stream) << "\n"
end
output << ">>"
when Prawn::Reference
obj.to_s
when Prawn::NameTree::Node
PdfObject(obj.to_hash)
when Prawn::NameTree::Value
PdfObject(obj.name) + " " + PdfObject(obj.value)
else
raise Prawn::Errors::FailedObjectConversion,
"This object cannot be serialized to PDF"
end
end