use crate::{PdfiumRect, error::PdfiumResult, lib, page::PdfiumPage, pdfium_types::FS_RECTF};
pub struct PdfiumPageBoundaries<'a> {
page: &'a PdfiumPage,
}
impl<'a> PdfiumPageBoundaries<'a> {
pub(crate) fn new(page: &'a PdfiumPage) -> PdfiumPageBoundaries<'a> {
Self { page }
}
#[inline]
pub fn art(&self) -> PdfiumResult<PdfiumRect> {
let mut rect = PdfiumRect::zero();
lib().FPDFPage_GetArtBox(
self.page,
&mut rect.left,
&mut rect.bottom,
&mut rect.right,
&mut rect.top,
)?;
Ok(rect)
}
#[inline]
pub fn bleed(&self) -> PdfiumResult<PdfiumRect> {
let mut rect = PdfiumRect::zero();
lib().FPDFPage_GetBleedBox(
self.page,
&mut rect.left,
&mut rect.bottom,
&mut rect.right,
&mut rect.top,
)?;
Ok(rect)
}
#[inline]
pub fn crop(&self) -> PdfiumResult<PdfiumRect> {
let mut rect = PdfiumRect::zero();
lib().FPDFPage_GetCropBox(
self.page,
&mut rect.left,
&mut rect.bottom,
&mut rect.right,
&mut rect.top,
)?;
Ok(rect)
}
#[inline]
pub fn media(&self) -> PdfiumResult<PdfiumRect> {
let mut rect = PdfiumRect::zero();
lib().FPDFPage_GetMediaBox(
self.page,
&mut rect.left,
&mut rect.bottom,
&mut rect.right,
&mut rect.top,
)?;
Ok(rect)
}
#[inline]
pub fn trim(&self) -> PdfiumResult<PdfiumRect> {
let mut rect = PdfiumRect::zero();
lib().FPDFPage_GetTrimBox(
self.page,
&mut rect.left,
&mut rect.bottom,
&mut rect.right,
&mut rect.top,
)?;
Ok(rect)
}
pub fn bounding_box(&self) -> PdfiumResult<PdfiumRect> {
let mut rect = FS_RECTF {
left: 0.0,
top: 0.0,
right: 0.0,
bottom: 0.0,
};
lib().FPDF_GetPageBoundingBox(self.page, &mut rect)?;
Ok(rect.into())
}
pub fn default(&self) -> PdfiumResult<PdfiumRect> {
self.crop()
.or_else(|_| self.trim())
.or_else(|_| self.media())
}
}
#[cfg(test)]
mod tests {
use crate::document::PdfiumDocument;
#[test]
fn test_media_boundary() {
let document = PdfiumDocument::new_from_path("resources/groningen.pdf", None).unwrap();
let page = document.page(0).unwrap();
let boundary = page.boundaries().media().unwrap();
assert_eq!(boundary.left, 0.0);
assert_eq!(boundary.top, 841.92);
assert_eq!(boundary.bottom, 0.0);
assert_eq!(boundary.right, 594.95996);
}
#[test]
fn test_default_boundary() {
let document = PdfiumDocument::new_from_path("resources/groningen.pdf", None).unwrap();
let page = document.page(0).unwrap();
let boundary = page.boundaries().default().unwrap();
assert_eq!(boundary.left, 0.0);
assert_eq!(boundary.top, 841.92);
assert_eq!(boundary.bottom, 0.0);
assert_eq!(boundary.right, 594.95996);
}
}