2026-05-21 13:50:57 +02:00
use std ::error ::Error ;
2025-05-03 12:20:22 +02:00
use std ::sync ::Mutex ;
2026-07-09 20:58:27 +02:00
use once_cell ::sync ::{ Lazy , OnceCell };
2025-05-03 12:20:22 +02:00
use pdfium_render ::prelude ::Pdfium ;
2026-07-05 18:32:36 +02:00
use log ::{ error , info , warn };
2025-05-03 12:20:22 +02:00
pub static PDFIUM_LIB_PATH : Lazy < Mutex < Option < String >>> = Lazy ::new ( || Mutex ::new ( None ));
2026-07-09 20:58:27 +02:00
static PDFIUM : OnceCell < Pdfium > = OnceCell ::new ();
2025-05-03 12:20:22 +02:00
pub trait PdfiumInit {
2026-07-09 20:58:27 +02:00
fn ai_studio_init () -> Result <& 'static Pdfium , Box < dyn Error + Send + Sync >> ;
2025-05-03 12:20:22 +02:00
}
impl PdfiumInit for Pdfium {
/// Initializes the PDFium library for AI Studio.
2026-07-09 20:58:27 +02:00
fn ai_studio_init () -> Result <& 'static Pdfium , Box < dyn Error + Send + Sync >> {
PDFIUM . get_or_try_init ( || load_pdfium (). map_err ( | error | {
2026-05-21 13:50:57 +02:00
Box ::new ( std ::io ::Error ::other ( error )) as Box < dyn Error + Send + Sync >
2026-07-09 20:58:27 +02:00
}))
2026-05-21 13:50:57 +02:00
}
}
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 18:32:36 +02: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 13:50:57 +02:00
Err ( library_error ) => {
match Pdfium ::bind_to_system_library () {
2026-07-05 18:32:36 +02: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 13:50:57 +02: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 19:51:12 +01:00
}
}
}
2025-05-03 12:20:22 +02:00
}
2026-05-21 13:50:57 +02:00
}
2025-05-03 12:20:22 +02:00
2026-05-21 13:50:57 +02: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 18:32:36 +02:00
Ok ( binding ) => {
info! ( "Loaded PDFium from the system library." );
Ok ( Pdfium ::new ( binding ))
},
2026-05-21 13:50:57 +02: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 19:51:12 +01:00
2026-05-21 13:50:57 +02:00
error! ( "{error_message}" );
Err ( error_message )
2026-02-01 19:51:12 +01:00
}
2025-05-03 12:20:22 +02:00
}
2026-07-09 20:58:27 +02:00
}