histlearn commited on
Commit
9c35944
·
verified ·
1 Parent(s): c2fd37f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +19 -24
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('Arial', 'B', 16)
159
- pdf.cell(0, 10, 'Relatório de Desempenho Escolar', 0, 1, 'C')
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('Arial', 'B', 12)
168
- pdf.cell(0, 10, 'Avisos Importantes:', 0, 1, 'L')
169
- pdf.set_font('Arial', '', 10)
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, 1, 'L')
 
182
  if media_freq < 75:
183
- pdf.cell(0, 10, f'- {disciplina}: Frequência abaixo de 75% ({media_freq:.1f}%)', 0, 1, 'L')
 
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
- if col in df.columns:
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
- # Verificar se o PDF foi gerado
256
- if not os.path.exists(pdf_path) or os.path.getsize(pdf_path) == 0:
257
- return None, "Erro ao gerar o relatório PDF."
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 pdf_content, "Relatório gerado com sucesso!"
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")