pub mod guard;
pub mod pdfium;
pub mod pdfium_bindings;
pub mod pdfium_constants;
pub mod pdfium_handle;
pub mod pdfium_init;
pub mod pdfium_private;
pub mod pdfium_types;
use std::{
ffi::{CString, OsStr, OsString},
path::Path,
};
use libloading::{Library, Symbol};
use crate::{
PdfiumError, PdfiumResult,
c_api::pdfium_bindings::Pdfium,
pdfium_constants::{
FPDF_RENDERER_TYPE_FPDF_RENDERERTYPE_AGG, FPDF_RENDERER_TYPE_FPDF_RENDERERTYPE_SKIA,
},
pdfium_types::FPDF_LIBRARY_CONFIG,
};
impl Pdfium {
pub fn load() -> Result<Box<Pdfium>, PdfiumError> {
Self::load_with_filename(Self::library_filename())
}
pub fn load_from_directory<P: AsRef<Path>>(directory: P) -> Result<Box<Pdfium>, PdfiumError> {
let filename = directory.as_ref().join(Self::library_filename());
Self::load_with_filename(filename)
}
fn load_with_filename<P: AsRef<OsStr>>(filename: P) -> Result<Box<Pdfium>, PdfiumError> {
let lib = unsafe { Library::new(filename) };
let bindings = match lib {
Ok(lib) => Pdfium::new(lib),
Err(e) => Err(PdfiumError::LibraryError(e.to_string())),
};
bindings.map(Box::new)
}
fn library_filename() -> OsString {
libloading::library_filename("pdfium")
}
pub fn init(&self, use_skia: bool) {
let config = FPDF_LIBRARY_CONFIG {
version: 2,
m_pUserFontPaths: std::ptr::null_mut(), m_pIsolate: std::ptr::null_mut(), m_v8EmbedderSlot: 0, m_pPlatform: std::ptr::null_mut(),
m_RendererType: match use_skia {
true => FPDF_RENDERER_TYPE_FPDF_RENDERERTYPE_SKIA,
false => FPDF_RENDERER_TYPE_FPDF_RENDERERTYPE_AGG,
},
};
self.FPDF_InitLibraryWithConfig(&config);
}
}
pub(crate) fn dl<'a, T>(
library: &'a Library,
function: &str,
) -> Result<Symbol<'a, T>, PdfiumError> {
let function_c = CString::new(function).unwrap();
let symbol = unsafe { library.get(function_c.as_bytes_with_nul()) };
match symbol {
Ok(symbol) => Ok(symbol),
Err(e) => {
eprintln!("== Failed to get entry '{function}' from dynamic library");
let e = e.to_string().replace("\n", "");
eprintln!("== {e}");
Err(PdfiumError::LibraryError(e))
}
}
}
pub fn i32_to_bool(i: i32) -> bool {
i != 0
}
pub fn i32_to_bool_result(i: i32) -> PdfiumResult<bool> {
if i == 0 {
Ok(false)
} else if i > 0 {
Ok(true)
} else {
Err(PdfiumError::InvokationFailed)
}
}
pub fn i32_to_result(i: i32) -> PdfiumResult<i32> {
if i < 0 {
Err(PdfiumError::InvokationFailed)
} else {
Ok(i)
}
}