use crate::{
error::PdfResult,
file_specification::{FileIdentifier, FileSpecification},
objects::{Dictionary, Object},
Resolve,
};
#[derive(Debug)]
pub struct ReferenceXObject {
f: FileSpecification,
page: PageIdentifier,
id: Option<FileIdentifier>,
}
#[derive(Debug)]
enum PageIdentifier {
Index(usize),
Label(String),
}
impl PageIdentifier {
pub fn from_obj(obj: Object, resolver: &mut dyn Resolve) -> PdfResult<Self> {
Ok(if let Ok(name) = resolver.assert_string(obj.clone()) {
PageIdentifier::Label(name)
} else {
let idx = resolver.assert_unsigned_integer(obj)?;
PageIdentifier::Index(idx as usize)
})
}
}
impl ReferenceXObject {
pub fn from_dict(mut dict: Dictionary, resolver: &mut dyn Resolve) -> PdfResult<Self> {
let f = FileSpecification::from_obj(dict.expect_object("F", resolver)?, resolver)?;
let page = PageIdentifier::from_obj(dict.expect_object("Page", resolver)?, resolver)?;
let id = dict
.get_arr("ID", resolver)?
.map(|objs| FileIdentifier::from_arr(objs, resolver))
.transpose()?;
Ok(Self { f, page, id })
}
}