Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -4,6 +4,7 @@ import pandas as pd
|
|
4 |
import matplotlib.pyplot as plt
|
5 |
import numpy as np
|
6 |
from fpdf import FPDF
|
|
|
7 |
import tempfile
|
8 |
import os
|
9 |
import matplotlib
|
@@ -44,7 +45,7 @@ def converter_nota(valor):
|
|
44 |
if pd.isna(valor) or valor == '-' or valor == 'N':
|
45 |
return 0
|
46 |
try:
|
47 |
-
return float(valor.replace(',', '.')) # Tratar decimal com vírgula
|
48 |
except:
|
49 |
return 0
|
50 |
|
@@ -155,8 +156,8 @@ def gerar_relatorio_pdf(df, grafico1_path, grafico2_path):
|
|
155 |
pdf = FPDF()
|
156 |
pdf.add_page()
|
157 |
|
158 |
-
pdf.set_font('
|
159 |
-
pdf.cell(0, 10, 'Relatório de Desempenho Escolar', 0,
|
160 |
pdf.ln(10)
|
161 |
|
162 |
pdf.image(grafico1_path, x=10, w=190)
|
@@ -164,9 +165,9 @@ def gerar_relatorio_pdf(df, grafico1_path, grafico2_path):
|
|
164 |
pdf.image(grafico2_path, x=10, w=190)
|
165 |
pdf.ln(10)
|
166 |
|
167 |
-
pdf.set_font('
|
168 |
-
pdf.cell(0, 10, 'Avisos Importantes:', 0,
|
169 |
-
pdf.set_font('
|
170 |
|
171 |
# Calcular médias
|
172 |
medias_notas = df[['Nota B1', 'Nota B2', 'Nota B3', 'Nota B4']].apply(pd.to_numeric, errors='coerce').mean(axis=1)
|
@@ -178,9 +179,11 @@ def gerar_relatorio_pdf(df, grafico1_path, grafico2_path):
|
|
178 |
|
179 |
for idx, (disciplina, media_nota, media_freq) in enumerate(zip(df['Disciplina'], medias_notas, medias_freq)):
|
180 |
if media_nota < 5:
|
181 |
-
pdf.cell(0, 10, f'- {disciplina}: Média de notas abaixo de 5 ({media_nota:.1f})', 0,
|
|
|
182 |
if media_freq < 75:
|
183 |
-
pdf.cell(0, 10, f'- {disciplina}: Frequência abaixo de 75% ({media_freq:.1f}%)', 0,
|
|
|
184 |
|
185 |
temp_pdf = tempfile.NamedTemporaryFile(delete=False, suffix='.pdf')
|
186 |
pdf_path = temp_pdf.name
|
@@ -220,12 +223,11 @@ def processar_boletim(file):
|
|
220 |
df = extrair_tabelas_pdf(temp_pdf)
|
221 |
print("Tabelas extraídas com sucesso")
|
222 |
|
223 |
-
# Verificar se o DataFrame foi criado corretamente
|
224 |
if df is None or df.empty:
|
225 |
return None, "Não foi possível extrair dados do PDF."
|
226 |
|
|
|
227 |
try:
|
228 |
-
# Renomear colunas
|
229 |
df.columns = ['Disciplina', 'Nota B1', 'Freq B1', '%Freq B1', 'AC B1',
|
230 |
'Nota B2', 'Freq B2', '%Freq B2', 'AC B2',
|
231 |
'Nota B3', 'Freq B3', '%Freq B3', 'AC B3',
|
@@ -237,8 +239,7 @@ def processar_boletim(file):
|
|
237 |
# Processar notas
|
238 |
colunas_notas = ['Nota B1', 'Nota B2', 'Nota B3', 'Nota B4']
|
239 |
for col in colunas_notas:
|
240 |
-
|
241 |
-
df[col] = df[col].apply(converter_nota)
|
242 |
print("Notas processadas")
|
243 |
|
244 |
# Gerar gráficos
|
@@ -252,18 +253,12 @@ def processar_boletim(file):
|
|
252 |
pdf_path = gerar_relatorio_pdf(df, grafico1_path, grafico2_path)
|
253 |
print("Relatório PDF gerado")
|
254 |
|
255 |
-
#
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
# Ler PDF gerado
|
260 |
-
with open(pdf_path, 'rb') as f:
|
261 |
-
pdf_content = f.read()
|
262 |
-
|
263 |
-
if not pdf_content:
|
264 |
-
return None, "O relatório PDF gerado está vazio."
|
265 |
|
266 |
-
return
|
267 |
|
268 |
except Exception as e:
|
269 |
print(f"Erro durante o processamento: {str(e)}")
|
@@ -281,7 +276,7 @@ def processar_boletim(file):
|
|
281 |
# Interface Gradio
|
282 |
iface = gr.Interface(
|
283 |
fn=processar_boletim,
|
284 |
-
inputs=gr.File(label="Upload do Boletim (PDF)"),
|
285 |
outputs=[
|
286 |
gr.File(label="Relatório (PDF)"),
|
287 |
gr.Textbox(label="Status")
|
|
|
4 |
import matplotlib.pyplot as plt
|
5 |
import numpy as np
|
6 |
from fpdf import FPDF
|
7 |
+
from fpdf.enums import XPos, YPos
|
8 |
import tempfile
|
9 |
import os
|
10 |
import matplotlib
|
|
|
45 |
if pd.isna(valor) or valor == '-' or valor == 'N':
|
46 |
return 0
|
47 |
try:
|
48 |
+
return float(str(valor).replace(',', '.')) # Tratar decimal com vírgula
|
49 |
except:
|
50 |
return 0
|
51 |
|
|
|
156 |
pdf = FPDF()
|
157 |
pdf.add_page()
|
158 |
|
159 |
+
pdf.set_font('Helvetica', 'B', 16)
|
160 |
+
pdf.cell(0, 10, 'Relatório de Desempenho Escolar', 0, new_x=XPos.LMARGIN, new_y=YPos.NEXT, align='C')
|
161 |
pdf.ln(10)
|
162 |
|
163 |
pdf.image(grafico1_path, x=10, w=190)
|
|
|
165 |
pdf.image(grafico2_path, x=10, w=190)
|
166 |
pdf.ln(10)
|
167 |
|
168 |
+
pdf.set_font('Helvetica', 'B', 12)
|
169 |
+
pdf.cell(0, 10, 'Avisos Importantes:', 0, new_x=XPos.LMARGIN, new_y=YPos.NEXT, align='L')
|
170 |
+
pdf.set_font('Helvetica', '', 10)
|
171 |
|
172 |
# Calcular médias
|
173 |
medias_notas = df[['Nota B1', 'Nota B2', 'Nota B3', 'Nota B4']].apply(pd.to_numeric, errors='coerce').mean(axis=1)
|
|
|
179 |
|
180 |
for idx, (disciplina, media_nota, media_freq) in enumerate(zip(df['Disciplina'], medias_notas, medias_freq)):
|
181 |
if media_nota < 5:
|
182 |
+
pdf.cell(0, 10, f'- {disciplina}: Média de notas abaixo de 5 ({media_nota:.1f})', 0,
|
183 |
+
new_x=XPos.LMARGIN, new_y=YPos.NEXT, align='L')
|
184 |
if media_freq < 75:
|
185 |
+
pdf.cell(0, 10, f'- {disciplina}: Frequência abaixo de 75% ({media_freq:.1f}%)', 0,
|
186 |
+
new_x=XPos.LMARGIN, new_y=YPos.NEXT, align='L')
|
187 |
|
188 |
temp_pdf = tempfile.NamedTemporaryFile(delete=False, suffix='.pdf')
|
189 |
pdf_path = temp_pdf.name
|
|
|
223 |
df = extrair_tabelas_pdf(temp_pdf)
|
224 |
print("Tabelas extraídas com sucesso")
|
225 |
|
|
|
226 |
if df is None or df.empty:
|
227 |
return None, "Não foi possível extrair dados do PDF."
|
228 |
|
229 |
+
# Renomear colunas para o formato esperado
|
230 |
try:
|
|
|
231 |
df.columns = ['Disciplina', 'Nota B1', 'Freq B1', '%Freq B1', 'AC B1',
|
232 |
'Nota B2', 'Freq B2', '%Freq B2', 'AC B2',
|
233 |
'Nota B3', 'Freq B3', '%Freq B3', 'AC B3',
|
|
|
239 |
# Processar notas
|
240 |
colunas_notas = ['Nota B1', 'Nota B2', 'Nota B3', 'Nota B4']
|
241 |
for col in colunas_notas:
|
242 |
+
df[col] = df[col].apply(converter_nota)
|
|
|
243 |
print("Notas processadas")
|
244 |
|
245 |
# Gerar gráficos
|
|
|
253 |
pdf_path = gerar_relatorio_pdf(df, grafico1_path, grafico2_path)
|
254 |
print("Relatório PDF gerado")
|
255 |
|
256 |
+
# Criar arquivo temporário para retorno
|
257 |
+
output_file = tempfile.NamedTemporaryFile(delete=False, suffix='.pdf')
|
258 |
+
output_path = output_file.name
|
259 |
+
shutil.copy2(pdf_path, output_path)
|
|
|
|
|
|
|
|
|
|
|
|
|
260 |
|
261 |
+
return output_path, "Relatório gerado com sucesso!"
|
262 |
|
263 |
except Exception as e:
|
264 |
print(f"Erro durante o processamento: {str(e)}")
|
|
|
276 |
# Interface Gradio
|
277 |
iface = gr.Interface(
|
278 |
fn=processar_boletim,
|
279 |
+
inputs=gr.File(label="Upload do Boletim (PDF)", type="filepath"),
|
280 |
outputs=[
|
281 |
gr.File(label="Relatório (PDF)"),
|
282 |
gr.Textbox(label="Status")
|