use std::path::Path;
use std::sync::OnceLock;
use pdfium_render::prelude::*;
mod banner;
mod borders;
mod document;
mod element;
mod error;
mod extract;
mod headings;
mod noise;
mod render;
mod render_leaf;
mod text;
mod zone;
pub use document::{ExtractConfig, ImageEmitter, PdfDocument, PdfFigure};
pub use error::PdfError;
static PDFIUM: OnceLock<Result<Pdfium, String>> = OnceLock::new();
pub(crate) fn get_pdfium() -> Result<&'static Pdfium, PdfError> {
let result = PDFIUM.get_or_init(|| {
Pdfium::bind_to_system_library()
.map(Pdfium::new)
.map_err(|e| format!("{e}"))
});
match result {
Ok(p) => Ok(p),
Err(e) => Err(PdfError::PdfiumBind(e.clone())),
}
}
pub async fn extract(input: &Path) -> Result<PdfDocument, PdfError> {
extract_with_config(input, ExtractConfig::default()).await
}
pub async fn extract_with_config(
input: &Path,
config: ExtractConfig,
) -> Result<PdfDocument, PdfError> {
let input = input.to_path_buf();
tokio::task::spawn_blocking(move || extract::extract_pdf(&input, &config))
.await
.map_err(|e| PdfError::PdfParse(format!("task join error: {e}")))?
}