1mod color;
6mod function;
7mod stream;
8mod types;
9
10pub use self::color::*;
11pub use self::function::*;
12pub use self::stream::*;
13pub use self::types::*;
14pub use crate::file::PromisedRef;
15use crate::file::UpdateOptions;
16use crate::parser::ParseFlags;
17
18use crate::enc::*;
19use crate::error::*;
20use crate::primitive::*;
21
22use datasize::DataSize;
23use once_cell::sync::OnceCell;
24use std::any::type_name;
25use std::collections::HashMap;
26use std::convert::TryInto;
27use std::fmt;
28use std::hash::{Hash, Hasher};
29use std::marker::PhantomData;
30use std::ops::{Deref, Range};
31use std::sync::Arc;
32
33pub type ObjNr = u64;
34pub type GenNr = u64;
35
36#[derive(Clone)]
37pub struct ParseOptions {
38 pub allow_error_in_option: bool,
39 pub allow_xref_error: bool,
40 pub allow_invalid_ops: bool,
41 pub allow_missing_endobj: bool,
42}
43impl ParseOptions {
44 pub const fn tolerant() -> Self {
45 ParseOptions {
46 allow_error_in_option: true,
47 allow_xref_error: true,
48 allow_invalid_ops: true,
49 allow_missing_endobj: true,
50 }
51 }
52 pub const fn strict() -> Self {
53 ParseOptions {
54 allow_error_in_option: false,
55 allow_xref_error: false,
56 allow_invalid_ops: true,
57 allow_missing_endobj: false,
58 }
59 }
60}
61
62pub trait Resolve {
63 fn resolve_flags(&self, r: PlainRef, flags: ParseFlags, depth: usize) -> Result<Primitive>;
64 fn resolve(&self, r: PlainRef) -> Result<Primitive> {
65 self.resolve_flags(r, ParseFlags::ANY, 16)
66 }
67 fn get<T: Object + DataSize>(&self, r: Ref<T>) -> Result<RcRef<T>>;
68 fn options(&self) -> &ParseOptions;
69 fn stream_data(&self, id: PlainRef, range: Range<usize>) -> Result<Arc<[u8]>>;
70 fn get_data_or_decode(
71 &self,
72 id: PlainRef,
73 range: Range<usize>,
74 filters: &[StreamFilter],
75 ) -> Result<Arc<[u8]>>;
76}
77
78pub struct NoResolve;
79impl Resolve for NoResolve {
80 fn resolve_flags(&self, _: PlainRef, _: ParseFlags, _: usize) -> Result<Primitive> {
81 Err(PdfError::Reference)
82 }
83 fn get<T: Object + DataSize>(&self, _r: Ref<T>) -> Result<RcRef<T>> {
84 Err(PdfError::Reference)
85 }
86 fn options(&self) -> &ParseOptions {
87 static STRICT: ParseOptions = ParseOptions::strict();
88 &STRICT
89 }
90 fn get_data_or_decode(
91 &self,
92 _: PlainRef,
93 _: Range<usize>,
94 _: &[StreamFilter],
95 ) -> Result<Arc<[u8]>> {
96 Err(PdfError::Reference)
97 }
98 fn stream_data(&self, _id: PlainRef, _range: Range<usize>) -> Result<Arc<[u8]>> {
99 Err(PdfError::Reference)
100 }
101}
102
103pub trait Object: Sized + Sync + Send + 'static {
105 fn from_primitive(p: Primitive, resolve: &impl Resolve) -> Result<Self>;
107}
108
109pub trait Cloner: Updater + Resolve {
110 fn clone_plainref(&mut self, old: PlainRef) -> Result<PlainRef>;
111 fn clone_ref<T: DeepClone + Object + DataSize + ObjectWrite>(
112 &mut self,
113 old: Ref<T>,
114 ) -> Result<Ref<T>>;
115 fn clone_rcref<T: DeepClone + ObjectWrite + DataSize>(
116 &mut self,
117 old: &RcRef<T>,
118 ) -> Result<RcRef<T>>;
119 fn clone_shared<T: DeepClone>(&mut self, old: &Shared<T>) -> Result<Shared<T>>;
120}
121
122pub trait DeepClone: Sized + Sync + Send + 'static {
123 fn deep_clone(&self, cloner: &mut impl Cloner) -> Result<Self>;
124}
125
126pub trait Updater {
127 fn create<T: ObjectWrite>(&mut self, obj: T) -> Result<RcRef<T>>;
128 fn update<T: ObjectWrite>(&mut self, old: PlainRef, obj: T) -> Result<RcRef<T>> {
129 self.update_with(old, obj, UpdateOptions::default())
130 }
131 fn update_with<T: ObjectWrite>(&mut self, old: PlainRef, obj: T, options: UpdateOptions) -> Result<RcRef<T>>;
132 fn promise<T: Object>(&mut self) -> PromisedRef<T>;
133 fn fulfill<T: ObjectWrite>(&mut self, promise: PromisedRef<T>, obj: T) -> Result<RcRef<T>>;
134 fn update_ref<T: ObjectWrite>(&mut self, old: &RcRef<T>, obj: T) -> Result<RcRef<T>> {
135 self.update(old.get_ref().inner, obj)
136 }
137}
138
139pub struct NoUpdate;
140impl Updater for NoUpdate {
141 fn create<T: ObjectWrite>(&mut self, _obj: T) -> Result<RcRef<T>> {
142 panic!()
143 }
144 fn update_with<T: ObjectWrite>(&mut self, _old: PlainRef, _obj: T, _options: UpdateOptions) -> Result<RcRef<T>> {
145 panic!()
146 }
147 fn promise<T: Object>(&mut self) -> PromisedRef<T> {
148 panic!()
149 }
150 fn fulfill<T: ObjectWrite>(&mut self, _promise: PromisedRef<T>, _obj: T) -> Result<RcRef<T>> {
151 panic!()
152 }
153}
154
155pub trait ObjectWrite {
156 fn to_primitive(&self, update: &mut impl Updater) -> Result<Primitive>;
157}
158
159pub trait FromDict: Sized {
160 fn from_dict(dict: Dictionary, resolve: &impl Resolve) -> Result<Self>;
161}
162pub trait ToDict: ObjectWrite {
163 fn to_dict(&self, update: &mut impl Updater) -> Result<Dictionary>;
164}
165
166pub trait SubType<T> {}
167
168pub trait Trace {
169 fn trace(&self, _cb: &mut impl FnMut(PlainRef)) {}
170}
171
172#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, DataSize)]
178pub struct PlainRef {
179 pub id: ObjNr,
180 pub gen: GenNr,
181}
182impl Object for PlainRef {
183 fn from_primitive(p: Primitive, _: &impl Resolve) -> Result<Self> {
184 p.into_reference()
185 }
186}
187impl ObjectWrite for PlainRef {
188 fn to_primitive(&self, _: &mut impl Updater) -> Result<Primitive> {
189 Ok(Primitive::Reference(*self))
190 }
191}
192impl DeepClone for PlainRef {
193 fn deep_clone(&self, cloner: &mut impl Cloner) -> Result<Self> {
194 cloner.clone_plainref(*self)
195 }
196}
197
198pub struct Ref<T> {
201 inner: PlainRef,
202 _marker: PhantomData<T>,
203}
204impl<T> Clone for Ref<T> {
205 fn clone(&self) -> Ref<T> {
206 *self
207 }
208}
209impl<T> Copy for Ref<T> {}
210impl<T> DataSize for Ref<T> {
211 const IS_DYNAMIC: bool = false;
212 const STATIC_HEAP_SIZE: usize = size_of::<Self>();
213 fn estimate_heap_size(&self) -> usize {
214 size_of::<Self>()
215 }
216}
217
218impl<T> Ref<T> {
219 pub fn new(inner: PlainRef) -> Ref<T> {
220 Ref {
221 inner,
222 _marker: PhantomData,
223 }
224 }
225 pub fn from_id(id: ObjNr) -> Ref<T> {
226 Ref {
227 inner: PlainRef { id, gen: 0 },
228 _marker: PhantomData,
229 }
230 }
231 pub fn get_inner(&self) -> PlainRef {
232 self.inner
233 }
234 pub fn upcast<U>(self) -> Ref<U>
235 where
236 T: SubType<U>,
237 {
238 Ref::new(self.inner)
239 }
240}
241impl<T: Object> Object for Ref<T> {
242 fn from_primitive(p: Primitive, _: &impl Resolve) -> Result<Self> {
243 Ok(Ref::new(p.into_reference()?))
244 }
245}
246impl<T> ObjectWrite for Ref<T> {
247 fn to_primitive(&self, update: &mut impl Updater) -> Result<Primitive> {
248 self.inner.to_primitive(update)
249 }
250}
251impl<T: DeepClone + Object + DataSize + ObjectWrite> DeepClone for Ref<T> {
252 fn deep_clone(&self, cloner: &mut impl Cloner) -> Result<Self> {
253 cloner.clone_ref(*self)
254 }
255}
256impl<T> Trace for Ref<T> {
257 fn trace(&self, cb: &mut impl FnMut(PlainRef)) {
258 cb(self.inner);
259 }
260}
261impl<T> fmt::Debug for Ref<T> {
262 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
263 write!(f, "Ref({})", self.inner.id)
264 }
265}
266impl<T> Hash for Ref<T> {
267 fn hash<H: Hasher>(&self, state: &mut H) {
268 self.inner.hash(state)
269 }
270}
271impl<T> PartialEq for Ref<T> {
272 fn eq(&self, rhs: &Self) -> bool {
273 self.inner.eq(&rhs.inner)
274 }
275}
276impl<T> Eq for Ref<T> {}
277
278pub type Shared<T> = Arc<T>;
279
280#[derive(Debug, DataSize)]
281pub struct RcRef<T> {
282 inner: PlainRef,
283 data: Shared<T>,
284}
285impl<T> From<RcRef<T>> for Primitive {
286 fn from(value: RcRef<T>) -> Self {
287 Primitive::Reference(value.inner)
288 }
289}
290impl<T> From<RcRef<T>> for Ref<T> {
291 fn from(value: RcRef<T>) -> Self {
292 value.get_ref()
293 }
294}
295impl<T> AsRef<Shared<T>> for RcRef<T> {
296 fn as_ref(&self) -> &Shared<T> {
297 &self.data
298 }
299}
300impl<T> RcRef<T> {
301 pub fn new(inner: PlainRef, data: Shared<T>) -> RcRef<T> {
302 RcRef { inner, data }
303 }
304 pub fn get_ref(&self) -> Ref<T> {
305 Ref::new(self.inner)
306 }
307}
308impl<T: Object + std::fmt::Debug + DataSize> Object for RcRef<T> {
309 fn from_primitive(p: Primitive, resolve: &impl Resolve) -> Result<Self> {
310 match p {
311 Primitive::Reference(r) => resolve.get(Ref::new(r)),
312 p => Err(PdfError::UnexpectedPrimitive {
313 expected: "Reference",
314 found: p.get_debug_name(),
315 }),
316 }
317 }
318}
319impl<T> ObjectWrite for RcRef<T> {
320 fn to_primitive(&self, update: &mut impl Updater) -> Result<Primitive> {
321 self.inner.to_primitive(update)
322 }
323}
324impl<T: DeepClone + std::fmt::Debug + DataSize + Object + ObjectWrite> DeepClone for RcRef<T> {
325 fn deep_clone(&self, cloner: &mut impl Cloner) -> Result<Self> {
326 cloner.clone_rcref(self)
327 }
328}
329
330impl<T> Deref for RcRef<T> {
331 type Target = T;
332 fn deref(&self) -> &T {
333 &self.data
334 }
335}
336impl<T> Clone for RcRef<T> {
337 fn clone(&self) -> RcRef<T> {
338 RcRef {
339 inner: self.inner,
340 data: self.data.clone(),
341 }
342 }
343}
344impl<T> Trace for RcRef<T> {
345 fn trace(&self, cb: &mut impl FnMut(PlainRef)) {
346 cb(self.inner);
347 }
348}
349impl<'a, T> From<&'a RcRef<T>> for Ref<T> {
350 fn from(r: &'a RcRef<T>) -> Ref<T> {
351 Ref::new(r.inner)
352 }
353}
354impl<T> Hash for RcRef<T> {
355 fn hash<H: Hasher>(&self, state: &mut H) {
356 std::ptr::hash(&**self, state)
357 }
358}
359impl<T> PartialEq for RcRef<T> {
360 fn eq(&self, rhs: &Self) -> bool {
361 std::ptr::eq(&**self, &**rhs)
362 }
363}
364impl<T> Eq for RcRef<T> {}
365
366#[derive(Debug, DataSize)]
367pub enum MaybeRef<T> {
368 Direct(Shared<T>),
369 Indirect(RcRef<T>),
370}
371impl<T> MaybeRef<T> {
372 pub fn as_ref(&self) -> Option<Ref<T>> {
373 match *self {
374 MaybeRef::Indirect(ref r) => Some(r.get_ref()),
375 _ => None,
376 }
377 }
378 pub fn data(&self) -> &Shared<T> {
379 match *self {
380 MaybeRef::Direct(ref t) => t,
381 MaybeRef::Indirect(ref r) => &r.data,
382 }
383 }
384}
385impl<T: Clone> MaybeRef<T> {
386 pub fn owned(&self) -> T {
387 (**self.data()).clone()
388 }
389}
390impl<T: Object + DataSize> Object for MaybeRef<T> {
391 fn from_primitive(p: Primitive, resolve: &impl Resolve) -> Result<Self> {
392 Ok(match p {
393 Primitive::Reference(r) => MaybeRef::Indirect(resolve.get(Ref::new(r))?),
394 p => MaybeRef::Direct(Shared::new(T::from_primitive(p, resolve)?)),
395 })
396 }
397}
398impl<T: ObjectWrite> ObjectWrite for MaybeRef<T> {
399 fn to_primitive(&self, update: &mut impl Updater) -> Result<Primitive> {
400 match self {
401 MaybeRef::Direct(ref inner) => inner.to_primitive(update),
402 MaybeRef::Indirect(r) => r.to_primitive(update),
403 }
404 }
405}
406impl<T: DeepClone + std::fmt::Debug + DataSize + Object + ObjectWrite> DeepClone for MaybeRef<T> {
407 fn deep_clone(&self, cloner: &mut impl Cloner) -> Result<Self> {
408 match *self {
409 MaybeRef::Direct(ref old) => cloner.clone_shared(old).map(MaybeRef::Direct),
410 MaybeRef::Indirect(ref old) => cloner.clone_rcref(old).map(MaybeRef::Indirect),
411 }
412 }
413}
414impl<T> Deref for MaybeRef<T> {
415 type Target = T;
416 fn deref(&self) -> &T {
417 match *self {
418 MaybeRef::Direct(ref t) => t,
419 MaybeRef::Indirect(ref r) => r,
420 }
421 }
422}
423impl<T> Clone for MaybeRef<T> {
424 fn clone(&self) -> Self {
425 match *self {
426 MaybeRef::Direct(ref rc) => MaybeRef::Direct(rc.clone()),
427 MaybeRef::Indirect(ref r) => MaybeRef::Indirect(r.clone()),
428 }
429 }
430}
431impl<T> Trace for MaybeRef<T> {
432 fn trace(&self, cb: &mut impl FnMut(PlainRef)) {
433 match *self {
434 MaybeRef::Indirect(ref rc) => rc.trace(cb),
435 MaybeRef::Direct(_) => (),
436 }
437 }
438}
439impl<T> From<Shared<T>> for MaybeRef<T> {
440 fn from(r: Shared<T>) -> MaybeRef<T> {
441 MaybeRef::Direct(r)
442 }
443}
444impl<T> From<T> for MaybeRef<T> {
445 fn from(t: T) -> MaybeRef<T> {
446 MaybeRef::Direct(t.into())
447 }
448}
449impl<T> From<MaybeRef<T>> for Shared<T> {
450 fn from(r: MaybeRef<T>) -> Shared<T> {
451 match r {
452 MaybeRef::Direct(rc) => rc,
453 MaybeRef::Indirect(r) => r.data,
454 }
455 }
456}
457impl<'a, T> From<&'a MaybeRef<T>> for Shared<T> {
458 fn from(r: &'a MaybeRef<T>) -> Shared<T> {
459 match r {
460 MaybeRef::Direct(ref rc) => rc.clone(),
461 MaybeRef::Indirect(ref r) => r.data.clone(),
462 }
463 }
464}
465impl<T> From<RcRef<T>> for MaybeRef<T> {
466 fn from(r: RcRef<T>) -> MaybeRef<T> {
467 MaybeRef::Indirect(r)
468 }
469}
470impl<T> Hash for MaybeRef<T> {
471 fn hash<H: Hasher>(&self, state: &mut H) {
472 std::ptr::hash(&**self, state)
473 }
474}
475impl<T> PartialEq for MaybeRef<T> {
476 fn eq(&self, rhs: &Self) -> bool {
477 std::ptr::eq(&**self, &**rhs)
478 }
479}
480impl<T> Eq for MaybeRef<T> {}
481
482#[derive(Debug)]
483pub struct Lazy<T> {
484 pub primitive: Primitive,
485 cache: OnceCell<MaybeRef<T>>,
486 _marker: PhantomData<T>,
487}
488impl<T: DataSize> DataSize for Lazy<T> {
489 const IS_DYNAMIC: bool = true;
490 const STATIC_HEAP_SIZE: usize = size_of::<Self>();
491 fn estimate_heap_size(&self) -> usize {
492 self.cache
493 .get()
494 .map(|value| value.estimate_heap_size())
495 .unwrap_or(0)
496 + size_of::<Self>()
497 }
498}
499
500impl<T> Clone for Lazy<T> {
501 fn clone(&self) -> Self {
502 Lazy {
503 primitive: self.primitive.clone(),
504 cache: self.cache.clone(),
505 _marker: PhantomData,
506 }
507 }
508}
509impl<T: Object> DeepClone for Lazy<T> {
510 fn deep_clone(&self, cloner: &mut impl Cloner) -> Result<Self> {
511 Ok(Lazy {
512 primitive: self.primitive.deep_clone(cloner)?,
513 cache: OnceCell::new(),
514 _marker: PhantomData,
515 })
516 }
517}
518impl<T: Object + DataSize> Lazy<T> {
519 pub fn load(&self, resolve: &impl Resolve) -> Result<MaybeRef<T>> {
520 self.cache
521 .get_or_try_init(|| match self.primitive {
522 Primitive::Reference(r) => resolve.get(Ref::new(r)).map(MaybeRef::Indirect),
523 ref p => {
524 T::from_primitive(p.clone(), resolve).map(|o| MaybeRef::Direct(Arc::new(o)))
525 }
526 })
527 .cloned()
528 }
529 pub fn safe(value: MaybeRef<T>, update: &mut impl Updater) -> Result<Self>
530 where T: ObjectWrite
531 {
532 let primitive = value.to_primitive(update)?;
533 Ok(Lazy { primitive, _marker: PhantomData, cache: OnceCell::new() })
534 }
535}
536impl<T: ObjectWrite> Lazy<T> {
537 pub fn new(data: T, update: &mut impl Updater) -> Result<Self> {
538 let primitive = data.to_primitive(update)?;
539 Ok(Lazy { primitive, cache: OnceCell::new(), _marker: PhantomData })
540 }
541}
542impl<T: Object> Object for Lazy<T> {
543 fn from_primitive(p: Primitive, _: &impl Resolve) -> Result<Self> {
544 Ok(Self {
545 primitive: p,
546 cache: OnceCell::new(),
547 _marker: PhantomData,
548 })
549 }
550}
551impl<T: ObjectWrite> ObjectWrite for Lazy<T> {
552 fn to_primitive(&self, _update: &mut impl Updater) -> Result<Primitive> {
553 Ok(self.primitive.clone())
554 }
555}
556impl<T> Default for Lazy<T> {
557 fn default() -> Self {
558 Lazy {
559 primitive: Primitive::Null,
560 cache: OnceCell::new(),
561 _marker: PhantomData,
562 }
563 }
564}
565impl<T: Object> From<RcRef<T>> for Lazy<T> {
566 fn from(value: RcRef<T>) -> Self {
567 Lazy {
568 primitive: Primitive::Reference(value.inner),
569 cache: OnceCell::with_value(MaybeRef::Direct(value.data)),
570 _marker: PhantomData
571 }
572 }
573}
574
575
576impl Object for i32 {
581 fn from_primitive(p: Primitive, r: &impl Resolve) -> Result<Self> {
582 match p {
583 Primitive::Reference(id) => r.resolve(id)?.as_integer(),
584 p => p.as_integer(),
585 }
586 }
587}
588impl ObjectWrite for i32 {
589 fn to_primitive(&self, _: &mut impl Updater) -> Result<Primitive> {
590 Ok(Primitive::Integer(*self))
591 }
592}
593
594impl Object for u32 {
595 fn from_primitive(p: Primitive, r: &impl Resolve) -> Result<Self> {
596 match p {
597 Primitive::Reference(id) => r.resolve(id)?.as_u32(),
598 p => p.as_u32(),
599 }
600 }
601}
602impl ObjectWrite for u32 {
603 fn to_primitive(&self, _: &mut impl Updater) -> Result<Primitive> {
604 Ok(Primitive::Integer(*self as _))
605 }
606}
607
608impl Object for usize {
609 fn from_primitive(p: Primitive, r: &impl Resolve) -> Result<Self> {
610 match p {
611 Primitive::Reference(id) => Ok(r.resolve(id)?.as_usize()?),
612 p => Ok(p.as_usize()?),
613 }
614 }
615}
616impl ObjectWrite for usize {
617 fn to_primitive(&self, _: &mut impl Updater) -> Result<Primitive> {
618 Ok(Primitive::Integer(*self as _))
619 }
620}
621
622impl Object for f32 {
623 fn from_primitive(p: Primitive, r: &impl Resolve) -> Result<Self> {
624 match p {
625 Primitive::Reference(id) => r.resolve(id)?.as_number(),
626 p => p.as_number(),
627 }
628 }
629}
630impl ObjectWrite for f32 {
631 fn to_primitive(&self, _: &mut impl Updater) -> Result<Primitive> {
632 Ok(Primitive::Number(*self))
633 }
634}
635
636impl Object for bool {
637 fn from_primitive(p: Primitive, r: &impl Resolve) -> Result<Self> {
638 match p {
639 Primitive::Reference(id) => r.resolve(id)?.as_bool(),
640 p => p.as_bool(),
641 }
642 }
643}
644impl ObjectWrite for bool {
645 fn to_primitive(&self, _: &mut impl Updater) -> Result<Primitive> {
646 Ok(Primitive::Boolean(*self))
647 }
648}
649
650impl Object for Dictionary {
651 fn from_primitive(p: Primitive, r: &impl Resolve) -> Result<Self> {
652 match p {
653 Primitive::Dictionary(dict) => Ok(dict),
654 Primitive::Reference(id) => Dictionary::from_primitive(r.resolve(id)?, r),
655 _ => Err(PdfError::UnexpectedPrimitive {
656 expected: "Dictionary",
657 found: p.get_debug_name(),
658 }),
659 }
660 }
661}
662
663impl Object for Name {
664 fn from_primitive(p: Primitive, resolve: &impl Resolve) -> Result<Self> {
665 p.resolve(resolve)?.into_name()
666 }
667}
668impl ObjectWrite for Name {
669 fn to_primitive(&self, _: &mut impl Updater) -> Result<Primitive> {
670 Ok(Primitive::Name(self.0.clone()))
671 }
672}
673
674impl<T: Object> Object for Vec<T> {
675 fn from_primitive(p: Primitive, r: &impl Resolve) -> Result<Self> {
677 Ok(match p {
678 Primitive::Array(_) => p
679 .resolve(r)?
680 .into_array()?
681 .into_iter()
682 .map(|p| T::from_primitive(p, r))
683 .collect::<Result<Vec<T>>>()?,
684 Primitive::Null => Vec::new(),
685 Primitive::Reference(id) => Self::from_primitive(r.resolve(id)?, r)?,
686 _ => vec![T::from_primitive(p, r)?],
687 })
688 }
689}
690impl<T: ObjectWrite> ObjectWrite for Vec<T> {
691 fn to_primitive(&self, update: &mut impl Updater) -> Result<Primitive> {
692 Primitive::array::<T, _, _, _>(self.iter(), update)
693 }
694}
695impl<T: DeepClone> DeepClone for Vec<T> {
696 fn deep_clone(&self, cloner: &mut impl Cloner) -> Result<Self> {
697 self.iter().map(|t| t.deep_clone(cloner)).collect()
698 }
699}
700impl<T: Trace> Trace for Vec<T> {
701 fn trace(&self, cb: &mut impl FnMut(PlainRef)) {
702 for i in self.iter() {
703 i.trace(cb);
704 }
705 }
706}
707impl Object for Primitive {
732 fn from_primitive(p: Primitive, _: &impl Resolve) -> Result<Self> {
733 Ok(p)
734 }
735}
736impl ObjectWrite for Primitive {
737 fn to_primitive(&self, _: &mut impl Updater) -> Result<Primitive> {
738 Ok(self.clone())
739 }
740}
741impl DeepClone for Primitive {
742 fn deep_clone(&self, cloner: &mut impl Cloner) -> Result<Self> {
743 match *self {
744 Primitive::Array(ref parts) => Ok(Primitive::Array(
745 parts
746 .into_iter()
747 .map(|p| p.deep_clone(cloner))
748 .collect::<Result<Vec<_>, _>>()?,
749 )),
750 Primitive::Boolean(b) => Ok(Primitive::Boolean(b)),
751 Primitive::Dictionary(ref dict) => Ok(Primitive::Dictionary(dict.deep_clone(cloner)?)),
752 Primitive::Integer(i) => Ok(Primitive::Integer(i)),
753 Primitive::Name(ref name) => Ok(Primitive::Name(name.clone())),
754 Primitive::Null => Ok(Primitive::Null),
755 Primitive::Number(n) => Ok(Primitive::Number(n)),
756 Primitive::Reference(r) => Ok(Primitive::Reference(r.deep_clone(cloner)?)),
757 Primitive::Stream(ref s) => Ok(Primitive::Stream(s.deep_clone(cloner)?)),
758 Primitive::String(ref s) => Ok(Primitive::String(s.clone())),
759 }
760 }
761}
762
763impl Trace for Primitive {
764 fn trace(&self, cb: &mut impl FnMut(PlainRef)) {
765 match *self {
766 Primitive::Reference(r) => cb(r),
767 Primitive::Array(ref parts) => parts.iter().for_each(|p| p.trace(cb)),
768 Primitive::Dictionary(ref dict) => dict.values().for_each(|p| p.trace(cb)),
769 _ => (),
770 }
771 }
772}
773
774impl<V: Object> Object for HashMap<Name, V> {
775 fn from_primitive(p: Primitive, resolve: &impl Resolve) -> Result<Self> {
776 match p {
777 Primitive::Null => Ok(HashMap::new()),
778 Primitive::Dictionary(dict) => {
779 let mut new = Self::new();
780 for (key, val) in dict.iter() {
781 new.insert(key.clone(), V::from_primitive(val.clone(), resolve)?);
782 }
783 Ok(new)
784 }
785 Primitive::Reference(id) => HashMap::from_primitive(resolve.resolve(id)?, resolve),
786 p => Err(PdfError::UnexpectedPrimitive {
787 expected: "Dictionary",
788 found: p.get_debug_name(),
789 }),
790 }
791 }
792}
793impl<V: ObjectWrite> ObjectWrite for HashMap<Name, V> {
794 fn to_primitive(&self, update: &mut impl Updater) -> Result<Primitive> {
795 if self.is_empty() {
796 Ok(Primitive::Null)
797 } else {
798 let mut dict = Dictionary::new();
799 for (k, v) in self.iter() {
800 dict.insert(k.clone(), v.to_primitive(update)?);
801 }
802 Ok(Primitive::Dictionary(dict))
803 }
804 }
805}
806impl<V: DeepClone> DeepClone for HashMap<Name, V> {
807 fn deep_clone(&self, cloner: &mut impl Cloner) -> Result<Self> {
808 self.iter()
809 .map(|(k, v)| Ok((k.clone(), v.deep_clone(cloner)?)))
810 .collect()
811 }
812}
813
814impl<T: Object> Object for Option<T> {
815 fn from_primitive(p: Primitive, resolve: &impl Resolve) -> Result<Self> {
816 match p {
817 Primitive::Null => Ok(None),
818 p => match T::from_primitive(p, resolve) {
819 Ok(p) => Ok(Some(p)),
820 Err(PdfError::NullRef { .. }) => Ok(None),
822 Err(PdfError::FreeObject { .. }) => Ok(None),
823 Err(e) if resolve.options().allow_error_in_option => {
824 warn!("ignoring {:?}", e);
825 Ok(None)
826 }
827 Err(e) => Err(e),
828 },
829 }
830 }
831}
832impl<T: ObjectWrite> ObjectWrite for Option<T> {
833 fn to_primitive(&self, update: &mut impl Updater) -> Result<Primitive> {
834 match self {
835 None => Ok(Primitive::Null),
836 Some(t) => t.to_primitive(update),
837 }
838 }
839}
840impl<T: DeepClone> DeepClone for Option<T> {
841 fn deep_clone(&self, cloner: &mut impl Cloner) -> Result<Self> {
842 match self {
843 None => Ok(None),
844 Some(t) => t.deep_clone(cloner).map(Some),
845 }
846 }
847}
848
849impl<T: Trace> Trace for Option<T> {
850 fn trace(&self, cb: &mut impl FnMut(PlainRef)) {
851 if let Some(ref t) = *self {
852 t.trace(cb)
853 }
854 }
855}
856
857impl<T: Object> Object for Box<T> {
858 fn from_primitive(p: Primitive, resolve: &impl Resolve) -> Result<Self> {
859 T::from_primitive(p, resolve).map(Box::new)
860 }
861}
862impl<T: ObjectWrite> ObjectWrite for Box<T> {
863 fn to_primitive(&self, update: &mut impl Updater) -> Result<Primitive> {
864 (**self).to_primitive(update)
865 }
866}
867impl<T: Trace> Trace for Box<T> {
868 fn trace(&self, cb: &mut impl FnMut(PlainRef)) {
869 (**self).trace(cb)
870 }
871}
872
873#[derive(Debug, Clone, DataSize)]
874pub enum Either<T, U> {
875 Left(T),
876 Right(U)
877}
878impl<T, U> Object for Either<T, U>
879where
880 T: Object,
881 U: Object
882{
883 fn from_primitive(p: Primitive, resolve: &impl Resolve) -> Result<Self> {
884 match T::from_primitive(p.clone(), resolve) {
885 Ok(left) => Ok(Either::Left(left)),
886 Err(left_e) => match U::from_primitive(p, resolve) {
887 Ok(right) => Ok(Either::Right(right)),
888 Err(right_e) => Err(PdfError::Either { left_t: type_name::<T>(), left_e: left_e.into(), right_t: type_name::<U>(), right_e: right_e.into() })
889 }
890 }
891 }
892}
893impl<T, U> ObjectWrite for Either<T, U> where T: ObjectWrite, U: ObjectWrite {
894 fn to_primitive(&self, update: &mut impl Updater) -> Result<Primitive> {
895 match self {
896 Either::Left(left) => left.to_primitive(update),
897 Either::Right(right) => right.to_primitive(update)
898 }
899 }
900}
901
902impl Object for () {
903 fn from_primitive(_p: Primitive, _resolve: &impl Resolve) -> Result<Self> {
904 Ok(())
905 }
906}
907impl ObjectWrite for () {
908 fn to_primitive(&self, _: &mut impl Updater) -> Result<Primitive> {
909 Ok(Primitive::Null)
910 }
911}
912impl Trace for () {}
913
914impl<T, U> Object for (T, U)
915where
916 T: Object,
917 U: Object,
918{
919 fn from_primitive(p: Primitive, resolve: &impl Resolve) -> Result<Self> {
920 let arr = p.resolve(resolve)?.into_array()?;
921 if arr.len() != 2 {
922 bail!("expected array of length 2 (found {})", arr.len());
923 }
924 let [a, b]: [Primitive; 2] = arr.try_into().unwrap();
925 Ok((
926 T::from_primitive(a, resolve)?,
927 U::from_primitive(b, resolve)?,
928 ))
929 }
930}
931
932impl<T, U> ObjectWrite for (T, U)
933where
934 T: ObjectWrite,
935 U: ObjectWrite,
936{
937 fn to_primitive(&self, update: &mut impl Updater) -> Result<Primitive> {
938 Ok(Primitive::Array(vec![
939 self.0.to_primitive(update)?,
940 self.1.to_primitive(update)?,
941 ]))
942 }
943}
944
945impl<T: Trace, U: Trace> Trace for (T, U) {
946 fn trace(&self, cb: &mut impl FnMut(PlainRef)) {
947 self.0.trace(cb);
948 self.1.trace(cb);
949 }
950}
951
952impl<T: DeepClone> DeepClone for Box<T> {
953 fn deep_clone(&self, cloner: &mut impl Cloner) -> Result<Self> {
954 Ok(Box::new((&**self).deep_clone(cloner)?))
955 }
956}
957macro_rules! deep_clone_simple {
958 ($($t:ty),*) => (
959 $(
960 impl DeepClone for $t {
961 fn deep_clone(&self, _cloner: &mut impl Cloner) -> Result<Self> {
962 Ok(self.clone())
963 }
964 }
965 )*
966 )
967}
968deep_clone_simple!(
969 f32,
970 i32,
971 u32,
972 bool,
973 Name,
974 (),
975 Date,
976 PdfString,
977 Rectangle,
978 u8,
979 Arc<[u8]>,
980 Vec<u16>
981);
982
983impl<A: DeepClone, B: DeepClone> DeepClone for (A, B) {
984 fn deep_clone(&self, cloner: &mut impl Cloner) -> Result<Self> {
985 Ok((self.0.deep_clone(cloner)?, self.1.deep_clone(cloner)?))
986 }
987}
988
989#[derive(DataSize)]
990pub struct Merged<A, B> {
991 pub a: Option<A>,
992 pub b: Option<B>,
993}
994impl<A, B> Merged<A, B> {
995 pub fn a(a: A) -> Self {
996 Merged { a: Some(a), b: None }
997 }
998 pub fn b(b: B) -> Self {
999 Merged { a: None, b: Some(b) }
1000 }
1001 pub fn a_and_b(a: A, b: B) -> Self {
1002 Merged { a: Some(a), b: Some(b) }
1003 }
1004 pub fn none() -> Self {
1005 Merged { a: None, b: None }
1006 }
1007 pub fn merged_ref_a(a: &RcRef<A>) -> Ref<Self> {
1008 Ref { inner: a.inner, _marker: PhantomData }
1009 }
1010 pub fn merged_ref_b(b: &RcRef<B>) -> Ref<Self> {
1011 Ref { inner: b.inner, _marker: PhantomData }
1012 }
1013}
1014impl<A, B> RcRef<Merged<A, B>> {
1015 pub fn ref_a(&self) -> Option<Ref<A>> {
1016 if self.a.is_some() {
1017 Some(Ref { inner: self.inner, _marker: PhantomData })
1018 } else {
1019 None
1020 }
1021 }
1022 pub fn ref_b(&self) -> Option<Ref<B>> {
1023 if self.b.is_some() {
1024 Some(Ref { inner: self.inner, _marker: PhantomData })
1025 } else {
1026 None
1027 }
1028 }
1029}
1030
1031impl<A: FromDict, B: FromDict> FromDict for Merged<A, B> {
1032 fn from_dict(dict: Dictionary, resolve: &impl Resolve) -> Result<Self> {
1033 let a = A::from_dict(dict.clone(), resolve).ok();
1034 let b = B::from_dict(dict, resolve).ok();
1035 Ok(Merged { a, b })
1036 }
1037}
1038impl<A: FromDict + Send + Sync + 'static, B: FromDict + Send + Sync + 'static> Object
1039 for Merged<A, B>
1040{
1041 fn from_primitive(p: Primitive, resolve: &impl Resolve) -> Result<Self> {
1042 let dict = p.resolve(resolve)?.into_dictionary()?;
1043 Self::from_dict(dict, resolve)
1044 }
1045}
1046
1047impl<A: ToDict, B: ToDict> ToDict for Merged<A, B> {
1048 fn to_dict(&self, update: &mut impl Updater) -> Result<Dictionary> {
1049 let a = self
1050 .a
1051 .as_ref()
1052 .map(|a| a.to_dict(update))
1053 .transpose()?
1054 .unwrap_or_default();
1055 let b = self
1056 .b
1057 .as_ref()
1058 .map(|b| b.to_dict(update))
1059 .transpose()?
1060 .unwrap_or_default();
1061 let mut out = a;
1062 out.append(b);
1063 Ok(out)
1064 }
1065}
1066impl<A: ToDict, B: ToDict> ObjectWrite for Merged<A, B> {
1067 fn to_primitive(&self, update: &mut impl Updater) -> Result<Primitive> {
1068 self.to_dict(update).map(Primitive::Dictionary)
1069 }
1070}