Webapp per convertire PDF e immagini in Markdown pulito usando modelli OCR e Vision tramite Ollama.
- Multi-formato: Supporta PDF, PNG, JPG, JPEG, TIFF, BMP, WEBP
- Strategie multiple: Scegli tra Auto o Vision
- Streaming OCR: Risultati in tempo reale mentre il modello elabora
- Vista affiancata: Documento originale a sinistra, Markdown a destra
- Navigazione pagine: Thumbnail per navigare tra le pagine
- Caching: Risultati salvati su disco per non rielaborare
- Download: Esporta tutto il documento in un file
.md
| Strategia | Descrizione | Quando usarla |
|---|---|---|
| Auto (default) | Usa LightOnOCR per massima qualita | Massima qualita senza pensarci |
| Vision | Usa direttamente il modello vision sull'immagine | Veloce, una sola chiamata |
- Python 3.10+
- Ollama installato e in esecuzione
- Modello LightOnOCR (per strategia Auto):
ollama pull Maternion/LightOnOCR-2:latest
- Modello Vision (per strategia Vision):
ollama pull qwen3.5:397b-cloud
# Clona il repository
git clone <repo-url>
cd pdf-to-md-converter
# Crea ambiente virtuale (opzionale ma consigliato)
python -m venv venv
# Attiva l'ambiente virtuale
# Windows:
venv\Scripts\activate
# Linux/macOS:
source venv/bin/activate
# Installa le dipendenze
pip install -r requirements.txt-
Avvia Ollama (se non e gia in esecuzione):
ollama serve
-
Avvia il server web:
python pd-to-md.py
-
Apri il browser:
http://localhost:8000
Variabili d'ambiente opzionali:
| Variabile | Default | Descrizione |
|---|---|---|
OLLAMA_URL |
http://localhost:11434 |
URL del server Ollama |
VISION_MODEL |
qwen3.5:397b-cloud |
Modello Vision |
COMPLEX_MODEL |
Maternion/LightOnOCR-2:latest |
Modello Auto (LightOnOCR) |
RENDER_DPI |
150 |
DPI per rendering PDF |
Esempio:
export VISION_MODEL=llava:latest
export RENDER_DPI=200
python pd-to-md.py| Metodo | Endpoint | Descrizione |
|---|---|---|
POST |
/api/upload |
Carica PDF/immagine, restituisce job_id |
GET |
/api/page/{job_id}/{page} |
Ottieni immagine pagina |
GET |
/api/ocr/{job_id}/{page} |
Avvia OCR (streaming SSE) |
GET |
/api/ocr/{job_id}/{page}?strategy=auto |
OCR con strategia Auto |
GET |
/api/ocr/{job_id}/{page}?strategy=vision |
OCR con strategia Vision |
GET |
/api/markdown/{job_id} |
Scarica tutto il markdown |
GET |
/api/health |
Stato connessione Ollama e modelli |
DELETE |
/api/jobs/{job_id} |
Elimina job |
L'endpoint /api/ocr/{job_id}/{page} utilizza Server-Sent Events:
| Evento | Descrizione |
|---|---|
cached |
Risultato gia in cache |
stage |
Cambio passata (ocr -> vision in hybrid) |
data |
Chunk di testo generato |
done |
Elaborazione completata |
error |
Errore durante l'elaborazione |
glm-ocr-webapp/
├── pd-to-md.py # Backend FastAPI
├── requirements.txt # Dipendenze Python
├── static/
│ ├── index.html # Frontend HTML
│ ├── app.js # Logica frontend
│ └── styles.css # Stili CSS
├── jobs/ # Directory job (auto-creata)
│ └── {job_id}/
│ ├── meta.json # Metadati job
│ ├── page-*.png # Immagini pagine
│ └── page-*.md # Risultati OCR (cache)
└── uploads/ # Upload temporanei
<-/->: Naviga tra le pagineCtrl+S/Cmd+S: Scarica MarkdownEscape: Torna alla schermata upload
# Verifica che Ollama sia in esecuzione
ollama list
# Se non parte
ollama serve# Scarica i modelli necessari
ollama pull Maternion/LightOnOCR-2:latest
ollama pull qwen3.5:397b-cloudIl timeout e impostato a 10 minuti. Per documenti molto lunghi, puoi aumentare RENDER_DPI per qualita migliore o diminuirlo per performance migliori.
Se l'OCR sembra bloccato, verifica:
- Che Ollama sia in esecuzione:
ollama list - Che il modello sia disponibile: controlla
/api/health - Prova la strategia "auto" invece di "vision" per testare
MIT