use crate::grep::error::{GrepError, GrepResult};
pub fn extract_text_ocr(data: &[u8], language: &str) -> GrepResult<String> {
use leptess::LepTess;
let _ = (data, language);
match LepTess::new(None, language) {
Ok(_) => {
Err(GrepError::OcrError {
file_path: std::path::PathBuf::from("<memory>"),
message: format!(
"PDF OCR requires PDF-to-image rendering. \
Consider converting to images first, or use the pdf feature for text-based PDFs. \
Language '{}' is available in Tesseract.",
language
),
})
}
Err(e) => Err(GrepError::OcrNotAvailable(format!(
"Tesseract initialization failed for language '{}': {}. \
Ensure Tesseract is installed and the language pack is available.",
language, e
))),
}
}
pub fn is_ocr_available(language: &str) -> bool {
use leptess::LepTess;
LepTess::new(None, language).is_ok()
}
pub fn available_languages() -> Vec<String> {
let common_languages = [
"eng", "deu", "fra", "spa", "ita", "por", "nld", "pol", "rus", "chi_sim", "chi_tra", "jpn",
"kor", "ara", "hin", "tha", "vie",
];
common_languages
.iter()
.filter(|lang| is_ocr_available(lang))
.map(|s| s.to_string())
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_ocr_availability_check() {
let _ = is_ocr_available("eng");
}
#[test]
fn test_available_languages() {
let langs = available_languages();
println!("Available OCR languages: {:?}", langs);
}
#[test]
fn test_extract_text_ocr_error() {
let fake_pdf = b"%PDF-1.4 fake pdf data";
let result = extract_text_ocr(fake_pdf, "eng");
assert!(result.is_err());
}
}