diff --git a/app/scodoc/sco_bulletins.py b/app/scodoc/sco_bulletins.py
index 5279ab98b7f8194b020f2c05b184248c5cb19412..73de955675a2d78ca62fb3ed1da659c75b7c1907 100644
--- a/app/scodoc/sco_bulletins.py
+++ b/app/scodoc/sco_bulletins.py
@@ -682,6 +682,38 @@ def get_etud_rangs_groups(
     return rang_gr, ninscrits_gr, gr_name
 
 
+def dict_infos_parcours_etud(etudid: int, formsemestre: FormSemestre) -> dict:
+    """Retourne un dictionnaire avec les informations sur le parcours de l'étudiant:
+    parcours_titre, parcours_code, refcomp_specialite, refcomp_specialite_long
+    Si non BUT, tous les champs sont vides.
+    """
+    infos = {
+        "parcours_titre": "",
+        "parcours_code": "",
+        "refcomp_specialite": "",
+        "refcomp_specialite_long": "",
+    }
+    # Parcours BUT
+    if formsemestre.formation.is_apc():
+        res: ResultatsSemestreBUT = res_sem.load_formsemestre_results(formsemestre)
+        try:
+            parcour_id = res.etuds_parcour_id[etudid]
+        except KeyError as exc:
+            log("sco_bulletins: ScoTemporaryError 240222")
+            raise ScoTemporaryError() from exc
+        parcour: ApcParcours = (
+            db.session.get(ApcParcours, parcour_id) if parcour_id is not None else None
+        )
+        if parcour:
+            infos["parcours_titre"] = parcour.libelle or ""
+            infos["parcours_code"] = parcour.code or ""
+            refcomp = parcour.referentiel
+            if refcomp:
+                infos["refcomp_specialite"] = refcomp.specialite
+                infos["refcomp_specialite_long"] = refcomp.specialite_long
+    return infos
+
+
 def etud_descr_situation_semestre(
     etudid,
     formsemestre: FormSemestre,
@@ -734,28 +766,7 @@ def etud_descr_situation_semestre(
 
     infos["descr_defaillance"] = ""
 
-    # Parcours BUT
-    infos["parcours_titre"] = ""
-    infos["parcours_code"] = ""
-    infos["refcomp_specialite"] = ""
-    infos["refcomp_specialite_long"] = ""
-    if formsemestre.formation.is_apc():
-        res: ResultatsSemestreBUT = res_sem.load_formsemestre_results(formsemestre)
-        try:
-            parcour_id = res.etuds_parcour_id[etudid]
-        except KeyError as exc:
-            log("sco_bulletins: ScoTemporaryError 240222")
-            raise ScoTemporaryError() from exc
-        parcour: ApcParcours = (
-            db.session.get(ApcParcours, parcour_id) if parcour_id is not None else None
-        )
-        if parcour:
-            infos["parcours_titre"] = parcour.libelle or ""
-            infos["parcours_code"] = parcour.code or ""
-            refcomp = parcour.referentiel
-            if refcomp:
-                infos["refcomp_specialite"] = refcomp.specialite
-                infos["refcomp_specialite_long"] = refcomp.specialite_long
+    infos.update(dict_infos_parcours_etud(etudid, formsemestre))
 
     # Décision: valeurs par defaut vides:
     infos["decision_jury"] = infos["descr_decision_jury"] = ""
diff --git a/app/scodoc/sco_pv_lettres_inviduelles.py b/app/scodoc/sco_pv_lettres_inviduelles.py
index 053eed1bfdcb98ec0ee6f317d0dd7d98a181c98c..888b90459370e83cde95629416e56f3381713ffb 100644
--- a/app/scodoc/sco_pv_lettres_inviduelles.py
+++ b/app/scodoc/sco_pv_lettres_inviduelles.py
@@ -46,6 +46,7 @@ from app import db
 from app.models import FormSemestre, Identite, ValidationDUT120
 
 import app.scodoc.sco_utils as scu
+from app.scodoc import sco_bulletins
 from app.scodoc import sco_bulletins_pdf
 from app.scodoc import sco_pv_dict
 from app.scodoc import sco_pdf
@@ -96,6 +97,8 @@ def pdf_lettres_individuelles(
         ):  # decision prise
             etud = Identite.get_etud(decision["identite"]["etudid"])
             params["nomEtud"] = etud.nomprenom  # backward compat
+            params.update(sco_bulletins.dict_infos_parcours_etud(etud.id, formsemestre))
+
             bookmarks[npages + 1] = scu.suppress_accents(etud.nomprenom)
             try:
                 objects += pdf_lettre_individuelle(