Skip to main content

pdf_lib_rs/core/objects/
pdf_object.rs

1use std::fmt;
2
3/// Trait implemented by all PDF object types.
4/// Provides serialization to PDF byte format.
5pub trait PdfObjectTrait: fmt::Display {
6    /// Return the size in bytes when serialized.
7    fn size_in_bytes(&self) -> usize;
8
9    /// Copy serialized bytes into the buffer at the given offset.
10    /// Returns the number of bytes written.
11    fn copy_bytes_into(&self, buffer: &mut [u8], offset: usize) -> usize;
12
13    /// Serialize to a Vec<u8>.
14    fn to_bytes(&self) -> Vec<u8> {
15        let size = self.size_in_bytes();
16        let mut buffer = vec![0u8; size];
17        self.copy_bytes_into(&mut buffer, 0);
18        buffer
19    }
20}
21
22/// Enum representing any PDF object type.
23#[derive(Debug, Clone)]
24pub enum PdfObject {
25    Name(super::PdfName),
26    Ref(super::PdfRef),
27    Number(super::PdfNumber),
28    String(super::PdfString),
29    HexString(super::PdfHexString),
30    Bool(super::PdfBool),
31    Null,
32    Array(super::PdfArray),
33    Dict(super::PdfDict),
34    Stream(super::PdfRawStream),
35}
36
37impl fmt::Display for PdfObject {
38    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
39        match self {
40            PdfObject::Name(v) => write!(f, "{}", v),
41            PdfObject::Ref(v) => write!(f, "{}", v),
42            PdfObject::Number(v) => write!(f, "{}", v),
43            PdfObject::String(v) => write!(f, "{}", v),
44            PdfObject::HexString(v) => write!(f, "{}", v),
45            PdfObject::Bool(v) => write!(f, "{}", v),
46            PdfObject::Null => write!(f, "null"),
47            PdfObject::Array(v) => write!(f, "{}", v),
48            PdfObject::Dict(v) => write!(f, "{}", v),
49            PdfObject::Stream(v) => write!(f, "{}", v),
50        }
51    }
52}
53
54impl PdfObjectTrait for PdfObject {
55    fn size_in_bytes(&self) -> usize {
56        match self {
57            PdfObject::Name(v) => v.size_in_bytes(),
58            PdfObject::Ref(v) => v.size_in_bytes(),
59            PdfObject::Number(v) => v.size_in_bytes(),
60            PdfObject::String(v) => v.size_in_bytes(),
61            PdfObject::HexString(v) => v.size_in_bytes(),
62            PdfObject::Bool(v) => v.size_in_bytes(),
63            PdfObject::Null => 4,
64            PdfObject::Array(v) => v.size_in_bytes(),
65            PdfObject::Dict(v) => v.size_in_bytes(),
66            PdfObject::Stream(v) => v.size_in_bytes(),
67        }
68    }
69
70    fn copy_bytes_into(&self, buffer: &mut [u8], offset: usize) -> usize {
71        match self {
72            PdfObject::Name(v) => v.copy_bytes_into(buffer, offset),
73            PdfObject::Ref(v) => v.copy_bytes_into(buffer, offset),
74            PdfObject::Number(v) => v.copy_bytes_into(buffer, offset),
75            PdfObject::String(v) => v.copy_bytes_into(buffer, offset),
76            PdfObject::HexString(v) => v.copy_bytes_into(buffer, offset),
77            PdfObject::Bool(v) => v.copy_bytes_into(buffer, offset),
78            PdfObject::Null => {
79                buffer[offset] = b'n';
80                buffer[offset + 1] = b'u';
81                buffer[offset + 2] = b'l';
82                buffer[offset + 3] = b'l';
83                4
84            }
85            PdfObject::Array(v) => v.copy_bytes_into(buffer, offset),
86            PdfObject::Dict(v) => v.copy_bytes_into(buffer, offset),
87            PdfObject::Stream(v) => v.copy_bytes_into(buffer, offset),
88        }
89    }
90}
91
92// Conversion impls
93impl From<super::PdfName> for PdfObject {
94    fn from(v: super::PdfName) -> Self { PdfObject::Name(v) }
95}
96impl From<super::PdfRef> for PdfObject {
97    fn from(v: super::PdfRef) -> Self { PdfObject::Ref(v) }
98}
99impl From<super::PdfNumber> for PdfObject {
100    fn from(v: super::PdfNumber) -> Self { PdfObject::Number(v) }
101}
102impl From<super::PdfString> for PdfObject {
103    fn from(v: super::PdfString) -> Self { PdfObject::String(v) }
104}
105impl From<super::PdfHexString> for PdfObject {
106    fn from(v: super::PdfHexString) -> Self { PdfObject::HexString(v) }
107}
108impl From<super::PdfBool> for PdfObject {
109    fn from(v: super::PdfBool) -> Self { PdfObject::Bool(v) }
110}