///|
fn pdf_content_page_contains(
page_numbers : ArrayView[Int],
page_number : Int,
) -> Bool {
for selected in page_numbers {
if selected == page_number {
break true
}
} nobreak {
false
}
}
///|
fn pdf_content_page_number_json(page_number : Int) -> Json {
Json::number(page_number.to_double(), repr=page_number.to_string())
}
///|
/// Collect recursive cpdfcontent JSON entries for one page.
pub fn PdfDocument::content_entries_of_page(
self : PdfDocument,
page : PdfPage,
) -> Array[PdfContentJsonEntry] raise PdfError {
let mediabox = self.parse_rectangle(page.mediabox)
let ops = self.parse_content_ops_with_resources(page.resources, page.content)
self.content_entries_of_ops_recursive(mediabox, page.resources, ops)
}
///|
/// Compatibility wrapper for `PdfDocument::content_entries_of_page`.
pub fn pdf_content_entries_of_page(
document : PdfDocument,
page : PdfPage,
) -> Array[PdfContentJsonEntry] raise PdfError {
document.content_entries_of_page(page)
}
///|
/// Serialize recursive cpdfcontent entries for one already-parsed operator list.
pub fn PdfDocument::content_json_of_ops(
self : PdfDocument,
mediabox : PdfRectangle,
resources : PdfObject,
ops : ArrayView[PdfContentOp],
) -> Json raise PdfError {
pdf_content_json_entries_content_json(
self.content_entries_of_ops_recursive(mediabox, resources, ops),
)
}
///|
/// Compatibility wrapper for `PdfDocument::content_json_of_ops`.
pub fn pdf_content_json_of_ops(
document : PdfDocument,
mediabox : PdfRectangle,
resources : PdfObject,
ops : ArrayView[PdfContentOp],
) -> Json raise PdfError {
document.content_json_of_ops(mediabox, resources, ops)
}
///|
/// Walk content entries, call `predicate` for each one, and return the original ops.
pub fn PdfDocument::content_filter(
self : PdfDocument,
mediabox : PdfRectangle,
resources : PdfObject,
ops : ArrayView[PdfContentOp],
predicate : (PdfContentJsonEntry) -> Bool,
) -> Array[PdfContentOp] raise PdfError {
let entries = self.content_entries_of_ops_recursive(mediabox, resources, ops)
for entry in entries {
ignore(predicate(entry))
}
[
for op in ops => op
]
}
///|
/// Compatibility wrapper for `PdfDocument::content_filter`.
pub fn pdf_content_filter(
document : PdfDocument,
predicate : (PdfContentJsonEntry) -> Bool,
mediabox : PdfRectangle,
resources : PdfObject,
ops : ArrayView[PdfContentOp],
) -> Array[PdfContentOp] raise PdfError {
document.content_filter(mediabox, resources, ops, predicate)
}
///|
fn pdf_content_push_extracted_text(
output : Array[Byte],
entry : PdfContentJsonEntry,
) -> Unit {
match entry.object {
PdfContentGlyphObject(_, _, extracted_text) =>
pdf_content_push_view(output, @utf8.encode(extracted_text))
_ => ()
}
}
///|
/// Return cpdf's simple test text extraction bytes for selected 1-based pages.
pub fn PdfDocument::test_extract_text(
self : PdfDocument,
page_numbers : ArrayView[Int],
) -> PdfBytes raise PdfError {
let pages = self.pages_of_pagetree()
pdf_page_box_validate_page_numbers(
page_numbers,
pages.length(),
"test_extract_text",
)
let output : Array[Byte] = []
for index in 0.. PdfBytes raise PdfError {
document.test_extract_text(page_numbers)
}
///|
/// Serialize recursive cpdfcontent entries for one page.
pub fn PdfDocument::content_json_of_page(
self : PdfDocument,
page : PdfPage,
) -> Json raise PdfError {
pdf_content_json_entries_content_json(self.content_entries_of_page(page))
}
///|
/// Compatibility wrapper for `PdfDocument::content_json_of_page`.
pub fn pdf_content_json_of_page(
document : PdfDocument,
page : PdfPage,
) -> Json raise PdfError {
document.content_json_of_page(page)
}
///|
/// Return cpdf's page-content JSON array for selected 1-based page numbers.
pub fn PdfDocument::page_content_json(
self : PdfDocument,
page_numbers : ArrayView[Int],
) -> Json raise PdfError {
let pages = self.pages_of_pagetree()
pdf_page_box_validate_page_numbers(
page_numbers,
pages.length(),
"page_content_json",
)
let output : Array[Json] = []
for index in 0.. Json raise PdfError {
document.page_content_json(page_numbers)
}