Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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
|
125 |
try:
|
126 |
-
# Extrair
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
|
|
132 |
|
133 |
info_aluno = {}
|
|
|
134 |
|
135 |
-
#
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
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 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
172 |
df_notas = None
|
173 |
-
|
174 |
-
|
175 |
-
for idx, table in enumerate(tables):
|
176 |
df_temp = table.df
|
177 |
-
if
|
178 |
-
|
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 |
-
|
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:
|