From 3e98ca373f0cbcf49d0ee2c1e24a59973c45a329 Mon Sep 17 00:00:00 2001 From: Guido van Dijk Date: Tue, 22 Sep 2026 21:27:26 +0200 Subject: [PATCH] fix(pptx): notitiemaster in presentation.xml, anders laat PowerPoint de notities weg python-pptx schrijft het onderdeel wel maar noemt het niet in presentation.xml; nu wordt notesMasterIdLst toegevoegd op de schemaplek, direct na sldMasterIdLst. Co-Authored-By: Claude Opus 5 --- 00-lezing/lezing-wat-is-een-ai-agent.pptx | Bin 1596155 -> 1596172 bytes 00-sessie/sessie-agents-en-projecten.pptx | Bin 3039721 -> 3039736 bytes _gereedschap/maak_pptx.py | 32 +++++++++++++++++++++- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/00-lezing/lezing-wat-is-een-ai-agent.pptx b/00-lezing/lezing-wat-is-een-ai-agent.pptx index 9511c9ee3a7cabc7c5de013d532348652b052e9f..bc7c04865eb0314611f5527e9b67408536faa11f 100644 GIT binary patch delta 4543 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 SSzZ9Z+etuT6z&5M_x}Lmh~5PN delta 4218 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 diff --git a/00-sessie/sessie-agents-en-projecten.pptx b/00-sessie/sessie-agents-en-projecten.pptx index 588218ea824af27e74129d6b3106d54982cccc45..8ecacb72d5cbf5bbb34142e0afa14429021e6888 100644 GIT binary patch delta 6816 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 CjRHmh delta 6752 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 G7wiA{&lhn3 diff --git a/_gereedschap/maak_pptx.py b/_gereedschap/maak_pptx.py index b669fd5..2de6ad3 100644 --- a/_gereedschap/maak_pptx.py +++ b/_gereedschap/maak_pptx.py @@ -18,6 +18,7 @@ Vereist: pdftoppm (Poppler) en python-pptx. """ import json import re +import zipfile import subprocess import sys import tempfile @@ -112,7 +113,36 @@ for n, sid in enumerate(deck["order"]): uit = pdf.with_suffix(".pptx") prs.save(str(uit)) + +def repareer_notitiemaster(pad: Path) -> bool: + """python-pptx schrijft de notitiemaster wel als onderdeel, maar noemt hem niet in + presentation.xml. PowerPoint laat de notities dan weg. Deze reparatie zet de ontbrekende + regel erin, op de plek die het schema voorschrijft: direct na de dia-master.""" + with zipfile.ZipFile(pad) as bron: + pres = bron.read("ppt/presentation.xml").decode("utf-8") + if "notesMasterIdLst" in pres: + return False + rels = bron.read("ppt/_rels/presentation.xml.rels").decode("utf-8") + m = re.search(r'Id="([^"]+)"[^>]*notesMaster[^>]*/>', rels) + if not m: + return False + pres = pres.replace( + "", + f'' + f"", 1) + onderdelen = [(i, bron.read(i.filename)) for i in bron.infolist()] + tijdelijk = pad.with_suffix(".tmp") + with zipfile.ZipFile(tijdelijk, "w", zipfile.ZIP_DEFLATED) as nieuw_zip: + for info, data in onderdelen: + nieuw_zip.writestr(info, pres.encode("utf-8") if info.filename == "ppt/presentation.xml" else data) + tijdelijk.replace(pad) + return True + + +gerepareerd = repareer_notitiemaster(uit) + # 4. de dia-bestanden terugzetten op de publieke versie subprocess.run([sys.executable, str(MAP / "maak_dias.py")], check=True, capture_output=True) soort = "uitgebreide begeleidersnotities (privé, niet delen)" if PRIVE else "de notities uit de dia's" -print(f"{uit.name}: {uit.stat().st_size // 1024} kB, {len(deck['order'])} dia's, met {soort}") +print(f"{uit.name}: {uit.stat().st_size // 1024} kB, {len(deck['order'])} dia's, met {soort}" + + (", notitiemaster toegevoegd" if gerepareerd else ""))