use crate::chunk_container::ChunkContainer;
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,
pub(crate) chunk_container: ChunkContainer,
}
impl Default for Document {
fn default() -> Self {
Self::new()
}
}
impl Document {
pub fn new() -> Self {
let serializer_context = SerializeContext::new(SerializeSettings::default());
let chunk_container = ChunkContainer::new(&serializer_context);
Self {
serializer_context,
chunk_container,
}
}
pub fn new_with(serialize_settings: SerializeSettings) -> Self {
let serializer_context = SerializeContext::new(serialize_settings);
let chunk_container = ChunkContainer::new(&serializer_context);
Self {
serializer_context,
chunk_container,
}
}
pub fn start_page(&mut self) -> Page<'_> {
let page_index = self.serializer_context.page_infos().iter().len();
Page::new(
&mut self.serializer_context,
&mut self.chunk_container,
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,
&mut self.chunk_container,
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.chunk_container.metadata = Some(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(&mut self.chunk_container, file)
}
#[must_use]
pub fn register_named_destination(&mut self, dest: NamedDestination) -> Option<()> {
self.serializer_context
.register_named_destination(dest)
.map(|_| ())
}
pub fn finish(mut self) -> KrillaResult<Vec<u8>> {
if self.serializer_context.page_infos().is_empty() {
self.start_page();
}
let Self {
serializer_context,
chunk_container,
} = self;
Ok(serializer_context.finish(chunk_container)?.finish())
}
}