use zpdf_core::{PdfDict, PdfObject};
use zpdf_parser::PdfFile;
use crate::forms::pdf_string_to_unicode;
pub(crate) fn catalog_dict(file: &PdfFile) -> Option<PdfDict> {
let root_ref = file.trailer.get_ref("Root").ok()?;
file.resolve(root_ref).ok()?.as_dict().ok().cloned()
}
pub(crate) fn resolve_dict(file: &PdfFile, obj: Option<&PdfObject>) -> Option<PdfDict> {
match obj? {
PdfObject::Dict(d) => Some(d.clone()),
PdfObject::Stream(s) => Some(s.dict.clone()),
PdfObject::Ref(r) => match file.resolve(*r).ok()? {
PdfObject::Dict(d) => Some(d),
PdfObject::Stream(s) => Some(s.dict),
_ => None,
},
_ => None,
}
}
pub(crate) fn resolve_array(file: &PdfFile, obj: Option<&PdfObject>) -> Option<Vec<PdfObject>> {
match obj? {
PdfObject::Array(a) => Some(a.clone()),
PdfObject::Ref(r) => match file.resolve(*r).ok()? {
PdfObject::Array(a) => Some(a),
_ => None,
},
_ => None,
}
}
pub(crate) fn text(file: &PdfFile, dict: &PdfDict, key: &str) -> Option<String> {
let value = match dict.get(key)? {
PdfObject::String(s) => return Some(pdf_string_to_unicode(s.as_bytes())),
PdfObject::Ref(r) => file.resolve(*r).ok()?,
_ => return None,
};
match value {
PdfObject::String(s) => Some(pdf_string_to_unicode(s.as_bytes())),
_ => None,
}
}
pub(crate) fn name_value(file: &PdfFile, dict: &PdfDict, key: &str) -> Option<String> {
resolve_name(file, dict.get(key))
}
pub(crate) fn resolve_name(file: &PdfFile, obj: Option<&PdfObject>) -> Option<String> {
match obj? {
PdfObject::Name(n) => Some(n.as_str().to_string()),
PdfObject::Ref(r) => match file.resolve(*r).ok()? {
PdfObject::Name(n) => Some(n.as_str().to_string()),
_ => None,
},
_ => None,
}
}
pub(crate) fn resolve_number(file: &PdfFile, obj: Option<&PdfObject>) -> Option<f32> {
let value = match obj? {
PdfObject::Integer(n) => return Some(*n as f32),
PdfObject::Real(r) if r.is_finite() => return Some(*r as f32),
PdfObject::Ref(r) => file.resolve(*r).ok()?,
_ => return None,
};
match value {
PdfObject::Integer(n) => Some(n as f32),
PdfObject::Real(r) if r.is_finite() => Some(r as f32),
_ => None,
}
}