import re import time import tempfile from gradio_client import Client, handle_file async def procesaImagen(image): try: temp_image = await imageToTemp(image) client = Client("BuzzwordMx/ai_ocr") dict_recibido = client.predict( img=handle_file(temp_image), lang="en", api_name="/predict" ) #Aquí es donde personalizo el proceso: textos_extraidos = listaTextosExtraidos(dict_recibido) return textos_extraidos except Exception as e: print(f"Error al procesar el archivo: {e}") return 'Error' async def imageToTemp(image): try: with tempfile.NamedTemporaryFile(delete=False, suffix=f"_{image.filename}") as tmp_file: contents = await image.read() tmp_file.write(contents) temp_file_path = tmp_file.name print(f"Archivo temporal guardado en: {temp_file_path}") return temp_file_path except Exception as e: print(f"Error al procesar la imagen: {e}") return {"error": "Error al procesar la imagen"} def listaTextosExtraidos(dict_recibido): result = dict_recibido['data'] print("Datos extraídos (acceso directo):") textos_extraidos = [] for item in result: texto = item[1][0] print(texto) textos_extraidos.append(texto) return textos_extraidos def simplificaTextos(textos_extraidos): textos_extraidos_simplificados = [texto.lower().replace(" ", "") for texto in textos_extraidos] print("Textos extraídos simplificados:") print(textos_extraidos_simplificados) return textos_extraidos_simplificados #Herramientas para DNI Panamá. def buscaIndexPalabra(arreglo, palabra): palabra_limpia = palabra.lower().replace(" ", "") for i, texto_limpio in enumerate(arreglo): if palabra_limpia in texto_limpio: return i return None # Cambiado de 'error' a None import re def buscaIndexMultiplesPalabras(arreglo_textos, conceptos_requeridos): #AND por default. """ Busca el índice de la primera línea que contiene todas las palabras requeridas (o sus alternativas) y devuelve la línea con las alternativas corregidas a su forma preferida. Args: arreglo (list): Lista de strings de texto extraído (limpios). conceptos_requeridos (list): Lista de diccionarios, donde cada diccionario define un concepto: Ej: {'preferida': 'nacimiento', 'alternativas': ['nacimento', 'nacimuento']} Returns: tuple: (índice, arreglo_corregido) si se encuentra, o (None, None) si no se encuentra. """ print(f"\n--- Entre a busqueda palabras index ---") # Paso 1: Normalizar los conceptos y prepararlos para la búsqueda y corrección conceptos_preparados = [] for concepto in conceptos_requeridos: print("Preparación de conceptos, estoy en el concepto: ", concepto) preferida = concepto['preferida'].lower().replace(" ", "") alternativas = [alt.lower().replace(" ", "") for alt in concepto.get('alternativas', [])] # Combinamos la preferida con las alternativas para la búsqueda todas_las_formas = [preferida] + alternativas print("Todas las formas quedó como: ", todas_las_formas) conceptos_preparados.append({ 'preferida': preferida, 'todas_las_formas': todas_las_formas, }) print("Conceptos preparados quedó como: ", conceptos_preparados) for i, texto_linea in enumerate(arreglo_textos): texto_linea_lower = texto_linea.lower() print("Trabajando la línea: ", texto_linea_lower) # Variables para seguir el rastro de la línea actual es_coincidencia_completa = True # Asume que la coincidencia es completa al inicio de cada línea print("La var es_coincidencia_completa empieza como true...") palabras_encontradas_en_linea = {} # Almacena {forma_encontrada: forma_preferida} # Paso 2: Verificar si TODAS las condiciones se cumplen en esta línea for concepto in conceptos_preparados: encontrado_en_este_concepto = False print("Revisando CONCEPTO: ", concepto) # Buscamos si alguna forma (preferida o alternativa) está en la línea for forma in concepto['todas_las_formas']: print("Evaluando la siguiente forma en el concepto: Forma: ", forma) print(f"Ahora, si la forma --{forma}-- está en la línea: --{texto_linea_lower}--, entonces: ") if forma in texto_linea_lower: print(f"¡Encontrado! La forma '{forma}' está en la línea.") encontrado_en_este_concepto = True # Guardamos qué forma se encontró y cuál es la preferida palabras_encontradas_en_linea[forma] = concepto['preferida'] print("Estoy por hacer break porque encontré la línea...") # Hemos encontrado una forma para este concepto, pasamos al siguiente concepto break # Este break sale del bucle interno, lo cual es correcto # Si no se encontró ninguna forma para el concepto actual, esta línea no es una coincidencia if not encontrado_en_este_concepto: es_coincidencia_completa = False print(f"Línea {i}: Concepto '{concepto['preferida']}' : No encontrado. ¡Fallo en esta línea!") break # Este break sale del bucle principal de conceptos, lo cual es correcto print("Paso: if es_coincidencia_completa:") # Paso 3: Si se encontró una coincidencia completa, corregimos la línea y la retornamos if es_coincidencia_completa: print("Aquí llega cuando encuentra algo, en su línea respectiva.") print(f"ÉXITO: Coincidencia completa en el índice {i}.") print(f"Texto linea es: {texto_linea}") linea_corregida = texto_linea for forma_encontrada, forma_preferida in palabras_encontradas_en_linea.items(): patron_reemplazo = re.compile(re.escape(forma_encontrada), re.IGNORECASE) linea_corregida = patron_reemplazo.sub(forma_preferida, linea_corregida, count=1) print(f"Línea corregida: '{linea_corregida}'") arreglo_textos[i] = linea_corregida return i, arreglo_textos print("Paso: Búsqueda finalizada.:") print(f"\n--- Búsqueda finalizada ---") print("Ninguna línea contiene todas las palabras requeridas.") return None, None def buscaIndexMultiplesPalabrasOR(arreglo_textos, conceptos_requeridos): """ Busca el índice de la primera línea que contiene todas las palabras requeridas (o sus alternativas) y devuelve la línea con las alternativas corregidas a su forma preferida. Args: arreglo (list): Lista de strings de texto extraído (limpios). conceptos_requeridos (list): Lista de diccionarios, donde cada diccionario define un concepto: Ej: {'preferida': 'nacimiento', 'alternativas': ['nacimento', 'nacimuento']} Returns: tuple: (índice, arreglo_corregido) si se encuentra, o (None, None) si no se encuentra. """ print(f"\n--- Entre a busqueda palabras index ---") # Paso 1: Normalizar los conceptos y prepararlos para la búsqueda y corrección conceptos_preparados = [] for concepto in conceptos_requeridos: print("Preparación de conceptos, estoy en el concepto: ", concepto) preferida = concepto['preferida'].lower().replace(" ", "") alternativas = [alt.lower().replace(" ", "") for alt in concepto.get('alternativas', [])] # Combinamos la preferida con las alternativas para la búsqueda todas_las_formas = [preferida] + alternativas print("Todas las formas quedó como: ", todas_las_formas) conceptos_preparados.append({ 'preferida': preferida, 'todas_las_formas': todas_las_formas, }) print("Conceptos preparados quedó como: ", conceptos_preparados) for i, texto_linea in enumerate(arreglo_textos): texto_linea_lower = texto_linea.lower() print("Trabajando la línea: ", texto_linea_lower) # Variables para seguir el rastro de la línea actual es_coincidencia_completa = False print("La var es_coincidencia_completa empieza como false...") palabras_encontradas_en_linea = {} # Almacena {forma_encontrada: forma_preferida} # Paso 2: Verificar si TODAS las condiciones se cumplen en esta línea for concepto in conceptos_preparados: encontrado_en_esta_linea = False print("Revisando CONCEPTO: ", concepto) # Buscamos si alguna forma (preferida o alternativa) está en la línea for forma in concepto['todas_las_formas']: print("Evaluando la siguiente forma en el concepto: Forma: ", forma) print(f"Ahora, si la forma --{forma}-- está en la línea: --{texto_linea_lower}--, entonces: ") if forma in texto_linea_lower: print("Encontrado línea es True!") encontrado_en_esta_linea = True # Guardamos qué forma se encontró y cuál es la preferida palabras_encontradas_en_linea[forma] = concepto['preferida'] print("Estoy por hacer break porque encontré la línea...") # Hemos encontrado una forma para este concepto, pasamos al siguiente concepto break #Éste break entonces si se sale del for. De no hacerlo, volvería arriba. if encontrado_en_esta_linea: es_coincidencia_completa = True print(f"Línea {i}: Concepto '{concepto['preferida']}' : Encontrado.") break # Se sale del for grande. print("Paso: if es_coincidencia_completa:") # Paso 3: Si se encontró una coincidencia completa, corregimos la línea y la retornamos if es_coincidencia_completa: print("Aquí llega cuando encuentra algo, en su línea respectiva, pero cuando no encuentra nada, se queda en cero.") print(f"ÉXITO: Coincidencia completa en el índice {i}.") print(f"Texto linea es: {texto_linea}") linea_corregida = texto_linea for forma_encontrada, forma_preferida in palabras_encontradas_en_linea.items(): patron_reemplazo = re.compile(re.escape(forma_encontrada), re.IGNORECASE) linea_corregida = patron_reemplazo.sub(forma_preferida, linea_corregida, count=1) print(f"Línea corregida: '{linea_corregida}'") arreglo_textos[i] = linea_corregida return i, arreglo_textos print("Paso: Búsqueda finalizada.:") print(f"\n--- Búsqueda finalizada ---") print("Ninguna línea contiene todas las palabras requeridas.") return None, None