histlearn commited on
Commit
e91764d
1 Parent(s): b34943b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +14 -119
app.py CHANGED
@@ -121,35 +121,25 @@ 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 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()
@@ -157,58 +147,17 @@ def extrair_tabelas_pdf(pdf_path):
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
@@ -230,47 +179,14 @@ def extrair_tabelas_pdf(pdf_path):
230
  if df_notas is None:
231
  raise ValueError("Tabela de notas não encontrada")
232
 
233
- # Adicionar informações do aluno ao DataFrame
234
- df_notas.attrs.update(info_aluno)
235
-
236
- print("\nInformações finais encontradas:")
237
- for campo, valor in info_aluno.items():
238
- print(f"{campo}: {valor}")
239
 
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."""
@@ -563,33 +479,12 @@ def gerar_relatorio_pdf(df, disciplinas_dados, grafico_basica, grafico_diversifi
563
  pdf.line(10, pdf.get_y(), 200, pdf.get_y())
564
  pdf.ln(5)
565
 
566
- pdf.set_font('Helvetica', '', 11)
567
- if hasattr(df, 'attrs'):
568
- nome = df.attrs.get('nome', 'Nome não encontrado')
569
- ra = df.attrs.get('ra', 'RA não encontrado')
570
- escola = df.attrs.get('escola', 'Escola não encontrada')
571
- turma = df.attrs.get('turma', 'Turma não encontrada')
572
-
573
- # Adicionar rótulos em negrito
574
  pdf.set_font('Helvetica', 'B', 11)
575
  pdf.cell(30, 7, 'Nome:', 0, 0)
576
  pdf.set_font('Helvetica', '', 11)
577
- pdf.cell(0, 7, nome, 0, new_x=XPos.LMARGIN, new_y=YPos.NEXT)
578
-
579
- pdf.set_font('Helvetica', 'B', 11)
580
- pdf.cell(30, 7, 'RA:', 0, 0)
581
- pdf.set_font('Helvetica', '', 11)
582
- pdf.cell(0, 7, ra, 0, new_x=XPos.LMARGIN, new_y=YPos.NEXT)
583
-
584
- pdf.set_font('Helvetica', 'B', 11)
585
- pdf.cell(30, 7, 'Escola:', 0, 0)
586
- pdf.set_font('Helvetica', '', 11)
587
- pdf.cell(0, 7, escola, 0, new_x=XPos.LMARGIN, new_y=YPos.NEXT)
588
-
589
- pdf.set_font('Helvetica', 'B', 11)
590
- pdf.cell(30, 7, 'Turma:', 0, 0)
591
- pdf.set_font('Helvetica', '', 11)
592
- pdf.cell(0, 7, turma, 0, new_x=XPos.LMARGIN, new_y=YPos.NEXT)
593
 
594
  pdf.ln(10)
595
 
 
121
  return sum(freq_validas) / len(freq_validas)
122
 
123
  def extrair_tabelas_pdf(pdf_path):
124
+ """Extrai tabelas do PDF usando stream apenas para o nome e lattice para notas."""
125
  try:
126
+ # Extrair nome do aluno usando stream
 
 
 
127
  tables_header = camelot.read_pdf(
128
  pdf_path,
129
  pages='1',
130
  flavor='stream',
131
+ edge_tol=500
132
  )
133
 
134
+ info_aluno = {}
135
 
136
+ # Procurar apenas o nome do aluno
137
  for table in tables_header:
138
  df = table.df
 
 
 
 
139
  for i in range(len(df)):
140
  for j in range(len(df.columns)):
141
  texto = str(df.iloc[i,j]).strip()
 
 
142
  if 'Nome do Aluno' in texto:
 
143
  try:
144
  if j + 1 < len(df.columns):
145
  nome = str(df.iloc[i,j+1]).strip()
 
147
  nome = str(df.iloc[i+1,j]).strip()
148
  if nome and nome != 'Nome do Aluno:':
149
  info_aluno['nome'] = nome
150
+ break
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
151
  except:
152
  continue
153
 
154
+ # Extrair tabela de notas usando lattice
155
  tables_notas = camelot.read_pdf(
156
  pdf_path,
157
  pages='all',
158
  flavor='lattice'
159
  )
160
 
 
 
161
  # Encontrar tabela de notas (procurar a maior tabela com 'Disciplina')
162
  df_notas = None
163
  max_rows = 0
 
179
  if df_notas is None:
180
  raise ValueError("Tabela de notas não encontrada")
181
 
182
+ # Adicionar apenas o nome ao DataFrame
183
+ df_notas.attrs['nome'] = info_aluno.get('nome', 'Nome não encontrado')
 
 
 
 
184
 
185
  return df_notas
186
 
187
  except Exception as e:
188
+ print(f"Erro na extração das tabelas: {str(e)}")
189
+ raise
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
190
 
191
  def obter_disciplinas_validas(df):
192
  """Identifica disciplinas válidas no boletim com seus dados."""
 
479
  pdf.line(10, pdf.get_y(), 200, pdf.get_y())
480
  pdf.ln(5)
481
 
482
+ # Mostrar apenas o nome
483
+ if hasattr(df, 'attrs') and 'nome' in df.attrs:
 
 
 
 
 
 
484
  pdf.set_font('Helvetica', 'B', 11)
485
  pdf.cell(30, 7, 'Nome:', 0, 0)
486
  pdf.set_font('Helvetica', '', 11)
487
+ pdf.cell(0, 7, df.attrs['nome'], 0, new_x=XPos.LMARGIN, new_y=YPos.NEXT)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
488
 
489
  pdf.ln(10)
490