use crate::types::PageContent;
pub(crate) fn assign_tables_and_images_to_pages(
mut page_contents: Option<Vec<PageContent>>,
tables: &[crate::types::Table],
images: &[crate::types::ExtractedImage],
) -> Option<Vec<PageContent>> {
let pages = page_contents.take()?;
let mut updated_pages = pages;
for table in tables {
if let Some(page) = updated_pages.iter_mut().find(|p| p.page_number == table.page_number) {
page.tables.push(std::sync::Arc::new(table.clone()));
}
}
for image in images {
if let Some(page_num) = image.page_number
&& let Some(page) = updated_pages.iter_mut().find(|p| p.page_number == page_num)
{
page.images.push(std::sync::Arc::new(image.clone()));
}
}
for page in &mut updated_pages {
if !page.tables.is_empty() || !page.images.is_empty() {
page.is_blank = Some(false);
}
}
Some(updated_pages)
}
#[cfg(feature = "layout-detection")]
pub(crate) fn assign_layout_regions_to_pages(
page_contents: &mut Option<Vec<PageContent>>,
layout_results: &[crate::pdf::layout_runner::PageLayoutResult],
) {
let Some(pages) = page_contents.as_mut() else {
return;
};
for result in layout_results {
let page_number = result.page_index + 1; if let Some(page) = pages.iter_mut().find(|p| p.page_number == page_number) {
let page_area = f64::from(result.page_width_pts) * f64::from(result.page_height_pts);
let regions: Vec<crate::types::LayoutRegion> = result
.regions
.iter()
.map(|r| {
let region_area = f64::from(r.bbox.width()) * f64::from(r.bbox.height());
let area_fraction = if page_area > 0.0 { region_area / page_area } else { 0.0 };
crate::types::LayoutRegion {
class: r.class.name().to_string(),
confidence: f64::from(r.confidence),
bounding_box: crate::types::BoundingBox {
x0: f64::from(r.bbox.left),
y0: f64::from(r.bbox.bottom),
x1: f64::from(r.bbox.right),
y1: f64::from(r.bbox.top),
},
area_fraction,
}
})
.collect();
if !regions.is_empty() {
page.layout_regions = Some(regions);
}
}
}
}