Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -1,3 +1,5 @@
|
|
|
|
|
|
1 |
import fitz
|
2 |
import re
|
3 |
import gradio as gr
|
@@ -56,7 +58,7 @@ def extrair_texto_pdf(pdf_file):
|
|
56 |
texto_ocr = re.sub(r'\s+', ' ', texto_ocr)
|
57 |
return texto_fitz, texto_ocr
|
58 |
|
59 |
-
# Padrões regex para extração de cada exame
|
60 |
exames = {
|
61 |
"LEUCO": r"leuc[óo]citos.*?([\d.,]+)\s?(?:10\^3)?/u?l",
|
62 |
"B": r"bas[óo]filos.*?([\d.,]+)\s?%",
|
@@ -99,10 +101,15 @@ exames = {
|
|
99 |
"LAC": r"lactato.*?([\d.,]+)\s?mmol/l",
|
100 |
"CKMB": r"ck[- ]?mb.*?([\d.,]+)\s?u/l",
|
101 |
"CPK": r"cpk.*?\bresultado\b\s*([\d.,]+)",
|
102 |
-
"TROPO": r"troponina.*?([<>]?[\d.,]+)\s?ng/ml"
|
|
|
|
|
|
|
|
|
|
|
103 |
}
|
104 |
|
105 |
-
# Ordem de saída
|
106 |
ordem = [
|
107 |
"LEUCO","B","SS","EOS","LINF","MONO",
|
108 |
"HB","HT","PLT","AMIL","ÁC UR","BT","BD","BI",
|
@@ -113,7 +120,6 @@ ordem = [
|
|
113 |
"CKMB","CPK","TROPO"
|
114 |
]
|
115 |
|
116 |
-
# Função principal de extração e formatação
|
117 |
def extrair_exames_formatado(pdf_file):
|
118 |
if not pdf_file:
|
119 |
return "Nenhum arquivo enviado.", None
|
@@ -128,16 +134,27 @@ def extrair_exames_formatado(pdf_file):
|
|
128 |
val = m.group(1).replace(',', '.')
|
129 |
break
|
130 |
resultados[rotulo] = classificar(rotulo, val) if val else "—"
|
131 |
-
|
132 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
133 |
df = pd.DataFrame(list(resultados.items()), columns=["Exame","Valor"])
|
134 |
temp = tempfile.NamedTemporaryFile(delete=False, suffix=".csv")
|
135 |
df.to_csv(temp.name, index=False)
|
136 |
-
|
|
|
137 |
|
138 |
# Interface Gradio
|
139 |
with gr.Blocks() as demo:
|
140 |
-
gr.Markdown("## 🧪 Extrator Avançado com OCR
|
141 |
pdf_file = gr.File(label="📄 PDF de exames", file_types=[".pdf"])
|
142 |
btn = gr.Button("🔍 Extrair Exames")
|
143 |
out_txt = gr.Textbox(label="📋 Exames Classificados", lines=12)
|
|
|
1 |
+
# Código completo atualizado com extração de EAS incluída no Gradio
|
2 |
+
|
3 |
import fitz
|
4 |
import re
|
5 |
import gradio as gr
|
|
|
58 |
texto_ocr = re.sub(r'\s+', ' ', texto_ocr)
|
59 |
return texto_fitz, texto_ocr
|
60 |
|
61 |
+
# Padrões regex para extração de cada exame, incluindo EAS
|
62 |
exames = {
|
63 |
"LEUCO": r"leuc[óo]citos.*?([\d.,]+)\s?(?:10\^3)?/u?l",
|
64 |
"B": r"bas[óo]filos.*?([\d.,]+)\s?%",
|
|
|
101 |
"LAC": r"lactato.*?([\d.,]+)\s?mmol/l",
|
102 |
"CKMB": r"ck[- ]?mb.*?([\d.,]+)\s?u/l",
|
103 |
"CPK": r"cpk.*?\bresultado\b\s*([\d.,]+)",
|
104 |
+
"TROPO": r"troponina.*?([<>]?[\d.,]+)\s?ng/ml",
|
105 |
+
# Padrões para EAS
|
106 |
+
"LEUC ESTERASE": r"Leuc[óo]cito esterase\s*[:\-]?\s*([A-Za-z0-9\+\-]+)",
|
107 |
+
"LEUCO EAS": r"Leuc[óo]citos?\s*[:\-]?\s*([\d]+\/\d+)",
|
108 |
+
"HEMA EAS": r"Hem[áa]cias?\s*[:\-]?\s*([\d]+\/\d+)",
|
109 |
+
"BACTERIAS": r"Bact[ée]rias?\s*[:\-]?\s*([A-Za-z]+)"
|
110 |
}
|
111 |
|
112 |
+
# Ordem de saída das chaves (sem EAS)
|
113 |
ordem = [
|
114 |
"LEUCO","B","SS","EOS","LINF","MONO",
|
115 |
"HB","HT","PLT","AMIL","ÁC UR","BT","BD","BI",
|
|
|
120 |
"CKMB","CPK","TROPO"
|
121 |
]
|
122 |
|
|
|
123 |
def extrair_exames_formatado(pdf_file):
|
124 |
if not pdf_file:
|
125 |
return "Nenhum arquivo enviado.", None
|
|
|
134 |
val = m.group(1).replace(',', '.')
|
135 |
break
|
136 |
resultados[rotulo] = classificar(rotulo, val) if val else "—"
|
137 |
+
|
138 |
+
# Monta a parte principal
|
139 |
+
partes = [f"{r}: {resultados[r]}" for r in ordem]
|
140 |
+
texto_main = " / ".join(partes)
|
141 |
+
|
142 |
+
# Monta o segmento de EAS, se presente
|
143 |
+
eas_chaves = ["LEUC ESTERASE","LEUCO EAS","HEMA EAS","BACTERIAS"]
|
144 |
+
eas_partes = [f"{k}: {resultados[k]}" for k in eas_chaves if resultados[k] != "—"]
|
145 |
+
if eas_partes:
|
146 |
+
texto_main = "EAS: " + " / ".join(eas_partes) + " / " + texto_main
|
147 |
+
|
148 |
+
# Gera CSV
|
149 |
df = pd.DataFrame(list(resultados.items()), columns=["Exame","Valor"])
|
150 |
temp = tempfile.NamedTemporaryFile(delete=False, suffix=".csv")
|
151 |
df.to_csv(temp.name, index=False)
|
152 |
+
|
153 |
+
return texto_main, temp.name
|
154 |
|
155 |
# Interface Gradio
|
156 |
with gr.Blocks() as demo:
|
157 |
+
gr.Markdown("## 🧪 Extrator Avançado com OCR e EAS")
|
158 |
pdf_file = gr.File(label="📄 PDF de exames", file_types=[".pdf"])
|
159 |
btn = gr.Button("🔍 Extrair Exames")
|
160 |
out_txt = gr.Textbox(label="📋 Exames Classificados", lines=12)
|