BoletimSed / app.py
histlearn's picture
Update app.py
6b9ba8d verified
raw
history blame
4.94 kB
pdf.cell(0, 7, f'- {disc}:', 0, new_x=XPos.LMARGIN, new_y=YPos.NEXT, align='L')
pdf.set_font('Helvetica', '', 10)
for aviso in avisos:
pdf.cell(10) # Indentação
pdf.cell(0, 7, f'- {aviso}', 0, new_x=XPos.LMARGIN, new_y=YPos.NEXT, align='L')
else:
pdf.cell(0, 7, 'Nenhum problema identificado.', 0, new_x=XPos.LMARGIN, new_y=YPos.NEXT, align='L')
# Rodapé
pdf.set_y(-30)
pdf.line(10, pdf.get_y(), 200, pdf.get_y())
pdf.ln(5)
pdf.set_font('Helvetica', 'I', 8)
pdf.cell(0, 10, 'Este relatório é uma análise automática e deve ser validado junto à secretaria da escola.',
0, new_x=XPos.LMARGIN, new_y=YPos.NEXT, align='C')
# Salvar PDF
temp_pdf = tempfile.NamedTemporaryFile(delete=False, suffix='.pdf')
pdf_path = temp_pdf.name
pdf.output(pdf_path)
return pdf_path
def processar_boletim(file):
"""Função principal que processa o boletim e gera o relatório."""
temp_dir = None
try:
if file is None:
return None, "Nenhum arquivo foi fornecido."
temp_dir = tempfile.mkdtemp()
print(f"Diretório temporário criado: {temp_dir}")
if not hasattr(file, 'name') or not os.path.exists(file.name):
return None, "Arquivo inválido ou corrompido."
if os.path.getsize(file.name) == 0:
return None, "O arquivo está vazio."
temp_pdf = os.path.join(temp_dir, 'boletim.pdf')
shutil.copy2(file.name, temp_pdf)
print(f"PDF copiado para: {temp_pdf}")
if not os.path.exists(temp_pdf) or os.path.getsize(temp_pdf) == 0:
return None, "Erro ao copiar o arquivo."
print("Iniciando extração das tabelas...")
df = extrair_tabelas_pdf(temp_pdf)
print("Tabelas extraídas com sucesso")
if df is None or df.empty:
return None, "Não foi possível extrair dados do PDF."
try:
# Processar disciplinas
disciplinas_dados = obter_disciplinas_validas(df)
if not disciplinas_dados:
return None, "Nenhuma disciplina válida encontrada no boletim."
# Separar disciplinas por categoria
categorias = separar_disciplinas_por_categoria(disciplinas_dados)
nivel = categorias['nivel']
nivel_texto = "Ensino Médio" if nivel == "medio" else "Ensino Fundamental"
# Gerar gráficos
print("Gerando gráficos...")
grafico_basica = plotar_evolucao_bimestres(
categorias['formacao_basica'],
temp_dir,
titulo=f"Evolução das Médias - Formação Geral Básica ({nivel_texto})",
nome_arquivo='evolucao_basica.png'
)
grafico_diversificada = plotar_evolucao_bimestres(
categorias['diversificada'],
temp_dir,
titulo=f"Evolução das Médias - Parte Diversificada ({nivel_texto})",
nome_arquivo='evolucao_diversificada.png'
)
grafico_medias = plotar_graficos_destacados(disciplinas_dados, temp_dir)
print("Gráficos gerados")
# Gerar PDF
print("Gerando relatório PDF...")
pdf_path = gerar_relatorio_pdf(df, disciplinas_dados, grafico_basica, grafico_diversificada, grafico_medias)
print("Relatório PDF gerado")
# Criar arquivo de retorno
output_file = tempfile.NamedTemporaryFile(delete=False, suffix='.pdf')
output_path = output_file.name
shutil.copy2(pdf_path, output_path)
return output_path, "Relatório gerado com sucesso!"
except Exception as e:
return None, f"Erro ao processar os dados: {str(e)}"
except Exception as e:
print(f"Erro durante o processamento: {str(e)}")
return None, f"Erro ao processar o boletim: {str(e)}"
finally:
if temp_dir and os.path.exists(temp_dir):
try:
shutil.rmtree(temp_dir)
print("Arquivos temporários limpos")
except Exception as e:
print(f"Erro ao limpar arquivos temporários: {str(e)}")
# Interface Gradio
iface = gr.Interface(
fn=processar_boletim,
inputs=gr.File(label="Upload do Boletim (PDF)"),
outputs=[
gr.File(label="Relatório (PDF)"),
gr.Textbox(label="Status")
],
title="Análise de Boletim Escolar",
description="Faça upload do boletim em PDF para gerar um relatório com análises e visualizações.",
allow_flagging="never"
)
if __name__ == "__main__":
iface.launch(server_name="0.0.0.0")