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.
 
 
 
 

90 lines
3.4 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
def generer_appreciation_pour_eleve(eleve, eleves_json):
eleve_data = next((e for e in eleves_json if e["eleve"] == eleve), None)
if not eleve_data:
return f"Aucun élève trouvé avec le nom {eleve}"
completion = openai.ChatCompletion.create(
model="ft:gpt-4o-2024-08-06:personal:app-gen-gangneux2:AYJecsON",
messages=[
{"role": "system", "content": "Rédige une appréciation générale (500 caractères max) pour cet élève"},
{"role": "user", "content": dumps(eleve_data["appreciations"])}
],
temperature=0.7,
presence_penalty=0.6,
frequency_penalty=0.6,
top_p=0.5)
return completion.choices[0].message.content