use df_ocr_switcher::{DocPipeline, OcrModelPaths, OutputFormat, PpOcrEngine, PpOcrEngineConfig};
use std::path::PathBuf;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let input: PathBuf = std::env::args().nth(1)
.or_else(|| std::env::var("OCR_INPUT").ok())
.map(PathBuf::from)
.unwrap_or_else(|| {
eprintln!("Usage: basic_ocr <input_file>");
eprintln!(" OCR_INPUT=path/to/doc.tiff cargo run --example basic_ocr");
std::process::exit(1);
});
let layout_model = layout_model_path();
let ocr_models = ocr_model_paths();
let engine = PpOcrEngine::new(PpOcrEngineConfig {
ocr_models,
..PpOcrEngineConfig::default()
})?;
let mut pipeline = DocPipeline::new(Box::new(engine), &layout_model)?;
eprintln!("Processing: {}", input.display());
let markdown = pipeline.process_file(&input, OutputFormat::Markdown)?;
print!("{markdown}");
Ok(())
}
fn layout_model_path() -> PathBuf {
if let Ok(p) = std::env::var("PPOCR_LAYOUT_MODEL") {
return PathBuf::from(p);
}
let base = std::env::var("PPOCR_MODELS_DIR")
.unwrap_or_else(|_| "models/paddleocr".into());
PathBuf::from(base).join("layout/PP-DocLayoutV3.onnx")
}
fn ocr_model_paths() -> Option<OcrModelPaths> {
let base = std::env::var("PPOCR_MODELS_DIR").ok()?;
let latin = PathBuf::from(base).join("latin");
let det = latin.join("det.onnx");
let rec = latin.join("rec_latin.onnx");
let dict = latin.join("dict_latin.txt");
if det.exists() && rec.exists() && dict.exists() {
Some(OcrModelPaths { det, rec, dict })
} else {
None }
}