feat: Agregar soporte OCR con Tesseract para PDFs escaneados

- Integrar Tesseract OCR para leer PDFs escaneados automáticamente
- Detectar automáticamente si el PDF tiene texto o requiere OCR
- Agregar servicio ocr_service.py con funciones de OCR
- Actualizar Dockerfile con tesseract-ocr, tesseract-ocr-spa y poppler-utils
- Agregar variables de configuración OCR (OCR_ENABLED, OCR_LANGUAGE, OCR_DPI, OCR_TIMEOUT)
- Crear endpoint de debug para ver texto extraído (/api/v1/debug/extract-text)
- Agregar scripts de instalación y prueba (install_ocr.ps1, test_ocr.py, debug_pdf.ps1)
- Documentación completa (OCR_SETUP.md, DOCKER_OCR.md, COMO_PROBAR.md)
- Actualizar docker-compose.yml con variables de entorno OCR
- Modificar pdf_text.py para usar OCR cuando sea necesario
- Actualizar requirements.txt con pytesseract, Pillow, pdf2image
This commit is contained in:
Ernesto Herrera
2026-03-04 08:21:41 -07:00
parent 068d859f42
commit fcc516c9b3
18 changed files with 1694 additions and 14 deletions

149
install_ocr.ps1 Normal file
View File

@@ -0,0 +1,149 @@
# Script de Instalación Rápida de OCR
# Para ejecutar: .\install_ocr.ps1
Write-Host "========================================" -ForegroundColor Cyan
Write-Host "Instalación de OCR para MVE Micro Docs" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
Write-Host ""
# Verificar si tesseract ya está instalado
Write-Host "Verificando si Tesseract está instalado..." -ForegroundColor Yellow
$tesseractInstalled = $false
try {
$version = tesseract --version 2>&1
if ($version -match "tesseract") {
Write-Host "✓ Tesseract ya está instalado:" -ForegroundColor Green
Write-Host $version[0] -ForegroundColor Gray
$tesseractInstalled = $true
}
} catch {
Write-Host "✗ Tesseract no está instalado" -ForegroundColor Red
}
if (-not $tesseractInstalled) {
Write-Host ""
Write-Host "Para instalar Tesseract OCR:" -ForegroundColor Yellow
Write-Host "1. Visita: https://github.com/UB-Mannheim/tesseract/wiki" -ForegroundColor White
Write-Host "2. Descarga tesseract-ocr-w64-setup-5.3.x.exe" -ForegroundColor White
Write-Host "3. Durante la instalación, MARCA la opción 'Spanish language data'" -ForegroundColor White
Write-Host "4. Agrega C:\Program Files\Tesseract-OCR al PATH del sistema" -ForegroundColor White
Write-Host "5. Reinicia PowerShell y ejecuta este script nuevamente" -ForegroundColor White
Write-Host ""
$openBrowser = Read-Host "¿Abrir el sitio de descarga en el navegador? (S/N)"
if ($openBrowser -eq "S" -or $openBrowser -eq "s") {
Start-Process "https://github.com/UB-Mannheim/tesseract/wiki"
}
Write-Host ""
Write-Host "Presiona cualquier tecla para continuar después de instalar Tesseract..."
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
exit
}
# Verificar idioma español
Write-Host ""
Write-Host "Verificando idioma español..." -ForegroundColor Yellow
$languages = tesseract --list-langs 2>&1
if ($languages -match "spa") {
Write-Host "✓ Paquete de idioma español (spa) instalado" -ForegroundColor Green
} else {
Write-Host "✗ Paquete de idioma español NO instalado" -ForegroundColor Red
Write-Host "Reinstala Tesseract y marca 'Spanish language data' durante la instalación" -ForegroundColor Yellow
}
# Verificar poppler
Write-Host ""
Write-Host "Verificando poppler (requerido para convertir PDF a imágenes)..." -ForegroundColor Yellow
$popplerInstalled = $false
try {
$pdfToText = Get-Command pdftoppm -ErrorAction SilentlyContinue
if ($pdfToText) {
Write-Host "✓ Poppler ya está instalado" -ForegroundColor Green
$popplerInstalled = $true
}
} catch {}
if (-not $popplerInstalled) {
Write-Host "✗ Poppler no está instalado" -ForegroundColor Red
Write-Host ""
Write-Host "Para instalar Poppler:" -ForegroundColor Yellow
Write-Host "1. Descarga: https://github.com/oschwartz10612/poppler-windows/releases/latest" -ForegroundColor White
Write-Host "2. Extrae el ZIP a C:\poppler" -ForegroundColor White
Write-Host "3. Agrega C:\poppler\Library\bin al PATH del sistema" -ForegroundColor White
Write-Host ""
$openBrowser = Read-Host "¿Abrir el sitio de descarga en el navegador? (S/N)"
if ($openBrowser -eq "S" -or $openBrowser -eq "s") {
Start-Process "https://github.com/oschwartz10612/poppler-windows/releases/latest"
}
}
# Instalar dependencias Python
Write-Host ""
Write-Host "Instalando dependencias Python..." -ForegroundColor Yellow
try {
& pip install pytesseract Pillow pdf2image
Write-Host "✓ Dependencias Python instaladas correctamente" -ForegroundColor Green
} catch {
Write-Host "✗ Error al instalar dependencias Python" -ForegroundColor Red
Write-Host $_.Exception.Message -ForegroundColor Red
}
# Verificar archivo .env
Write-Host ""
Write-Host "Verificando configuración..." -ForegroundColor Yellow
if (Test-Path ".env") {
Write-Host "✓ Archivo .env existe" -ForegroundColor Green
# Verificar si tiene las variables OCR
$envContent = Get-Content ".env" -Raw
if ($envContent -notmatch "OCR_ENABLED") {
Write-Host "! Agregando variables OCR al archivo .env" -ForegroundColor Yellow
$ocrConfig = @"
# OCR Settings
OCR_ENABLED=true
OCR_LANGUAGE=spa
OCR_DPI=300
OCR_TIMEOUT=300
"@
Add-Content ".env" $ocrConfig
Write-Host "✓ Variables OCR agregadas" -ForegroundColor Green
} else {
Write-Host "✓ Variables OCR ya configuradas" -ForegroundColor Green
}
} else {
Write-Host "! Archivo .env no existe, copiando desde .env.example" -ForegroundColor Yellow
Copy-Item ".env.example" ".env"
Write-Host "✓ Archivo .env creado - edítalo con tus credenciales" -ForegroundColor Green
}
# Resumen final
Write-Host ""
Write-Host "========================================" -ForegroundColor Cyan
Write-Host "Resumen de Instalación" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
$allGood = $tesseractInstalled -and ($languages -match "spa")
if ($allGood) {
Write-Host "✓ ¡Todo listo para usar OCR!" -ForegroundColor Green
Write-Host ""
Write-Host "Para probar:" -ForegroundColor White
Write-Host " python -c `"import pytesseract; print('OCR Ready!')`"" -ForegroundColor Gray
Write-Host ""
Write-Host "Inicia tu servidor:" -ForegroundColor White
Write-Host " uvicorn app.main:app --reload" -ForegroundColor Gray
} else {
Write-Host "⚠ Instalación incompleta" -ForegroundColor Yellow
Write-Host ""
Write-Host "Componentes faltantes:" -ForegroundColor Yellow
if (-not $tesseractInstalled) { Write-Host " - Tesseract OCR" -ForegroundColor Red }
if ($languages -notmatch "spa") { Write-Host " - Paquete de idioma español" -ForegroundColor Red }
if (-not $popplerInstalled) { Write-Host " - Poppler (opcional pero recomendado)" -ForegroundColor Yellow }
Write-Host ""
Write-Host "Consulta OCR_SETUP.md para instrucciones detalladas" -ForegroundColor White
}
Write-Host ""
Write-Host "Presiona cualquier tecla para salir..."
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")