File size: 5,573 Bytes
e0b339d d35e97b d56556d e0b339d d56556d e0b339d d56556d e0b339d d35e97b d56556d d35e97b d56556d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
import tempfile
import time
from gradio_client import Client, handle_file
import re
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 el archivo: {e}")
return {"error": "Error al procesar la imagen"}
def listaTextosExtraidos(dict_recibido):
result = dict_recibido['data']
print("Datos extraídos (acceso directo):")
textos_extraidos = []
print("Líneas encontradas con modelo IA:")
for item in result:
texto = item[1][0]
print(texto)
textos_extraidos.append(texto)
return textos_extraidos
#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
def buscaIndexMultiplesPalabras(arreglo, palabras_requeridas):
"""
Busca el índice de la primera línea en un arreglo de textos
que contenga TODAS las palabras especificadas en palabras_requeridas.
Args:
arreglo (list): Una lista de strings (los textos limpios).
palabras_requeridas (list): Una lista de strings, donde cada string
es una palabra que debe estar presente en la línea.
La búsqueda es insensible a mayúsculas/minúsculas
y limpia espacios en las palabras requeridas.
Returns:
int: El índice de la primera línea que contiene todas las palabras,
o None si ninguna línea las contiene.
"""
print("Estoy en busca palabras múltiples.")
# Limpiar y normalizar todas las palabras requeridas de una vez
palabras_requeridas_limpias = [p.lower().replace(" ", "") for p in palabras_requeridas]
print("Las palabras requeridas límpias son: ", palabras_requeridas_limpias)
for i, texto_linea in enumerate(arreglo):
# Convertir la línea actual a minúsculas para una comparación insensible a mayúsculas/minúsculas
texto_linea_lower = texto_linea.lower()
print("La línea que estoy analizando es: ", texto_linea_lower)
# Verificar si TODAS las palabras requeridas están en la línea actual
# Usamos 'all()' para asegurarnos de que CADA palabra_limpia esté en texto_linea_lower
if all(palabra_limpia in texto_linea_lower for palabra_limpia in palabras_requeridas_limpias):
print(f"Todas las palabras están en la línea {i}")
return i # Retorna el índice de la primera línea que cumple la condición
return None # Si ninguna línea contiene todas las palabras
def buscarPatronCedula(lista_textos):
for i, texto in enumerate(lista_textos):
if texto and texto[0].isdigit() and '-' in texto:
return i
return 'error'
async def procesaImagen(image):
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
def obtener_fecha(texto):
# El patrón busca:
# - "FECHADENACIMIENTO" (insensible a mayúsculas/minúsculas)
# - Seguido opcionalmente de CERO o MÁS caracteres que NO SEAN UN DÍGITO (lo que inicia la fecha).
# Esto cubrirá ':', '.', espacios, o cualquier otro carácter de separación.
# - Captura el patrón de fecha: \d{1,2}-[A-Za-z0-9]{3}-\d{4}
patron = r"FECHADENACIMIENTO[^\d]*(\d{1,2}-[A-Za-z0-9]{3}-\d{4})"
match = re.search(patron, texto, re.IGNORECASE)
fecha_encontrada = None
if match:
fecha_encontrada = match.group(1)
if fecha_encontrada:
partes_fecha = fecha_encontrada.split('-')
if len(partes_fecha) == 3:
dia = partes_fecha[0]
mes = partes_fecha[1].lower() # Convierte el mes a minúsculas
año = partes_fecha[2]
return f"{dia}-{mes}-{año}"
else:
# Esto se ejecutaría si el formato de la fecha extraída no es el esperado (ej. 2 partes)
return fecha_encontrada
return None # Si no se encontró el patrón de fecha
def obtener_sexo(texto):
# El patrón ahora busca "Sexo" O "Seno" (insensible a mayúsculas/minúsculas)
# Seguido opcionalmente de un ":"
# Seguido opcionalmente de espacios en blanco
# Captura la siguiente letra
patron = r"(Sexo|Seno):?\s*([A-Za-z])"
# re.search busca la primera ocurrencia del patrón en el texto
# re.IGNORECASE hace que la búsqueda sea insensible a mayúsculas/minúsculas para "Sexo" y "Seno"
match = re.search(patron, texto, re.IGNORECASE)
if match:
# match.group(2) devuelve lo que se capturó en el SEGUNDO grupo de paréntesis,
# que es la letra del sexo/seno. match.group(1) sería "Sexo" o "Seno".
return match.group(2)
else:
return None |