Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -588,36 +588,76 @@ def processar_boletim(file):
|
|
588 |
"""Função principal que processa o boletim e gera o relatório."""
|
589 |
temp_dir = None
|
590 |
try:
|
|
|
|
|
591 |
if file is None:
|
592 |
return None, "Nenhum arquivo foi fornecido."
|
593 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
594 |
temp_dir = tempfile.mkdtemp()
|
595 |
print(f"Diretório temporário criado: {temp_dir}")
|
596 |
|
597 |
-
|
598 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
599 |
|
600 |
if os.path.getsize(file.name) == 0:
|
|
|
601 |
return None, "O arquivo está vazio."
|
602 |
|
|
|
603 |
temp_pdf = os.path.join(temp_dir, 'boletim.pdf')
|
604 |
-
|
605 |
-
|
|
|
|
|
|
|
|
|
606 |
|
607 |
if not os.path.exists(temp_pdf) or os.path.getsize(temp_pdf) == 0:
|
|
|
608 |
return None, "Erro ao copiar o arquivo."
|
609 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
610 |
print("Iniciando extração das tabelas...")
|
611 |
-
|
612 |
-
|
|
|
|
|
|
|
|
|
613 |
|
614 |
if df is None or df.empty:
|
|
|
615 |
return None, "Não foi possível extrair dados do PDF."
|
616 |
|
617 |
try:
|
618 |
# Processar disciplinas
|
619 |
disciplinas_dados = obter_disciplinas_validas(df)
|
620 |
if not disciplinas_dados:
|
|
|
621 |
return None, "Nenhuma disciplina válida encontrada no boletim."
|
622 |
|
623 |
# Separar disciplinas por categoria
|
@@ -642,25 +682,27 @@ def processar_boletim(file):
|
|
642 |
)
|
643 |
|
644 |
grafico_medias = plotar_graficos_destacados(disciplinas_dados, temp_dir)
|
645 |
-
print("Gráficos gerados")
|
646 |
|
647 |
# Gerar PDF
|
648 |
print("Gerando relatório PDF...")
|
649 |
pdf_path = gerar_relatorio_pdf(df, disciplinas_dados, grafico_basica, grafico_diversificada, grafico_medias)
|
650 |
-
print("Relatório PDF gerado")
|
651 |
|
652 |
# Criar arquivo de retorno
|
653 |
output_file = tempfile.NamedTemporaryFile(delete=False, suffix='.pdf')
|
654 |
output_path = output_file.name
|
655 |
shutil.copy2(pdf_path, output_path)
|
|
|
656 |
|
657 |
return output_path, "Relatório gerado com sucesso!"
|
658 |
|
659 |
except Exception as e:
|
|
|
660 |
return None, f"Erro ao processar os dados: {str(e)}"
|
661 |
|
662 |
except Exception as e:
|
663 |
-
print(f"Erro durante o processamento: {str(e)}")
|
664 |
return None, f"Erro ao processar o boletim: {str(e)}"
|
665 |
|
666 |
finally:
|
|
|
588 |
"""Função principal que processa o boletim e gera o relatório."""
|
589 |
temp_dir = None
|
590 |
try:
|
591 |
+
print("Iniciando processamento do arquivo...")
|
592 |
+
|
593 |
if file is None:
|
594 |
return None, "Nenhum arquivo foi fornecido."
|
595 |
|
596 |
+
# Verificar se é realmente um PDF
|
597 |
+
print(f"Nome do arquivo: {file.name}")
|
598 |
+
print(f"Tipo do arquivo: {file.type if hasattr(file, 'type') else 'Tipo não disponível'}")
|
599 |
+
|
600 |
+
if not file.name.lower().endswith('.pdf'):
|
601 |
+
return None, "O arquivo deve ser um PDF."
|
602 |
+
|
603 |
temp_dir = tempfile.mkdtemp()
|
604 |
print(f"Diretório temporário criado: {temp_dir}")
|
605 |
|
606 |
+
# Verificações mais detalhadas do arquivo
|
607 |
+
if not hasattr(file, 'name'):
|
608 |
+
print("Erro: Arquivo não tem atributo 'name'")
|
609 |
+
return None, "Arquivo inválido: formato não reconhecido."
|
610 |
+
|
611 |
+
if not os.path.exists(file.name):
|
612 |
+
print(f"Erro: Arquivo não existe no caminho: {file.name}")
|
613 |
+
return None, "Arquivo não encontrado no sistema."
|
614 |
|
615 |
if os.path.getsize(file.name) == 0:
|
616 |
+
print("Erro: Arquivo tem tamanho zero")
|
617 |
return None, "O arquivo está vazio."
|
618 |
|
619 |
+
# Copiar arquivo para diretório temporário
|
620 |
temp_pdf = os.path.join(temp_dir, 'boletim.pdf')
|
621 |
+
try:
|
622 |
+
shutil.copy2(file.name, temp_pdf)
|
623 |
+
print(f"Arquivo copiado para: {temp_pdf}")
|
624 |
+
except Exception as e:
|
625 |
+
print(f"Erro ao copiar arquivo: {str(e)}")
|
626 |
+
return None, f"Erro ao processar arquivo: {str(e)}"
|
627 |
|
628 |
if not os.path.exists(temp_pdf) or os.path.getsize(temp_pdf) == 0:
|
629 |
+
print("Erro: Arquivo temporário não foi criado corretamente")
|
630 |
return None, "Erro ao copiar o arquivo."
|
631 |
|
632 |
+
# Tentar abrir o PDF para verificar se é válido
|
633 |
+
try:
|
634 |
+
import PyPDF2
|
635 |
+
with open(temp_pdf, 'rb') as pdf_file:
|
636 |
+
pdf_reader = PyPDF2.PdfReader(pdf_file)
|
637 |
+
if len(pdf_reader.pages) == 0:
|
638 |
+
return None, "O PDF está vazio ou corrompido."
|
639 |
+
print(f"PDF válido com {len(pdf_reader.pages)} páginas")
|
640 |
+
except Exception as e:
|
641 |
+
print(f"Erro ao validar PDF: {str(e)}")
|
642 |
+
return None, "O arquivo não é um PDF válido."
|
643 |
+
|
644 |
print("Iniciando extração das tabelas...")
|
645 |
+
try:
|
646 |
+
df = extrair_tabelas_pdf(temp_pdf)
|
647 |
+
print("Tabelas extraídas com sucesso")
|
648 |
+
except Exception as e:
|
649 |
+
print(f"Erro na extração das tabelas: {str(e)}")
|
650 |
+
return None, f"Erro ao extrair dados do PDF: {str(e)}"
|
651 |
|
652 |
if df is None or df.empty:
|
653 |
+
print("Erro: DataFrame vazio após extração")
|
654 |
return None, "Não foi possível extrair dados do PDF."
|
655 |
|
656 |
try:
|
657 |
# Processar disciplinas
|
658 |
disciplinas_dados = obter_disciplinas_validas(df)
|
659 |
if not disciplinas_dados:
|
660 |
+
print("Erro: Nenhuma disciplina válida encontrada")
|
661 |
return None, "Nenhuma disciplina válida encontrada no boletim."
|
662 |
|
663 |
# Separar disciplinas por categoria
|
|
|
682 |
)
|
683 |
|
684 |
grafico_medias = plotar_graficos_destacados(disciplinas_dados, temp_dir)
|
685 |
+
print("Gráficos gerados com sucesso")
|
686 |
|
687 |
# Gerar PDF
|
688 |
print("Gerando relatório PDF...")
|
689 |
pdf_path = gerar_relatorio_pdf(df, disciplinas_dados, grafico_basica, grafico_diversificada, grafico_medias)
|
690 |
+
print("Relatório PDF gerado com sucesso")
|
691 |
|
692 |
# Criar arquivo de retorno
|
693 |
output_file = tempfile.NamedTemporaryFile(delete=False, suffix='.pdf')
|
694 |
output_path = output_file.name
|
695 |
shutil.copy2(pdf_path, output_path)
|
696 |
+
print("Arquivo de saída criado com sucesso")
|
697 |
|
698 |
return output_path, "Relatório gerado com sucesso!"
|
699 |
|
700 |
except Exception as e:
|
701 |
+
print(f"Erro durante o processamento: {str(e)}")
|
702 |
return None, f"Erro ao processar os dados: {str(e)}"
|
703 |
|
704 |
except Exception as e:
|
705 |
+
print(f"Erro geral durante o processamento: {str(e)}")
|
706 |
return None, f"Erro ao processar o boletim: {str(e)}"
|
707 |
|
708 |
finally:
|