Traditional document parsing pipelines are fragile heaps of heuristic bounding boxes, regex cleanups, and brittle Tesseract post-processing steps. When a table spans three columns, a receipt has skewed lighting, or an invoice places totals in non-standard margins, classical optical character recognition collapses into garbled strings. Vision Language Models (VLMs) fundamentally solve this by parsing visual documents with semantic spatial awareness.
Enter Ollama-OCR, an open-source tool designed to bridge local vision models directly into high-throughput document extraction pipelines. By routing document parsing through local inference engines via Ollama, you eliminate cloud API dependencies and vendor lock-in while converting PDFs and raw images directly into structured, downstream-ready data formats.
The Paradigm Shift: From Glyph Detection to Semantic Understanding
Traditional OCR reads pixels to map characters. Vision models ingest visual geometry and linguistic context simultaneously. This means the model understands that a bold line of text above a two-column grid is a section header, or that numbers aligned below a total label represent financial values.
Ollama-OCR abstracts the plumbing required to run these models across heterogeneous document formats. The tool ships with a unified interface for both batch Python scripts and interactive Streamlit interfaces, delivering several key architectural advantages:
- Unified Ingestion: Feed raw PDF documents or common image formats directly into the pipeline without manually orchestrating intermediate image conversions.
- Model Agnostic Backend: Swap between specialized vision checkpoints depending on your target latency, resource constraints, and document complexity.
- Targeted Extraction via Custom Prompts: Guide the model to selectively parse specific fields, such as pulling only line items, dates, or tax breakdowns.
- Schema-Aware Output: Request Markdown, pure Text, JSON schemas, Key-Value mappings, or raw Tables directly from the model output layer.
- Explicit Multilingual Conditioning: Provide language hints directly to the inference runtime to stabilize recognition on non-English documents.
- Parallel Directory Ingestion: Built-in multi-threading processes bulk file systems with native error handling and throughput metrics.
Selecting the Right Vision Model
Ollama-OCR decouples the extraction logic from the underlying model architecture. Because it operates through Ollama, you can deploy the specific model best suited for your infrastructure constraints and accuracy requirements.
| Vision Model | Core Strength | Best For |
|---|---|---|
| Llama 3.2 Vision | SOTA accuracy for complex document reasoning | Default choice for high-precision extraction and deep visual logic |
| Granite 3.2 Vision | Compact, enterprise-grade; optimized for tables, charts, plots, diagrams, and infographics | Structured technical documents, scientific papers, and financial reports |
| MiniCPM-V | Native support for arbitrary aspect ratios and resolutions up to 1.8MP (1344x1344) without tiling artifacts | High-resolution document scans, oversized receipts, and wide multi-column tables |
| LLaVA | High-efficiency, low-latency visual inference | Speed-critical workflows where slight accuracy trade-offs are acceptable |
| Moondream | Minimal compute footprint (~1.6B/2B parameters) tailored for edge devices | Constrained environments, on-device setups, and offline mobile deployments |
Output Structuring: Bypassing Downstream Cleanups
Extracting unstructured text strings creates technical debt for downstream data layers. Ollama-OCR handles transformation at the generation layer:
- Markdown: Retains structural headers, bullet hierarchies, and code blocks, making it an optimal ingestion format for Retrieval-Augmented Generation (RAG) indexing.
- JSON / Structured: Emits structured objects for programmatic ingestion into APIs or databases.
- Key-Value Pairs: Extracts key-value mappings suitable for identity documents, utility bills, and standardized invoices.
- Table Format: Isolate and extract tabular grids straight into Markdown or CSV-ready structures.
- Text: Strips all markup noise for raw semantic text dumps.
Implementing the Python SDK
Before running inference, pull your target vision models locally via the Ollama CLI:
bashollama pull llama3.2-vision:11b ollama pull granite3.2-vision ollama pull moondream ollama pull minicpm-v
Install the library:
bashpip install ollama-ocr
1. Single Document Inference
For point-to-point workflows, initialize the processor and execute a synchronous pass. You can point the client to local or remote endpoints, such as containerized instances.
pythonfrom ollama_ocr import OCRProcessor # Initialize the processor with your target endpoint ocr = OCRProcessor( model_name='llama3.2-vision:11b', base_url="http://host.docker.internal:11434/api/generate" ) # Run inference over an image or PDF result = ocr.process_image( image_path="path/to/your/image.png", format_type="markdown", custom_prompt="Extract all text, focusing on dates and names.", language="English" ) print(result)
2. High-Throughput Batch Processing
When working with bulk directories, the SDK uses an internal ThreadPoolExecutor to handle concurrent inference runs. It includes built-in preprocessing flags to run image deskewing and denoising routines prior to VLM ingestion.
pythonfrom ollama_ocr import OCRProcessor # Configure parallel workers based on available compute and memory limits ocr = OCRProcessor( model_name='llama3.2-vision:11b', max_workers=4 ) # Recursively traverse and process files batch_results = ocr.process_batch( input_path="path/to/images/folder", format_type="markdown", recursive=True, preprocess=True, custom_prompt="Extract all text, focusing on dates and names.", language="English" ) # Access extracted payloads for file_path, text in batch_results['results'].items(): print(f"\nFile: {file_path}") print(f"Extracted Text: {text}") # Monitor batch health metrics print("\nProcessing Statistics:") print(f"Total images: {batch_results['statistics']['total']}") print(f"Successfully processed: {batch_results['statistics']['successful']}") print(f"Failed: {batch_results['statistics']['failed']}")
Interactive Web UI via Streamlit
If you need an interface for testing prompts, visual evaluations, or non-technical operators, Ollama-OCR contains a native Streamlit implementation with file drag-and-drop, dynamic streaming, and batch downloads.
bash# Clone the repository git clone https://github.com/imanoop7/Ollama-OCR.git cd Ollama-OCR # Install dependencies pip install -r requirements.txt # Start the Streamlit application cd src/ollama_ocr streamlit run app.py
Agentic Integration and Ecosystem
Because it is licensed under the permissive MIT license, Ollama-OCR fits cleanly into enterprise architectures without licensing roadblocks. The project repository provides ready-to-run Google Colab environments for rapid experimentation along with documented integration patterns for AutoGen and LangGraph. This allows developers to embed local, vision-driven document ingestion directly into agentic workflows and advanced RAG architectures without routing sensitive document streams through third-party cloud infrastructure.
Source Code & Documentation:
https://github.com/imanoop7/Ollama-OCR
