Spaces:
Sleeping
Sleeping
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") |