Tvivas's picture
Update app.py
d912b8e verified
import gradio as gr
import boto3
import re
import os
# Credenciales desde Secrets
textract = boto3.client(
"textract",
region_name="us-east-1",
aws_access_key_id="ASIA4LHG3BULWEOMKU4Z",
aws_secret_access_key="C3fjhuRYrATatQPxt3V1/9S/30OegS1XhBFHgEq4",
aws_session_token="IQoJb3JpZ2luX2VjEOL//////////wEaCXVzLXdlc3QtMiJIMEYCIQDeZo7cJ5Kaq++oYDKe7SmtmJuwzfg4wnB7ApcBoXo/8gIhAIvq0cMBl1ozGsZGhmDNn4G3MOM0AGTfvG6sqKB+kPbzKqwCCKv//////////wEQAhoMODQ4NzQwMTU4NzQzIgwkY6n0FrY0HkJuVGQqgAK/7MX2bIhDIY/bIQPzD0v8Teo4Wk4+1wXMvYMAFvVY1rIo4BicFF+aSKFRRuRZrbcJhcsgjT3lhDv+B6CbCfPdfdObipHxb79u2PUf/4IaBrK8yYpr2VG1epEP1OqoxMKYMEc04YTjPwFZIETWJiIp4ezOj0JIm5IJ+2Ku9zR6L6QlCAVaKldBu4ZzDUdzKGFPT2Pk8PTQyRsQHK8gsfvpbJO0cLY1m5LidorLOaTxd7pm95MMVLI+aUevEJGaEeAib+cMWcifL7RSZteWhU/sI8Fn/p0Lz29u2597v4NgQQFUNZIVNI9ErSzO0LQHbL29llSrry6b0ZDWqdswVy0sMJTIt88GOpwBZb191j8/0L2+K3PDEnroUysyAYJY4czZPM+Yqov0qTC39TWrGawPOA2jgyACwpRjnrF26Eb1DkCFqSGEDvHt5c+EErIQoDpGjjT2SvzMnTq1iDp8E0i7/DBN7RgXKViNhn9a+rlzZCWxV3EpDfLnRbp2lY++4jQI2O/xqOCpULFob9dbEiffIbTBoc/W9sYoFrWHvjqAimIHn/lV"
)
total_acumulat = 0.0
def obtenir_total_tiquet(response):
paraules_clau = [
"TOTAL", "TOTAL DUE", "IMPORT", "IMPORT TOTAL",
"A PAGAR", "TOTAL A PAGAR", "AMOUNT", "AMOUNT DUE"
]
linies = []
for bloc in response["Blocks"]:
if bloc["BlockType"] == "LINE":
linies.append(bloc["Text"])
for i, linia in enumerate(linies):
text = linia.upper()
if "SUBTOTAL" in text:
continue
for paraula in paraules_clau:
if paraula in text:
numeros = re.findall(r"\d+[.,]\d{2}", linia)
if numeros:
return numeros[-1]
for j in range(1, 4):
if i + j < len(linies):
numeros = re.findall(r"\d+[.,]\d{2}", linies[i + j])
if numeros:
return numeros[-1]
return None
def formatar_total(total_text):
if total_text is None:
return None
total_text = total_text.replace(",", ".")
try:
return round(float(total_text), 2)
except:
return None
def processar_tiquet(ruta_imatge):
global total_acumulat
try:
with open(ruta_imatge, "rb") as f:
imatge_bytes = f.read()
response = textract.analyze_document(
Document={"Bytes": imatge_bytes},
FeatureTypes=["FORMS"]
)
total_text = obtenir_total_tiquet(response)
total_num = formatar_total(total_text)
if total_num is not None:
total_acumulat += total_num
return f"{total_num:.2f}", f"{total_acumulat:.2f}", "OK"
else:
return "No detectat", f"{total_acumulat:.2f}", "No s'ha pogut detectar"
except Exception as e:
return "Error", f"{total_acumulat:.2f}", str(e)
with gr.Blocks() as demo:
gr.Markdown("# Extractor de totals de tiquets Toni Vivas")
gr.Markdown(
"Puja una imatge d'un tiquet de compra i l'aplicació extraura l'import total "
"i anira acumulant els imports dels diferents tiquets."
)
with gr.Row():
with gr.Column(scale=1):
imatge_input = gr.Image(
label="Puja una imatge del tiquet",
type="filepath",
height=420
)
with gr.Column(scale=1):
import_detectat = gr.Textbox(
label="Import detectat",
interactive=False
)
import_acumulat = gr.Textbox(
label="Import acumulat",
interactive=False
)
estat = gr.Textbox(
label="Estat",
interactive=False
)
boto = gr.Button("Analitzar")
boto.click(
fn=processar_tiquet,
inputs=imatge_input,
outputs=[import_detectat, import_acumulat, estat]
)
demo.launch()