pdf_lib_rs/core/objects/
pdf_object.rs1use std::fmt;
2
3pub trait PdfObjectTrait: fmt::Display {
6 fn size_in_bytes(&self) -> usize;
8
9 fn copy_bytes_into(&self, buffer: &mut [u8], offset: usize) -> usize;
12
13 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#[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
92impl 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}