# 🏦 Analizador de Comprobantes Bancarios ## 📋 Descripción del Proyecto Esta aplicación web desarrollada en **Streamlit** permite extraer información específica de comprobantes bancarios utilizando **Amazon Textract**, un servicio de AWS especializado en extracción de texto y análisis de documentos. La aplicación puede procesar imágenes de comprobantes y extraer automáticamente datos como montos, números de operación, fechas, y más información relevante. ## 🎯 Funcionalidades Principales - ✅ Extracción automática de texto de comprobantes bancarios - ✅ Análisis inteligente de formularios y tablas - ✅ Reconocimiento de patrones específicos bancarios - ✅ Exportación de datos extraídos en formato JSON - ✅ Interfaz web intuitiva con vista previa de documentos ## 🛠️ Tecnologías Utilizadas ### Librerías Principales - **Streamlit**: Framework para crear aplicaciones web interactivas - **boto3**: SDK oficial de AWS para Python (interacción con servicios AWS) - **PIL (Pillow)**: Procesamiento y manipulación de imágenes - **pandas**: Manipulación y análisis de datos estructurados - **re**: Expresiones regulares para extracción de patrones ### Servicios AWS - **Amazon Textract**: Servicio de extracción de texto y análisis de documentos ## 📁 Estructura del Código ### 1. Clase `BankingReceiptAnalyzer` **Propósito**: Gestiona la comunicación con AWS Textract para el análisis de documentos. #### Método `__init__(self)` ```python def __init__(self): ``` - **Función**: Constructor que inicializa la conexión con AWS Textract - **Consumo de librería**: Utiliza `boto3.client()` para crear cliente de Textract - **Configuración**: Lee credenciales desde `st.secrets` (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_DEFAULT_REGION) - **Manejo de errores**: Valida credenciales y maneja excepciones de conexión #### Método `analyze_document_with_forms(self, image_bytes)` ```python def analyze_document_with_forms(self, image_bytes: bytes) -> Dict[str, Any]: ``` - **Función**: Análisis avanzado de documentos con reconocimiento de formularios y tablas - **Consumo AWS**: Utiliza `textract.analyze_document()` con características: - `FORMS`: Detecta pares clave-valor en formularios - `TABLES`: Reconoce estructuras tabulares - **Parámetros**: Recibe bytes de la imagen del documento - **Retorno**: Diccionario con bloques de texto estructurados o mensaje de error #### Método `extract_text_simple(self, image_bytes)` ```python def extract_text_simple(self, image_bytes: bytes) -> Dict[str, Any]: ``` - **Función**: Extracción básica de texto línea por línea - **Consumo AWS**: Utiliza `textract.detect_document_text()` (método más simple) - **Procesamiento**: Filtra bloques de tipo 'LINE' para obtener texto legible - **Uso**: Ideal para documentos con texto simple sin estructura compleja ### 2. Clase `BankingDataExtractor` **Propósito**: Procesa el texto extraído y identifica campos específicos bancarios usando patrones. #### Método `extract_banking_fields(text)` ```python @staticmethod def extract_banking_fields(text: str) -> Dict[str, str]: ``` - **Función**: Extrae información bancaria específica usando expresiones regulares - **Consumo de librería**: Utiliza `re.search()` para patrones regex - **Campos detectables**: - 💰 Importe enviado (S/ XXX.XX) - 🏦 Entidad destino (nombre del banco) - 💳 Comisión (S/ X.XX) - 📊 ITF (Impuesto a las Transacciones Financieras) - 🔢 Número de operación - 📝 Tipo de operación - 📅 Fecha y hora - ✅ Estado de operación **Patrones de Búsqueda Ejemplo**: ```python 'importe_enviado': [ r'Importe enviado\s*S/\s*(\d+\.?\d*)', r'S/\s*(\d+\.?\d*)', r'Monto\s*S/\s*(\d+\.?\d*)' ] ``` #### Método `_extract_account_numbers(text, fields)` ```python @staticmethod def _extract_account_numbers(text: str, fields: Dict[str, str]) -> None: ``` - **Función**: Identifica números de cuenta origen y destino - **Patrones**: Busca formatos como "•1234", "Cuenta 123456789" - **Lógica**: Asigna primera cuenta como origen y segunda como destino #### Método `_extract_bank_names(text, fields)` ```python @staticmethod def _extract_bank_names(text: str, fields: Dict[str, str]) -> None: ``` - **Función**: Detecta nombres de bancos peruanos comunes - **Bancos soportados**: BBVA, Plin, BCP, Interbank, Scotiabank, BanBif - **Método**: Búsqueda case-insensitive en el texto ### 3. Función `display_extracted_banking_data(fields)` **Propósito**: Presenta los datos extraídos en una interfaz visual organizada. - **Consumo Streamlit**: Utiliza `st.metric()`, `st.dataframe()`, `st.columns()` - **Funcionalidades**: - Métricas destacadas (importe, entidad, estado) - Tabla detallada con todos los campos - Indicadores de estado (detectado/no detectado) - Botón de descarga en formato JSON - **Exportación**: Genera archivo JSON con timestamp y estadísticas de completitud ### 4. Función `process_banking_receipt(uploaded_file, analyzer)` **Propósito**: Orquesta el proceso completo de análisis de un comprobante. - **Consumo PIL**: Utiliza `Image.open()` para mostrar vista previa - **Funcionalidades**: - Vista previa del documento subido - Dos métodos de análisis (Tabs): - Análisis avanzado con formularios - Extracción simple de texto - Procesamiento de bytes del archivo - Manejo de errores y estados de carga ### 5. Función `main()` **Propósito**: Función principal que construye la interfaz de usuario completa. - **Consumo Streamlit**: Utiliza múltiples componentes: - `st.title()`, `st.markdown()`: Títulos y contenido - `st.sidebar`: Panel lateral informativo - `st.file_uploader()`: Subida de archivos - `st.columns()`: Layout en columnas - **Validaciones**: Verifica credenciales AWS antes de continuar - **Tipos de archivo**: Soporta JPG, PNG, PDF ## FUNCIONAMIENTO ## 🧠 **Dos "servicios" o capas distintas en el proceso** ### 🔹 1. **OCR con IA** → *Textract (`extract_text_simple`)* * Es el **servicio de reconocimiento de texto (OCR)** de [AWS Textract](w). * Detecta el **texto visual** en una imagen escaneada (como un comprobante bancario). * **No interpreta** lo que ese texto significa, solo lo reconoce y lo devuelve como líneas o palabras. * Es como un escáner con **visión artificial inteligente**, que ve: ``` "Importe enviado S/ 1250.00" ``` --- ### 🔹 2. **Servicio tipo “tag” semántico** → *`BankingDataExtractor`* * Es un **servicio personalizado**, hecho por ti (o el desarrollador). * Usa expresiones regulares para **“etiquetar” o clasificar** partes del texto como: * `importe_enviado`, `fecha`, `comisión`, etc. * Es como un **motor de reglas semánticas** que dice: > `Importe enviado S/ X`, eso es el campo `importe_enviado`.” --- ## 🧪 Definicion: > AWS Textract es como un lector que **lee** el contenido de una carta (OCR), > `BankingDataExtractor` es un asistente que **resalta lo importante** con marcadores: el nombre del remitente, la fecha, el asunto, etc. --- ## 🧩 Diagrama: ``` 🖼️ Imagen JPG/PDF │ ▼ 🧠 AWS Textract (OCR IA) └──▶ Texto plano │ ▼ 🧾 BankingDataExtractor (Regex/tagger) └──▶ Datos estructurados clave-valor ``` --- ## ✅ Conclusión: > Se usan 2 servicios: uno (Textract) es como un **OCR con inteligencia artificial** que extrae el texto visible, y el otro (el extractor con regex) **etiqueta o clasifica semánticamente** ese texto para obtener información útil y estructurada. ## 🔧 Configuración y Uso ### 1. Configuración de AWS **Archivo**: `secrets.toml` (Streamlit) ```toml [aws] AWS_ACCESS_KEY_ID = "tu_access_key" AWS_SECRET_ACCESS_KEY = "tu_secret_key" AWS_DEFAULT_REGION = "us-east-1" ``` ### 2. Instalación de Dependencias ```bash pip install streamlit boto3 pillow pandas ``` ### 3. Ejecución ```bash streamlit run app.py ``` ## 📊 Flujo de Trabajo 1. **Carga de Documento**: Usuario sube imagen del comprobante 2. **Procesamiento AWS**: Textract extrae texto y estructura 3. **Análisis de Patrones**: Regex identifica campos bancarios específicos 4. **Visualización**: Streamlit muestra datos extraídos 5. **Exportación**: Descarga opcional en JSON ## 🎯 Casos de Uso - ✅ Automatización de contabilidad empresarial - ✅ Reconciliación bancaria automatizada - ✅ Digitalización de comprobantes físicos - ✅ Auditorías y reportes financieros - ✅ Integración con sistemas ERP ## ⚠️ Consideraciones Importantes ### Limitaciones de AWS Textract - **Costo**: Servicio pagado por documento procesado - **Calidad**: Requiere imágenes claras y bien iluminadas - **Idioma**: Optimizado para texto en español/inglés ### Seguridad - Credenciales AWS deben mantenerse seguras - Los documentos se procesan temporalmente en AWS - No se almacenan datos permanentemente ## 🚀 Mejoras Futuras - 🔄 Procesamiento por lotes (múltiples comprobantes) - 🤖 Machine Learning personalizado para patrones específicos - 📱 Versión móvil optimizada - 🔐 Autenticación de usuarios - 📈 Dashboard de estadísticas ## 📞 Soporte Para consultas técnicas o mejoras al código, contactar al desarrollador: [@JoseJeampierJaraSalas1997](https://github.com/JoseJeampierJaraSalas1997) --- **Nota**: Este proyecto utiliza Amazon Textract, no Amazon Rekognition. Textract está especializado en extracción de texto y análisis de documentos, mientras que Rekognition se enfoca en reconocimiento de imágenes, caras y objetos.