///|
fn pdf_draw_double_trailing_new_page(
drawops : ArrayView[PdfDrawOp],
) -> Array[PdfDrawOp] {
let output = [ for op in drawops => op ]
if output.length() > 0 && output[output.length() - 1] == PdfDrawNewPage {
output.push(PdfDrawNewPage)
}
output
}
///|
fn pdf_draw_split_on_new_page(
drawops : ArrayView[PdfDrawOp],
) -> Array[Array[PdfDrawOp]] {
let chunks : Array[Array[PdfDrawOp]] = [[]]
for op in drawops {
if op == PdfDrawNewPage {
chunks.push([])
} else {
chunks[chunks.length() - 1].push(op)
}
}
if chunks.length() > 1 && chunks[chunks.length() - 1].length() == 0 {
ignore(chunks.pop())
}
chunks
}
///|
fn PdfDocument::pdf_draw_has_fresh_structure_tree(self : PdfDocument) -> Bool {
match
self.lookup_chain(self.trailer_dict(), [
pdf_structure_root_key(),
pdf_draw_struct_tree_root_key(),
]) {
Some(PdfDictionary([(key, PdfNameObject(value))])) =>
key == pdf_draw_type_key() && value == pdf_draw_struct_tree_root_key()
_ => false
}
}
///|
fn PdfDocument::pdf_draw_apply_chunk(
self : PdfDocument,
state : PdfDrawRenderState,
page_numbers : ArrayView[Int],
drawops : ArrayView[PdfDrawOp],
struct_tree : Bool,
fast : Bool,
underneath : Bool,
filename : String,
bates : Int,
bates_pad : Int?,
time : @date.PdfStrftimeTime?,
add_artifacts : Bool,
) -> PdfDocument raise @core.PdfError {
state.set_structure_tree_enabled(struct_tree)
let selected_pages = @core.pdf_number_set(page_numbers)
state.set_minimum_resource_number(
self.pdf_draw_minimum_resource_number(selected_pages),
)
let per_page = self.pdf_draw_render_page_ops(
state, selected_pages, drawops, filename, bates, bates_pad, time,
)
let draw_resources = state.resources()
let pages = self.pages_of_pagetree()
let rewritten : Array[@page.PdfPage] = Array(capacity=pages.length())
for index in 0.. (PdfDocument, Array[Int]) raise @core.PdfError {
let end_page = document.endpage()
match page_numbers {
[page_number] if end_page > page_number => (document, [page_number + 1])
_ => (document.pad_after([end_page]), [end_page + 1])
}
}