You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

72 lines
2.7 KiB

from json import dumps
import pdfplumber
import openai
from PyPDF2 import PdfReader
from django.conf import settings
openai.api_key = settings.OPENAI_API_KEY
def convertPdfToJSON(file):
eleve_id = 1
eleves = []
pdf = pdfplumber.open(file)
for page in pdf.pages:
curent_page = []
write = False
eleve_found = False
app_gen = ""
current_eleve = {"eleve_id": "",
"eleve": "",
"app_generale": "",
"appreciations": []}
# lecture ligne par ligne
lines = page.extract_text().split('\n')
for i, line in enumerate(lines):
# Attendre la ligne qui se termine par " Trimestre"
if not write:
if line.strip().endswith("Trimestre"):
write = True
continue
# Enregistrer la ligne suivante (nom de l'élève)
if write and not eleve_found:
eleve_nom = line.strip()
# Vérifier si l'élève n'est pas déjà dans la liste et que le bulletin ne tient pas sur plusieurs pages
if not any(e["eleve"] == eleve_nom for e in eleves) and not line.strip().endswith("élèves)"):
current_eleve["eleve_id"] = f"ELEVE{eleve_id}"
current_eleve["eleve"] = eleve_nom
eleve_id += 1
eleve_found = True
else:
# Si l'élève est déjà trouvé, on prend le dernier élève de la liste auquel on va ajouter les données de la nouvelle page
current_eleve = eleves.pop()
eleve_found = True
continue
# Si on a trouvé l'élève, on cherche l'appréciation générale
if eleve_found and line.strip().startswith("Appréciation globale :"):
app_gen = line.strip().split(":", 1)[-1].strip()
continue
# Si on a trouvé l'appréciation générale, on continue à la lire jusqu'à la ligne "Le Chef d'établissement"
if app_gen:
if not line.strip().startswith("Le Chef d'établissement"):
app_gen += line.strip()+" "
else:
current_eleve["app_generale"] = app_gen
continue
# récupération des tableaux
tables = page.extract_tables()
tables = tables[0][2:]
for table in tables:
if table[1] != None and table[-1] != None:
current_eleve["appreciations"].append({"matiere": table[1].split('\n')[0], "appreciation": table[-1]})
eleves.append(current_eleve)
return eleves