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
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
|
|
|