Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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
|
125 |
try:
|
126 |
-
|
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
|
135 |
)
|
136 |
|
137 |
-
|
138 |
|
139 |
-
#
|
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 |
-
|
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 |
-
#
|
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
|
234 |
-
df_notas.attrs.
|
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
|
244 |
-
|
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 |
-
|
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 |
|