use df_ocr_switcher::{
DocPipeline, OcrModelPaths, OutputFormat,
PpOcrEngine, PpOcrEngineConfig, TableModelPaths,
};
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: with_tables <input_file>");
std::process::exit(1);
});
let base = PathBuf::from(
std::env::var("PPOCR_MODELS_DIR").unwrap_or_else(|_| "models/paddleocr".into())
);
let layout_model = base.join("layout/PP-DocLayoutV3.onnx");
let ocr_models = {
let latin = base.join("latin");
OcrModelPaths {
det: latin.join("det.onnx"),
rec: latin.join("rec_latin.onnx"),
dict: latin.join("dict_latin.txt"),
}
};
let table_models = {
let tbl = base.join("table");
let onnx = tbl.join("SLANet_plus.onnx");
let dict = tbl.join("table_structure_dict.txt");
if onnx.exists() && dict.exists() {
Some(TableModelPaths { structure_onnx: onnx, structure_dict: dict, input_size: Some(488) })
} else {
eprintln!("[warn] SLANet_plus.onnx not found — table recognition disabled");
None
}
};
let enable_tables = table_models.is_some();
let engine = PpOcrEngine::new(PpOcrEngineConfig {
ocr_models: Some(ocr_models),
table_models,
enable_tables,
..PpOcrEngineConfig::default()
})?;
let mut pipeline = DocPipeline::new(Box::new(engine), &layout_model)?;
let md = pipeline.process_file(&input, OutputFormat::Markdown)?;
print!("{md}");
Ok(())
}