histlearn commited on
Commit
9eb6463
1 Parent(s): 50785d0

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +70 -55
app.py CHANGED
@@ -121,62 +121,81 @@ def calcular_frequencia_media(frequencias):
121
  return sum(freq_validas) / len(freq_validas)
122
 
123
  def extrair_tabelas_pdf(pdf_path):
124
- """Extrai tabelas do PDF e retorna um DataFrame processado."""
125
  try:
126
- # Extrair todas as tabelas
127
- tables = camelot.read_pdf(pdf_path, pages='all', flavor='lattice')
128
- print(f"Tabelas extraídas: {len(tables)}")
129
-
130
- if len(tables) == 0:
131
- raise ValueError("Nenhuma tabela foi extraída do PDF.")
 
132
 
133
  info_aluno = {}
 
134
 
135
- # Primeira tabela deve conter as informações do aluno
136
- primeira_tabela = tables[0].df
137
-
138
- # Iterar por cada linha da primeira tabela
139
- for i in range(len(primeira_tabela)):
140
- linha_atual = primeira_tabela.iloc[i].astype(str)
141
- linha_seguinte = primeira_tabela.iloc[i + 1].astype(str) if i + 1 < len(primeira_tabela) else None
142
 
143
- # Procurar cada informação específica
144
- for col in range(len(linha_atual)):
145
- valor = str(linha_atual[col]).strip()
146
-
147
- if "Nome do Aluno:" in valor and linha_seguinte is not None:
148
- nome = str(linha_seguinte[col]).strip()
149
- if nome and nome != "Nome do Aluno:":
150
- info_aluno['nome'] = nome
151
- print(f"Nome encontrado: {nome}")
152
-
153
- elif "RA:" in valor and linha_seguinte is not None:
154
- ra = str(linha_seguinte[col]).strip()
155
- if ra and ra != "RA:":
156
- info_aluno['ra'] = ra
157
- print(f"RA encontrado: {ra}")
158
-
159
- elif "Escola:" in valor and linha_seguinte is not None:
160
- escola = str(linha_seguinte[col]).strip()
161
- if escola and escola != "Escola:":
162
- info_aluno['escola'] = escola
163
- print(f"Escola encontrada: {escola}")
164
-
165
- elif "Turma:" in valor and linha_seguinte is not None:
166
- turma = str(linha_seguinte[col]).strip()
167
- if turma and turma != "Turma:":
168
- info_aluno['turma'] = turma
169
- print(f"Turma encontrada: {turma}")
170
-
171
- # Encontrar a tabela de notas (geralmente a maior tabela)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
172
  df_notas = None
173
- maior_tabela = 0
174
-
175
- for idx, table in enumerate(tables):
176
  df_temp = table.df
177
- if len(df_temp) > maior_tabela and 'Disciplina' in str(df_temp.iloc[0,0]):
178
- maior_tabela = len(df_temp)
179
- df_notas = df_temp.copy()
180
  df_notas = df_notas.rename(columns={
181
  0: 'Disciplina',
182
  1: 'Nota B1', 2: 'Freq B1', 3: '%Freq B1', 4: 'AC B1',
@@ -185,6 +204,7 @@ def extrair_tabelas_pdf(pdf_path):
185
  13: 'Nota B4', 14: 'Freq B4', 15: '%Freq B4', 16: 'AC B4',
186
  17: 'CF', 18: 'Nota Final', 19: 'Freq Final', 20: 'AC Final'
187
  })
 
188
 
189
  if df_notas is None:
190
  raise ValueError("Tabela de notas não encontrada")
@@ -192,15 +212,10 @@ def extrair_tabelas_pdf(pdf_path):
192
  # Adicionar informações do aluno ao DataFrame
193
  df_notas.attrs.update(info_aluno)
194
 
195
- # Debug: mostrar todas as informações encontradas
196
- print("\nInformações do aluno encontradas:")
197
  for campo, valor in info_aluno.items():
198
  print(f"{campo}: {valor}")
199
 
200
- # Debug: mostrar primeira tabela para verificação
201
- print("\nPrimeira tabela (para debug):")
202
- print(primeira_tabela)
203
-
204
  return df_notas
205
 
206
  except Exception as e:
 
121
  return sum(freq_validas) / len(freq_validas)
122
 
123
  def extrair_tabelas_pdf(pdf_path):
124
+ """Extrai tabelas do PDF usando stream para cabeçalho e lattice para notas."""
125
  try:
126
+ # Extrair cabeçalho usando stream (melhor para texto)
127
+ tables_header = camelot.read_pdf(
128
+ pdf_path,
129
+ pages='1',
130
+ flavor='stream',
131
+ table_areas=['0,700,600,850'] # Ajuste esta área conforme necessário
132
+ )
133
 
134
  info_aluno = {}
135
+ print("Extraindo informações do cabeçalho...")
136
 
137
+ # Processar tabelas do cabeçalho
138
+ for table in tables_header:
139
+ df = table.df
140
+ print("\nConteúdo da tabela:")
141
+ print(df)
 
 
142
 
143
+ for i in range(len(df)):
144
+ row = df.iloc[i]
145
+ for j in range(len(row)):
146
+ texto = str(row[j]).strip()
147
+
148
+ if 'Nome do Aluno:' in texto:
149
+ try:
150
+ nome = str(df.iloc[i, j+1]).strip() if j+1 < len(row) else str(df.iloc[i+1, 0]).strip()
151
+ if nome and not nome.startswith('Nome'):
152
+ info_aluno['nome'] = nome
153
+ print(f"Nome encontrado: {nome}")
154
+ except:
155
+ pass
156
+
157
+ elif 'RA:' in texto:
158
+ try:
159
+ ra = str(df.iloc[i, j+1]).strip() if j+1 < len(row) else str(df.iloc[i+1, 0]).strip()
160
+ if ra and not ra.startswith('RA'):
161
+ info_aluno['ra'] = ra
162
+ print(f"RA encontrado: {ra}")
163
+ except:
164
+ pass
165
+
166
+ elif 'Escola:' in texto:
167
+ try:
168
+ escola = str(df.iloc[i, j+1]).strip() if j+1 < len(row) else str(df.iloc[i+1, 0]).strip()
169
+ if escola and not escola.startswith('Escola'):
170
+ info_aluno['escola'] = escola
171
+ print(f"Escola encontrada: {escola}")
172
+ except:
173
+ pass
174
+
175
+ elif 'Turma:' in texto:
176
+ try:
177
+ turma = str(df.iloc[i, j+1]).strip() if j+1 < len(row) else str(df.iloc[i+1, 0]).strip()
178
+ if turma and not turma.startswith('Turma'):
179
+ info_aluno['turma'] = turma
180
+ print(f"Turma encontrada: {turma}")
181
+ except:
182
+ pass
183
+
184
+ # Extrair tabela de notas usando lattice (melhor para tabelas estruturadas)
185
+ tables_notas = camelot.read_pdf(
186
+ pdf_path,
187
+ pages='all',
188
+ flavor='lattice'
189
+ )
190
+
191
+ print(f"\nTabelas de notas extraídas: {len(tables_notas)}")
192
+
193
+ # Encontrar a tabela de notas
194
  df_notas = None
195
+ for table in tables_notas:
 
 
196
  df_temp = table.df
197
+ if 'Disciplina' in str(df_temp.iloc[0,0]):
198
+ df_notas = df_temp
 
199
  df_notas = df_notas.rename(columns={
200
  0: 'Disciplina',
201
  1: 'Nota B1', 2: 'Freq B1', 3: '%Freq B1', 4: 'AC B1',
 
204
  13: 'Nota B4', 14: 'Freq B4', 15: '%Freq B4', 16: 'AC B4',
205
  17: 'CF', 18: 'Nota Final', 19: 'Freq Final', 20: 'AC Final'
206
  })
207
+ break
208
 
209
  if df_notas is None:
210
  raise ValueError("Tabela de notas não encontrada")
 
212
  # Adicionar informações do aluno ao DataFrame
213
  df_notas.attrs.update(info_aluno)
214
 
215
+ print("\nInformações finais encontradas:")
 
216
  for campo, valor in info_aluno.items():
217
  print(f"{campo}: {valor}")
218
 
 
 
 
 
219
  return df_notas
220
 
221
  except Exception as e: