Class: Pdfrb::Serializer
- Inherits:
-
Object
- Object
- Pdfrb::Serializer
- Defined in:
- lib/pdfrb/serializer.rb
Overview
Model -> PDF bytes (COS values). Stateless; safe to share across
documents. Indirect-object aware: a Model::Reference value is
emitted as oid gen R, not inlined.
Streams are emitted only as part of an indirect object via the
Writer (which handles obj/endobj framing); the Serializer's
job is to produce the COS-fragment bytes for the dict body, the
stream payload, etc.
Instance Attribute Summary collapse
-
#compress_min_size ⇒ Object
readonly
Returns the value of attribute compress_min_size.
-
#compress_streams ⇒ Object
readonly
Returns the value of attribute compress_streams.
-
#encrypter ⇒ Object
readonly
Returns the value of attribute encrypter.
Class Method Summary collapse
Instance Method Summary collapse
-
#initialize(encrypter: nil, compress_streams: false, compress_min_size: 256) ⇒ Serializer
constructor
A new instance of Serializer.
- #serialize(value) ⇒ Object
-
#serialize_indirect(obj) ⇒ Object
Serialise an indirect object's body, including
oid gen objheader and (for streams) the stream payload.
Constructor Details
#initialize(encrypter: nil, compress_streams: false, compress_min_size: 256) ⇒ Serializer
Returns a new instance of Serializer.
15 16 17 18 19 |
# File 'lib/pdfrb/serializer.rb', line 15 def initialize(encrypter: nil, compress_streams: false, compress_min_size: 256) @encrypter = encrypter @compress_streams = compress_streams @compress_min_size = compress_min_size.to_i end |
Instance Attribute Details
#compress_min_size ⇒ Object (readonly)
Returns the value of attribute compress_min_size.
13 14 15 |
# File 'lib/pdfrb/serializer.rb', line 13 def compress_min_size @compress_min_size end |
#compress_streams ⇒ Object (readonly)
Returns the value of attribute compress_streams.
13 14 15 |
# File 'lib/pdfrb/serializer.rb', line 13 def compress_streams @compress_streams end |
#encrypter ⇒ Object (readonly)
Returns the value of attribute encrypter.
13 14 15 |
# File 'lib/pdfrb/serializer.rb', line 13 def encrypter @encrypter end |
Class Method Details
.serialize(value, encrypter: nil, **opts) ⇒ Object
22 23 24 |
# File 'lib/pdfrb/serializer.rb', line 22 def serialize(value, encrypter: nil, **opts) new(encrypter: encrypter, **opts).serialize(value) end |
Instance Method Details
#serialize(value) ⇒ Object
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/pdfrb/serializer.rb', line 27 def serialize(value) case value when ::Integer then serialize_integer(value) when ::Float then serialize_real(value) when ::Symbol then serialize_name(value) when ::String then serialize_string(value) when true then "true" when false then "false" when nil then "null" when Pdfrb::Model::Reference then serialize_reference(value) when ::Array then serialize_array(value) when Pdfrb::Model::PdfArray then serialize_array(value.value) when ::Hash then serialize_dict(value) when Pdfrb::Model::Cos::Dictionary then serialize_dict(value.value) when Pdfrb::Model::Cos::Stream then serialize_dict(value.value) when Pdfrb::Model::Object then serialize(value.value) when Pdfrb::Model::Date then serialize_date_string(value) when Pdfrb::Model::Rectangle then serialize_array(value.to_a) when Pdfrb::Model::Matrix then serialize_array(value.to_a) else raise Pdfrb::SerializeError, "cannot serialise #{value.class}: #{value.inspect}" end end |
#serialize_indirect(obj) ⇒ Object
Serialise an indirect object's body, including oid gen obj
header and (for streams) the stream payload.
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
# File 'lib/pdfrb/serializer.rb', line 54 def serialize_indirect(obj) raise ArgumentError, "not indirect: #{obj.inspect}" unless obj.indirect? buffer = +"" buffer << "#{obj.oid} #{obj.gen} obj\n" case obj when Pdfrb::Model::Cos::Stream dict, payload = emit_stream(obj) buffer << dict buffer << "\nstream\n" buffer << (encrypter ? encrypter.encrypt(payload, obj.oid, obj.gen) : payload) buffer << "\nendstream\n" else buffer << serialize(obj) buffer << "\n" end buffer << "endobj\n" buffer.force_encoding(Encoding::BINARY) end |