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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +84 -34
app.py CHANGED
@@ -121,81 +121,103 @@ 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 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,7 +226,6 @@ def extrair_tabelas_pdf(pdf_path):
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")
@@ -219,8 +240,37 @@ def extrair_tabelas_pdf(pdf_path):
219
  return df_notas
220
 
221
  except Exception as e:
222
- print(f"Erro na extração das tabelas: {str(e)}")
223
- raise
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
224
 
225
  def obter_disciplinas_validas(df):
226
  """Identifica disciplinas válidas no boletim com seus dados."""
 
121
  return sum(freq_validas) / len(freq_validas)
122
 
123
  def extrair_tabelas_pdf(pdf_path):
124
+ """Extrai tabelas do PDF usando múltiplas abordagens."""
125
  try:
126
+ info_aluno = {}
127
+ print("Iniciando extração de informações...")
128
+
129
+ # Primeira tentativa: Extrair toda a primeira página com stream
130
  tables_header = camelot.read_pdf(
131
  pdf_path,
132
  pages='1',
133
  flavor='stream',
134
+ edge_tol=500 # Aumentar tolerância para detectar bordas
135
  )
136
 
137
+ print(f"Tabelas encontradas na primeira tentativa: {len(tables_header)}")
 
138
 
139
+ # Processar todas as tabelas encontradas
140
  for table in tables_header:
141
  df = table.df
142
+ print("\nAnalisando tabela:")
143
  print(df)
144
 
145
+ # Procurar em cada célula da tabela
146
  for i in range(len(df)):
147
+ for j in range(len(df.columns)):
148
+ texto = str(df.iloc[i,j]).strip()
 
149
 
150
+ # Nome do Aluno
151
+ if 'Nome do Aluno' in texto:
152
+ # Tentar diferentes posições para o valor
153
  try:
154
+ if j + 1 < len(df.columns):
155
+ nome = str(df.iloc[i,j+1]).strip()
156
+ elif i + 1 < len(df):
157
+ nome = str(df.iloc[i+1,j]).strip()
158
+ if nome and nome != 'Nome do Aluno:':
159
  info_aluno['nome'] = nome
160
  print(f"Nome encontrado: {nome}")
161
  except:
162
+ continue
163
 
164
+ # RA
165
+ elif 'RA' in texto and len(texto) < 5: # Para evitar falsos positivos
166
  try:
167
+ if j + 1 < len(df.columns):
168
+ ra = str(df.iloc[i,j+1]).strip()
169
+ elif i + 1 < len(df):
170
+ ra = str(df.iloc[i+1,j]).strip()
171
+ if ra and ra != 'RA:':
172
  info_aluno['ra'] = ra
173
  print(f"RA encontrado: {ra}")
174
  except:
175
+ continue
176
 
177
+ # Escola
178
+ elif 'Escola' in texto:
179
  try:
180
+ if j + 1 < len(df.columns):
181
+ escola = str(df.iloc[i,j+1]).strip()
182
+ elif i + 1 < len(df):
183
+ escola = str(df.iloc[i+1,j]).strip()
184
+ if escola and escola != 'Escola:':
185
  info_aluno['escola'] = escola
186
  print(f"Escola encontrada: {escola}")
187
  except:
188
+ continue
189
 
190
+ # Turma
191
+ elif 'Turma' in texto:
192
  try:
193
+ if j + 1 < len(df.columns):
194
+ turma = str(df.iloc[i,j+1]).strip()
195
+ elif i + 1 < len(df):
196
+ turma = str(df.iloc[i+1,j]).strip()
197
+ if turma and turma != 'Turma:':
198
  info_aluno['turma'] = turma
199
  print(f"Turma encontrada: {turma}")
200
  except:
201
+ continue
202
 
203
+ # Segunda parte: Extrair tabela de notas usando lattice
204
  tables_notas = camelot.read_pdf(
205
  pdf_path,
206
  pages='all',
207
  flavor='lattice'
208
  )
209
 
210
+ print(f"\nTabelas de notas encontradas: {len(tables_notas)}")
211
 
212
+ # Encontrar tabela de notas (procurar a maior tabela com 'Disciplina')
213
  df_notas = None
214
+ max_rows = 0
215
+
216
  for table in tables_notas:
217
  df_temp = table.df
218
+ if len(df_temp) > max_rows and 'Disciplina' in str(df_temp.iloc[0,0]):
219
+ max_rows = len(df_temp)
220
+ df_notas = df_temp.copy()
221
  df_notas = df_notas.rename(columns={
222
  0: 'Disciplina',
223
  1: 'Nota B1', 2: 'Freq B1', 3: '%Freq B1', 4: 'AC B1',
 
226
  13: 'Nota B4', 14: 'Freq B4', 15: '%Freq B4', 16: 'AC B4',
227
  17: 'CF', 18: 'Nota Final', 19: 'Freq Final', 20: 'AC Final'
228
  })
 
229
 
230
  if df_notas is None:
231
  raise ValueError("Tabela de notas não encontrada")
 
240
  return df_notas
241
 
242
  except Exception as e:
243
+ print(f"Erro detalhado na extração: {str(e)}")
244
+ print("Tentando abordagem alternativa...")
245
+
246
+ try:
247
+ # Tentativa alternativa usando apenas lattice
248
+ tables = camelot.read_pdf(pdf_path, pages='all', flavor='lattice')
249
+ if len(tables) > 0:
250
+ df = tables[0].df
251
+ df_notas = None
252
+
253
+ for table in tables:
254
+ if 'Disciplina' in str(table.df.iloc[0,0]):
255
+ df_notas = table.df
256
+ df_notas = df_notas.rename(columns={
257
+ 0: 'Disciplina',
258
+ 1: 'Nota B1', 2: 'Freq B1', 3: '%Freq B1', 4: 'AC B1',
259
+ 5: 'Nota B2', 6: 'Freq B2', 7: '%Freq B2', 8: 'AC B2',
260
+ 9: 'Nota B3', 10: 'Freq B3', 11: '%Freq B3', 12: 'AC B3',
261
+ 13: 'Nota B4', 14: 'Freq B4', 15: '%Freq B4', 16: 'AC B4',
262
+ 17: 'CF', 18: 'Nota Final', 19: 'Freq Final', 20: 'AC Final'
263
+ })
264
+ break
265
+
266
+ if df_notas is not None:
267
+ return df_notas
268
+
269
+ raise ValueError("Não foi possível extrair as tabelas em nenhuma tentativa")
270
+
271
+ except Exception as e2:
272
+ print(f"Erro na tentativa alternativa: {str(e2)}")
273
+ raise
274
 
275
  def obter_disciplinas_validas(df):
276
  """Identifica disciplinas válidas no boletim com seus dados."""