File size: 4,940 Bytes
dc51dea
0a9f35f
a9b8de4
354a499
 
a9b8de4
 
1a31ba8
a9b8de4
354a499
0a9f35f
 
a9b8de4
354a499
 
120f658
a9b8de4
120f658
 
 
 
 
dd811fe
 
 
120f658
9f42eeb
 
 
 
 
 
6b9ba8d
 
 
 
 
 
9f42eeb
6b9ba8d
 
9f42eeb
 
6b9ba8d
9f42eeb
 
6b9ba8d
 
9f42eeb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a9b8de4
 
 
3a3ebd5
9f42eeb
a9b8de4
 
 
 
 
 
 
6c00cd0
a9b8de4
 
120f658
 
9f42eeb
6c00cd0
dd811fe
 
 
 
c2fd37f
dd811fe
 
 
120f658
ed7c43c
4afeb84
 
6b9ba8d
4afeb84
 
 
 
 
 
ed7c43c
4afeb84
 
120f658
fa4e027
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
            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")