Module: PDF::Core
- Defined in:
- lib/pdf/core.rb,
lib/pdf/core/page.rb,
lib/pdf/core/text.rb,
lib/pdf/core/stream.rb,
lib/pdf/core/filters.rb,
lib/pdf/core/renderer.rb,
lib/pdf/core/name_tree.rb,
lib/pdf/core/reference.rb,
lib/pdf/core/pdf_object.rb,
lib/pdf/core/annotations.rb,
lib/pdf/core/byte_string.rb,
lib/pdf/core/filter_list.rb,
lib/pdf/core/destinations.rb,
lib/pdf/core/object_store.rb,
lib/pdf/core/outline_item.rb,
lib/pdf/core/outline_root.rb,
lib/pdf/core/page_geometry.rb,
lib/pdf/core/document_state.rb,
lib/pdf/core/graphics_state.rb,
lib/pdf/core/literal_string.rb
Defined Under Namespace
Modules: Annotations, Destinations, Errors, Filters, NameTree, PageGeometry, Text Classes: ByteString, DocumentState, FilterList, GraphicState, GraphicStateStack, LiteralString, ObjectStore, OutlineItem, OutlineRoot, Page, Reference, Renderer, Stream
Class Method Summary collapse
-
.PdfObject(obj, in_content_stream = false) ⇒ Object
Serializes Ruby objects to their PDF equivalents.
-
.Reference(*args, &block) ⇒ Object
:nodoc:.
-
.string_to_hex(str) ⇒ Object
encodes any string into a hex representation.
- .utf8_to_utf16(str) ⇒ Object
Class Method Details
.PdfObject(obj, in_content_stream = false) ⇒ Object
Serializes Ruby objects to their PDF equivalents. Most primitive objects will work as expected, but please note that Name objects are represented by Ruby Symbol objects and Dictionary objects are represented by Ruby hashes (keyed by symbols)
Examples:
PdfObject(true) #=> "true"
PdfObject(false) #=> "false"
PdfObject(1.2124) #=> "1.2124"
PdfObject("foo bar") #=> "(foo bar)"
PdfObject(:Symbol) #=> "/Symbol"
PdfObject(["foo",:bar, [1,2]]) #=> "[foo /bar [1 2]]"
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/pdf/core/pdf_object.rb', line 40 def PdfObject(obj, in_content_stream = false) case(obj) when NilClass then "null" when TrueClass then "true" when FalseClass then "false" when Numeric if (str = String(obj)) =~ /e/i # scientific notation is not supported in PDF sprintf("%.16f", obj).gsub(/\.?0+\z/, "") else str end when Array "[" << obj.map { |e| PdfObject(e, in_content_stream) }.join(' ') << "]" when PDF::Core::LiteralString obj = obj.gsub(/[\\\n\r\t\b\f\(\)]/n) { |m| "\\#{m}" } "(#{obj})" when Time obj = obj.strftime("D:%Y%m%d%H%M%S%z").chop.chop + "'00'" obj = obj.gsub(/[\\\n\r\t\b\f\(\)]/n) { |m| "\\#{m}" } "(#{obj})" when PDF::Core::ByteString "<" << obj.unpack("H*").first << ">" when String obj = utf8_to_utf16(obj) unless in_content_stream "<" << string_to_hex(obj) << ">" when Symbol "/" + obj.to_s.unpack("C*").map { |n| if n < 33 || n > 126 || [35,40,41,47,60,62].include?(n) "#" + n.to_s(16).upcase else [n].pack("C*") end }.join when ::Hash output = "<< " obj.each do |k,v| unless String === k || Symbol === k raise PDF::Core::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 PDF::Core::Reference obj.to_s when PDF::Core::NameTree::Node PdfObject(obj.to_hash) when PDF::Core::NameTree::Value PdfObject(obj.name) + " " + PdfObject(obj.value) when PDF::Core::OutlineRoot, PDF::Core::OutlineItem PdfObject(obj.to_hash) else raise PDF::Core::Errors::FailedObjectConversion, "This object cannot be serialized to PDF (#{obj.inspect})" end end |
.Reference(*args, &block) ⇒ Object
:nodoc:
74 75 76 |
# File 'lib/pdf/core/reference.rb', line 74 def Reference(*args, &block) #:nodoc: Reference.new(*args, &block) end |
.string_to_hex(str) ⇒ Object
encodes any string into a hex representation. The result is a string with only 0-9 and a-f characters. That result is valid ASCII so tag it as such to account for behaviour of different ruby VMs
22 23 24 |
# File 'lib/pdf/core/pdf_object.rb', line 22 def string_to_hex(str) str.unpack("H*").first.force_encoding(::Encoding::US_ASCII) end |
.utf8_to_utf16(str) ⇒ Object
15 16 17 |
# File 'lib/pdf/core/pdf_object.rb', line 15 def utf8_to_utf16(str) "\xFE\xFF".force_encoding(::Encoding::UTF_16BE) + str.encode(::Encoding::UTF_16BE) end |