use crate::destination::NamedDestination;
use crate::error::KrillaResult;
use crate::interchange::embed::EmbeddedFile;
use crate::interchange::metadata::Metadata;
use crate::interchange::outline::Outline;
use crate::interchange::tagging::TagTree;
use crate::page::{Page, PageSettings};
#[cfg(feature = "pdf")]
use crate::pdf::PdfDocument;
use crate::serialize::{SerializeContext, SerializeSettings};
use crate::surface::Location;
pub struct Document {
pub(crate) serializer_context: SerializeContext,
}
impl Default for Document {
fn default() -> Self {
Self::new()
}
}
impl Document {
pub fn new() -> Self {
Self {
serializer_context: SerializeContext::new(SerializeSettings::default()),
}
}
pub fn new_with(serialize_settings: SerializeSettings) -> Self {
Self {
serializer_context: SerializeContext::new(serialize_settings),
}
}
pub fn start_page(&mut self) -> Page<'_> {
let page_index = self.serializer_context.page_infos().iter().len();
Page::new(
&mut self.serializer_context,
page_index,
PageSettings::default(),
)
}
pub fn start_page_with(&mut self, page_settings: PageSettings) -> Page<'_> {
let page_index = self.serializer_context.page_infos().iter().len();
Page::new(&mut self.serializer_context, page_index, page_settings)
}
#[cfg(feature = "pdf")]
pub fn embed_pdf_pages(&mut self, pdf: &PdfDocument, page_indices: &[usize]) {
self.serializer_context.embed_pdf_pages(pdf, page_indices);
}
pub fn set_location(&mut self, location: Location) {
self.serializer_context.set_location(location);
}
pub fn reset_location(&mut self) {
self.serializer_context.reset_location();
}
pub fn set_outline(&mut self, outline: Outline) {
self.serializer_context.set_outline(outline);
}
pub fn set_metadata(&mut self, metadata: Metadata) {
self.serializer_context.set_metadata(metadata);
}
pub fn set_tag_tree(&mut self, tag_tree: TagTree) {
self.serializer_context.set_tag_tree(tag_tree);
}
pub fn embed_file(&mut self, file: EmbeddedFile) -> Option<()> {
self.serializer_context.embed_file(file)
}
pub fn register_named_destination(&mut self, dest: NamedDestination) {
self.serializer_context.register_named_destination(dest);
}
pub fn finish(mut self) -> KrillaResult<Vec<u8>> {
if self.serializer_context.page_infos().is_empty() {
self.start_page();
}
Ok(self.serializer_context.finish()?.finish())
}
}