2026-05-21 11:50:57 +00:00
use std ::error ::Error ;
2025-05-03 10:20:22 +00:00
use std ::sync ::Mutex ;
use once_cell ::sync ::Lazy ;
use pdfium_render ::prelude ::Pdfium ;
2026-07-05 16:32:36 +00:00
use log ::{ error , info , warn } ;
2025-05-03 10:20:22 +00:00
pub static PDFIUM_LIB_PATH : Lazy < Mutex < Option < String > > > = Lazy ::new ( | | Mutex ::new ( None ) ) ;
2026-05-21 11:50:57 +00:00
static PDFIUM : Lazy < Mutex < Option < Pdfium > > > = Lazy ::new ( | | Mutex ::new ( None ) ) ;
2025-05-03 10:20:22 +00:00
pub trait PdfiumInit {
2026-05-21 11:50:57 +00:00
fn ai_studio_init ( ) -> Result < Pdfium , Box < dyn Error + Send + Sync > > ;
2025-05-03 10:20:22 +00:00
}
impl PdfiumInit for Pdfium {
/// Initializes the PDFium library for AI Studio.
2026-05-21 11:50:57 +00:00
fn ai_studio_init ( ) -> Result < Pdfium , Box < dyn Error + Send + Sync > > {
let mut pdfium = PDFIUM . lock ( ) . unwrap ( ) ;
if let Some ( pdfium ) = pdfium . as_ref ( ) {
return Ok ( pdfium . clone ( ) ) ;
}
let loaded_pdfium = load_pdfium ( ) . map_err ( | error | {
Box ::new ( std ::io ::Error ::other ( error ) ) as Box < dyn Error + Send + Sync >
} ) ? ;
* pdfium = Some ( loaded_pdfium . clone ( ) ) ;
Ok ( loaded_pdfium )
}
}
fn load_pdfium ( ) -> Result < Pdfium , String > {
let lib_path = PDFIUM_LIB_PATH . lock ( ) . unwrap ( ) . clone ( ) ;
if let Some ( path ) = lib_path . as_ref ( ) {
2026-07-05 16:32:36 +00:00
let pdfium_library_path = Pdfium ::pdfium_platform_library_name_at_path ( path ) ;
return match Pdfium ::bind_to_library ( & pdfium_library_path ) {
Ok ( binding ) = > {
info! ( " Loaded PDFium from '{path}'. " , path = pdfium_library_path . to_string_lossy ( ) ) ;
Ok ( Pdfium ::new ( binding ) )
} ,
2026-05-21 11:50:57 +00:00
Err ( library_error ) = > {
match Pdfium ::bind_to_system_library ( ) {
2026-07-05 16:32:36 +00:00
Ok ( binding ) = > {
info! (
" Loaded PDFium from the system library after failing to load '{path}'. " ,
path = pdfium_library_path . to_string_lossy ( ) ,
) ;
Ok ( Pdfium ::new ( binding ) )
} ,
2026-05-21 11:50:57 +00:00
Err ( system_error ) = > {
let error_message = format! (
" Failed to load PDFium from '{path}' and the system library. Developer action (from repo root): run the build script once to download the required PDFium version: `cd app/Build` and `dotnet run build`. Details: library error: '{library_error}'; system error: '{system_error}'. "
) ;
error! ( " {error_message} " ) ;
Err ( error_message )
2026-02-01 18:51:12 +00:00
}
}
}
2025-05-03 10:20:22 +00:00
}
2026-05-21 11:50:57 +00:00
}
2025-05-03 10:20:22 +00:00
2026-05-21 11:50:57 +00:00
warn! ( " No custom PDFium library path set; trying to load PDFium from the system library. " ) ;
match Pdfium ::bind_to_system_library ( ) {
2026-07-05 16:32:36 +00:00
Ok ( binding ) = > {
info! ( " Loaded PDFium from the system library. " ) ;
Ok ( Pdfium ::new ( binding ) )
} ,
2026-05-21 11:50:57 +00:00
Err ( system_error ) = > {
let error_message = format! (
" Failed to load PDFium from the system library. Developer action (from repo root): run the build script once to download the required PDFium version: `cd app/Build` and `dotnet run build`. Details: '{system_error}'. "
) ;
2026-02-01 18:51:12 +00:00
2026-05-21 11:50:57 +00:00
error! ( " {error_message} " ) ;
Err ( error_message )
2026-02-01 18:51:12 +00:00
}
2025-05-03 10:20:22 +00:00
}
2026-05-21 11:50:57 +00:00
}