Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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
|
125 |
try:
|
126 |
-
|
|
|
|
|
|
|
127 |
tables_header = camelot.read_pdf(
|
128 |
pdf_path,
|
129 |
pages='1',
|
130 |
flavor='stream',
|
131 |
-
|
132 |
)
|
133 |
|
134 |
-
|
135 |
-
print("Extraindo informações do cabeçalho...")
|
136 |
|
137 |
-
# Processar tabelas
|
138 |
for table in tables_header:
|
139 |
df = table.df
|
140 |
-
print("\
|
141 |
print(df)
|
142 |
|
|
|
143 |
for i in range(len(df)):
|
144 |
-
|
145 |
-
|
146 |
-
texto = str(row[j]).strip()
|
147 |
|
148 |
-
|
|
|
|
|
149 |
try:
|
150 |
-
|
151 |
-
|
|
|
|
|
|
|
152 |
info_aluno['nome'] = nome
|
153 |
print(f"Nome encontrado: {nome}")
|
154 |
except:
|
155 |
-
|
156 |
|
157 |
-
|
|
|
158 |
try:
|
159 |
-
|
160 |
-
|
|
|
|
|
|
|
161 |
info_aluno['ra'] = ra
|
162 |
print(f"RA encontrado: {ra}")
|
163 |
except:
|
164 |
-
|
165 |
|
166 |
-
|
|
|
167 |
try:
|
168 |
-
|
169 |
-
|
|
|
|
|
|
|
170 |
info_aluno['escola'] = escola
|
171 |
print(f"Escola encontrada: {escola}")
|
172 |
except:
|
173 |
-
|
174 |
|
175 |
-
|
|
|
176 |
try:
|
177 |
-
|
178 |
-
|
|
|
|
|
|
|
179 |
info_aluno['turma'] = turma
|
180 |
print(f"Turma encontrada: {turma}")
|
181 |
except:
|
182 |
-
|
183 |
|
184 |
-
# Extrair tabela de notas usando lattice
|
185 |
tables_notas = camelot.read_pdf(
|
186 |
pdf_path,
|
187 |
pages='all',
|
188 |
flavor='lattice'
|
189 |
)
|
190 |
|
191 |
-
print(f"\nTabelas de notas
|
192 |
|
193 |
-
# Encontrar a tabela
|
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 |
-
|
|
|
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
|
223 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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."""
|