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