Files
mve-micro-docs/test_ocr.py
Ernesto Herrera fcc516c9b3 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
2026-03-04 08:21:41 -07:00

203 lines
6.4 KiB
Python

#!/usr/bin/env python3
"""Script de prueba para verificar que OCR funciona correctamente."""
import sys
import os
def test_imports():
"""Verificar que todas las librerías necesarias están instaladas."""
print("🔍 Verificando imports...")
try:
import pytesseract
print(" ✓ pytesseract")
except ImportError as e:
print(f" ✗ pytesseract: {e}")
return False
try:
from PIL import Image
print(" ✓ Pillow (PIL)")
except ImportError as e:
print(f" ✗ Pillow: {e}")
return False
try:
from pdf2image import convert_from_bytes
print(" ✓ pdf2image")
except ImportError as e:
print(f" ✗ pdf2image: {e}")
return False
try:
import fitz
print(" ✓ PyMuPDF")
except ImportError as e:
print(f" ✗ PyMuPDF: {e}")
return False
return True
def test_tesseract():
"""Verificar que Tesseract está instalado y accesible."""
print("\n🔍 Verificando Tesseract...")
try:
import pytesseract
version = pytesseract.get_tesseract_version()
print(f" ✓ Tesseract versión: {version}")
return True
except Exception as e:
print(f" ✗ Error: {e}")
print(" → Asegúrate de que Tesseract esté instalado y en el PATH")
return False
def test_languages():
"""Verificar idiomas disponibles."""
print("\n🔍 Verificando idiomas disponibles...")
try:
import pytesseract
langs = pytesseract.get_languages()
print(f" Idiomas instalados: {', '.join(langs)}")
if 'spa' in langs:
print(" ✓ Español (spa) disponible")
else:
print(" ✗ Español (spa) NO disponible")
print(" → Reinstala Tesseract con el paquete de idioma español")
return False
return True
except Exception as e:
print(f" ✗ Error: {e}")
return False
def test_poppler():
"""Verificar que poppler está disponible."""
print("\n🔍 Verificando poppler...")
try:
from pdf2image import convert_from_bytes
# Intentar convertir un PDF simple (1x1 pixel blanco)
# Este es un PDF mínimo válido en base64
import base64
minimal_pdf = base64.b64decode(
"JVBERi0xLjEKJeLjz9MKMSAwIG9iaiAKPDwgL1R5cGUgL0NhdGFsb2cgL1BhZ2VzIDIgMCBSID4+"
"CmVuZG9iaiAKMiAwIG9iaiAKPDwgL1R5cGUgL1BhZ2VzIC9LaWRzIFszIDAgUl0gL0NvdW50IDEK"
"L01lZGlhQm94IFswIDAgMzAwIDE0NF0gPj4KZW5kb2JqIAozIDAgb2JqIAo8PCAvVHlwZSAvUGFn"
"ZSAvUGFyZW50IDIgMCBSIC9SZXNvdXJjZXMgPDwgL0ZvbnQgPDwgL0YxIDQgMCBSID4+ID4+IC9D"
"b250ZW50cyA1IDAgUiA+PgplbmRvYmogCjQgMCBvYmogCjw8IC9UeXBlIC9Gb250IC9TdWJ0eXBl"
"IC9UeXBlMSAvQmFzZUZvbnQgL1RpbWVzLVJvbWFuID4+CmVuZG9iaiAKNSAwIG9iaiAKPDwgL0xl"
"bmd0aCA0NCA+PgpzdHJlYW0KQlQKNzAgNTAgVGQKL0YxIDEyIFRmCihIZWxsbykgVGoKRVQKZW5k"
"c3RyZWFtCmVuZG9iaiAKeHJlZgowIDYKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDEwIDAw"
"MDAwIG4gCjAwMDAwMDAwNzkgMDAwMDAgbiAKMDAwMDAwMDE3MyAwMDAwMCBuIAowMDAwMDAwMzAx"
"IDAwMDAwIG4gCjAwMDAwMDAzODAgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSA2IC9Sb290IDAg"
"MCBSID4+CnN0YXJ0eHJlZgo0OTEKJSVFT0YK"
)
images = convert_from_bytes(minimal_pdf, dpi=72)
print(f" ✓ poppler funciona correctamente")
print(f" → Convertido PDF a {len(images)} imagen(es)")
return True
except Exception as e:
print(f" ✗ Error: {e}")
print(" → Instala poppler y agrégalo al PATH del sistema")
return False
def test_ocr_simple():
"""Realizar una prueba simple de OCR."""
print("\n🔍 Realizando prueba de OCR...")
try:
import pytesseract
from PIL import Image, ImageDraw, ImageFont
# Crear una imagen simple con texto
img = Image.new('RGB', (300, 100), color='white')
draw = ImageDraw.Draw(img)
# Dibujar texto simple
draw.text((10, 40), "Hola Mundo", fill='black')
# Intentar OCR
text = pytesseract.image_to_string(img, lang='spa')
print(f" Texto detectado: '{text.strip()}'")
if text.strip():
print(" ✓ OCR funciona correctamente")
return True
else:
print(" ⚠ OCR no detectó texto (esto puede ser normal con fuentes simples)")
return True
except Exception as e:
print(f" ✗ Error en OCR: {e}")
return False
def test_service_import():
"""Verificar que el servicio OCR se puede importar."""
print("\n🔍 Verificando servicio OCR del proyecto...")
try:
# Agregar el directorio del proyecto al path si no está
project_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if project_dir not in sys.path:
sys.path.insert(0, project_dir)
from app.services.ocr_service import extract_text_with_ocr, is_pdf_scanned
print(" ✓ Servicio OCR importado correctamente")
from app.services.pdf_text import extract_text_from_pdf
print(" ✓ Servicio PDF importado correctamente")
return True
except Exception as e:
print(f" ✗ Error: {e}")
return False
def main():
"""Ejecutar todas las pruebas."""
print("=" * 50)
print("🧪 Prueba de Configuración OCR")
print("=" * 50)
results = {
"Imports": test_imports(),
"Tesseract": test_tesseract(),
"Idiomas": test_languages(),
"Poppler": test_poppler(),
"OCR Simple": test_ocr_simple(),
"Servicios": test_service_import()
}
print("\n" + "=" * 50)
print("📊 Resumen")
print("=" * 50)
for test_name, result in results.items():
status = "" if result else ""
print(f"{status} {test_name}")
all_passed = all(results.values())
print("\n" + "=" * 50)
if all_passed:
print("🎉 ¡Todas las pruebas pasaron exitosamente!")
print("Tu sistema está listo para usar OCR.")
else:
print("⚠️ Algunas pruebas fallaron.")
print("Revisa los errores arriba y consulta OCR_SETUP.md")
print("=" * 50)
return 0 if all_passed else 1
if __name__ == "__main__":
sys.exit(main())