SPA académica para extraer texto de imágenes y documentos (PDF/TIFF) y exportarlo a formatos consumibles por un LLM (JSON / Markdown / CSV / TXT + PNG anotado).
v1 usa OCR clásico (PP-OCRv6 medium): las páginas de PDF/TIFF se rasterizan y se OCR-ean una a una. v2 usará un VLM. Detalle: docs/PRODUCT.md.
License: Apache License 2.0
| Studio | Upload | OCR |
|---|---|---|
![]() |
![]() |
![]() |
Más detalle: docs/media/README.md.
| Ruta | Rol |
|---|---|
| backend/ | API FastAPI + PaddleOCR |
| backend/app/ | Módulos: ocr, orientation, routes… |
| backend/tests/ | pytest API/storage (OCR mockeado) |
| frontend/ | UI React + Vite |
| frontend/src/ | Componentes y libs |
| tests/fixtures/images/ | Fixtures checklist / smoke |
| archivos_pruebas/ | Corpus de ejemplo incluido en el repo (probar al levantar + golden/e2e opt-in) |
| docs/ | Producto y ejemplos |
| docs/media/ | Capturas del studio (README / LinkedIn) |
| scripts/ | Arranque dev |
| CHANGELOG.md | Cambios recientes |
| LICENSE | Apache-2.0 |
- Python 3.11+
- Node.js 20+
cd backend
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
cd ..\frontend
npm install# Desde la raíz del repo
.\scripts\dev.ps1Unix:
./scripts/dev.sh- Frontend: http://localhost:5173
- API: http://localhost:8100 (
/health,/docs)
Variables: .env.example (VITE_API_URL, cache PaddleX; opcional PADDLEOCR_API_TOKEN para SDK cloud futuro — el pipeline local no lo usa).
Tras el clone, los documentos de prueba ya están en el repo (no hace falta descargar nada extra):
- Arrancá con
.\scripts\dev.ps1y abrí http://localhost:5173 - Subí
tests/fixtures/images/poster.avif→ Run → revisáTRY/WEREverticales - Probá el corpus incluido en
archivos_pruebas/(doc_01…doc_12, incl. PDF multipágina): subí → Run (el PDF auto-OCR página a página) - Exportá json o md desde el header
- Motor único PP-OCRv6 medium (engine escena; sin
doc_orientation/ unwarping). - Imágenes: PNG, JPEG, WEBP, GIF, BMP, ICO, PPM, AVIF → PNG pending → Run /
/infer(rescate angular ON). - Documentos: PDF (raster
pypdfium2) y TIFF (Pillow); tope 50 págs. / ≤ 20 MB → N PNG pending → la UI auto-llama/inferpor página (rescate OFF en PDF/TIFF). - Export JSON (
reading_order,page_index), Markdown, CSV, TXT, PNG anotado. - Ejemplo JSON: docs/examples/ocr-result.example.json.
No reemplazan del todo el checklist e2e manual. Capas:
# Rápidos (sin Paddle real)
cd backend
.\.venv\Scripts\Activate.ps1
pip install -r requirements-dev.txt
pytest
cd ..\frontend
npm test
# Opt-in: golden OCR real (Paddle; usa archivos_pruebas/doc_01.webp)
cd ..\backend
pytest -m slow -o addopts=
# Opt-in: Playwright (backend debe estar en :8100)
cd ..\frontend
npm run test:e2eCI en push/PR: .github/workflows/tests.yml (pytest rápido sin Paddle + npm test + build).
Corpus de ejemplo para usuarios finales (viene con el clone): archivos_pruebas/. Fixtures del checklist: tests/fixtures/images/.
Detalle: backend/README.md y frontend/README.md.
Con backend y frontend arriba:
| Caso | Cómo / esperado |
|---|---|
tests/fixtures/images/poster.avif |
Run → TRY ≈ −90°, WERE ≈ +90° |
nube-manzana.png / nube-corazon.jpeg |
confAvg razonable; algunas orientation ≠ 0 |
archivos_pruebas/doc_01…doc_12 |
Smoke libre (formatos mixtos + PDF); ver archivos_pruebas/README.md |
| PDF corto (2–3 págs.) | Galería doc.pdf · p.k/n; UI auto-OCR; API deja páginas pending tras /upload |
| TIFF multipágina | Ídem (frames vía Pillow) |
| PDF > 50 págs. | HTTP 400 |
| Export md / json | Incluyen page_index / page_count en páginas de documento |
También: cd frontend && npm run build.
- Frontend: React 19 + TypeScript + Vite + Tailwind CSS v4
- Backend: FastAPI + PaddleOCR PP-OCRv6 (
backend/app/)


