<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>PPTX Reverse Engineering on File Format Blog</title>
    <link>https://blog.fileformat.com/nl/tag/pptx-reverse-engineering/</link>
    <description>Recent content in PPTX Reverse Engineering on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>nl</language>
    <lastBuildDate>Wed, 16 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.fileformat.com/nl/tag/pptx-reverse-engineering/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>PPTX Reverse Engineering: PowerPoint-bestanden intern begrijpen</title>
      <link>https://blog.fileformat.com/nl/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</link>
      <pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blog.fileformat.com/nl/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</guid>
      <description>Ontdek wat er echt in een `.pptx`-bestand zit. Leer hoe OpenXML-verpakking, relatiegrafieken, vormen en tekenmarkeringen onder de motorkap werken.</description>
      <content:encoded><![CDATA[<p><strong>Laatst bijgewerkt</strong>: 16 sept., 2026</p>
<figure class="align-center ">
    <img loading="lazy" src="images/pptx-reverse-engineering-understanding-powerpoint-files-internally.png#center"
         alt="PPTX Reverse Engineering: Understanding PowerPoint Files Internally"/> 
</figure>

<hr>
<h2 id="reverse-engineering-pptx4-bestanden-een-gids-voor-ontwikkelaars">Reverse Engineering <a href="https://docs.fileformat.com/presentation/pptx/">PPTX</a> Bestanden: Een gids voor ontwikkelaars</h2>
<p>Moderne presentatiedeks drijven alles aan, van investeerderspitches tot interne kwartaalcijfers. Maar als je ooit programmatisch tekst moest extraheren, sjablonen tijdens runtime moest vervangen, geautomatiseerde dia-generatoren moest bouwen, of vertrouwelijke presentaties moest saneren, heb je waarschijnlijk al snel iets gerealiseerd: standaard high‑level presentatielibraries kunnen aanvoelen als een onvoorspelbare black box.</p>
<p>Wanneer bibliotheken zoals <a href="https://products.fileformat.com/presentation/python/python-pptx/"><code>python-pptx</code></a>, <a href="https://products.fileformat.com/presentation/java/apache-poi-xslf/">Apache POI</a> of <a href="https://products.fileformat.com/presentation/net/openxmlsdk/">OpenXML SDK</a> hun grenzen bereiken — of ongedocumenteerde lay-outbugs introduceren — is de enige uitweg erdoorheen. Je moet begrijpen wat een PowerPoint‑presentatie eigenlijk is op byte‑ en schema‑niveau.</p>
<p>In deze diepgaande duik zullen we het gordijn oplichten over het <code>.pptx</code>‑formaat, de interne structuur uitpakken, de relatiegrafiek volgen, de tekenhiërarchieën ontleden, en kijken naar praktische strategieën voor reverse engineering, inspectie en manipulatie van presentaties met ruwe code.</p>
<h2 id="1-wat-is-een-pptx-bestand-echt">1. Wat is een <code>.pptx</code>-bestand echt?</h2>
<p>In essentie is een <code>.pptx</code>-bestand geen propriëtair monolithisch binair bestand zoals het oude <code>.ppt</code>-formaat uit de jaren 90. Sinds Microsoft Office Open XML (ECMA-376 en ISO/IEC 29500) heeft geïntroduceerd, zijn moderne Office-documenten <strong>Open Packaging Conventions (OPC)-archieven</strong>.</p>
<p>In eenvoudige bewoordingen: <strong>een <code>.pptx</code>-bestand is simpelweg een zip-archief dat XML-documenten en media‑assets bevat, georganiseerd in een deterministische mapstructuur.</strong></p>
<p>Je kunt dit in enkele seconden aantonen met standaard terminalgereedschap:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># Rename the extension and unpack it</span>
</span></span><span style="display:flex;"><span>cp presentation.pptx presentation.zip
</span></span><span style="display:flex;"><span>unzip presentation.zip -d presentation_unpacked/
</span></span><span style="display:flex;"><span>cd presentation_unpacked/
</span></span><span style="display:flex;"><span>tree -L <span style="color:#ae81ff">2</span>
</span></span></code></pre></div><p>De resulterende mapstructuur ziet er opmerkelijk consistent uit:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>.
</span></span><span style="display:flex;"><span>├── [Content_Types].xml
</span></span><span style="display:flex;"><span>├── _rels/
</span></span><span style="display:flex;"><span>│   └── .rels
</span></span><span style="display:flex;"><span>├── docProps/
</span></span><span style="display:flex;"><span>│   ├── app.xml
</span></span><span style="display:flex;"><span>│   └── core.xml
</span></span><span style="display:flex;"><span>└── ppt/
</span></span><span style="display:flex;"><span>    ├── presentation.xml
</span></span><span style="display:flex;"><span>    ├── _rels/
</span></span><span style="display:flex;"><span>    ├── slides/
</span></span><span style="display:flex;"><span>    ├── slideLayouts/
</span></span><span style="display:flex;"><span>    ├── slideMasters/
</span></span><span style="display:flex;"><span>    ├── theme/
</span></span><span style="display:flex;"><span>    └── media/
</span></span></code></pre></div><p>Elk afzonderlijk visueel asset, elke overgang, slide‑master‑overerving, tekstvakcoördinaat en vectorafbeelding is gecodeerd in deze bestandshiërarchie.</p>
<h2 id="2-anatomie-van-het-pakket-belangrijke-subsystemen">2. Anatomie van het pakket: belangrijke subsystemen</h2>
<p>Om presentaties effectief te reverse‑engineeren, moet je de verantwoordelijkheden van elk top‑level component begrijpen.</p>
<h3 id="content_typesxml"><code>[Content_Types].xml</code></h3>
<p>Dit is het ingangsmanifest voor de OPC-lezer. Het koppelt bestandsextensies en expliciete interne onderdeelnamen aan gestandaardiseerde MIME-/contenttypes. Als je een nieuwe dia maakt of een afbeelding toevoegt en deze niet declareert in <code>[Content_Types].xml</code>, zal PowerPoint de presentatie als corrupt aangeven en om herstel vragen.</p>
<p>Voorbeeldfragment:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span><span style="color:#f92672">&lt;Types</span> <span style="color:#a6e22e">xmlns=</span><span style="color:#e6db74">&#34;http://schemas.openxmlformats.org/package/2006/content-types&#34;</span><span style="color:#f92672">&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;Default</span> <span style="color:#a6e22e">Extension=</span><span style="color:#e6db74">&#34;xml&#34;</span> <span style="color:#a6e22e">ContentType=</span><span style="color:#e6db74">&#34;application/xml&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;Default</span> <span style="color:#a6e22e">Extension=</span><span style="color:#e6db74">&#34;rels&#34;</span> <span style="color:#a6e22e">ContentType=</span><span style="color:#e6db74">&#34;application/vnd.openxmlformats-package.relationships+xml&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;Default</span> <span style="color:#a6e22e">Extension=</span><span style="color:#e6db74">&#34;png&#34;</span> <span style="color:#a6e22e">ContentType=</span><span style="color:#e6db74">&#34;image/png&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;Override</span> <span style="color:#a6e22e">PartName=</span><span style="color:#e6db74">&#34;/ppt/presentation.xml&#34;</span> 
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">ContentType=</span><span style="color:#e6db74">&#34;application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">&lt;/Types&gt;</span>
</span></span></code></pre></div><h3 id="de-_rels-relatiegrafiek">De <code>_rels/</code> Relatiegrafiek</h3>
<p>Een van de belangrijkste concepten in OpenXML is <strong>indirectie via relaties</strong>. Onderdelen verwijzen zelden rechtstreeks naar ruwe bestands­paden. In plaats daarvan heeft een bestand (bijv. <code>slide1.xml</code>) een bijbehorend relatiebestand dat zich bevindt in een broederlijke <code>_rels</code> map (bijv. <code>_rels/slide1.xml.rels</code>).</p>
<p>Relaties definiëren:</p>
<ul>
<li>Hyperlinks (<code>r:id=\&quot;rId2\&quot;</code>, TargetMode=&quot;External&quot;)</li>
<li>Afbeeldingen en audiotracks opgeslagen in <code>ppt/media/</code></li>
<li>Layout‑erfenis‑pointers (<code>slideLayout1.xml</code>)</li>
<li>Notitieslides, opmerkingen en ingesloten lettertypen</li>
</ul>
<h3 id="docprops-metadata"><code>docProps/</code> (Metadata)</h3>
<ul>
<li><strong><code>core.xml</code></strong>: Dublin Core‑metadata—auteur, titel, aanmaakdatum, wijzigings‑tijdstempel.</li>
<li><strong><code>app.xml</code></strong>: Toepassingsspecifieke statistieken—PowerPoint‑versie, totaal aantal dia&rsquo;s, aantal verborgen dia&rsquo;s, woordtelling, namen van presentatiesjablonen.</li>
</ul>
<h3 id="ppt-de-presentatiemotor"><code>ppt/</code> (De presentatiemotor)</h3>
<p>Dit is waar de daadwerkelijke presentatie zich bevindt:</p>
<ul>
<li><strong><code>presentation.xml</code></strong>: De master‑ruggengraat. Het registreert dia‑ID&rsquo;s, dia‑afmetingsdimensies, notitie‑masterreferenties en standaardlettertype‑instellingen.</li>
<li><strong><code>slides/</code></strong>: De individuele dia&rsquo;s (<code>slide1.xml</code>, <code>slide2.xml</code>, enz.).</li>
<li><strong><code>slideLayouts/</code></strong>: Master‑structuur‑presets (Titel-dia, Twee‑kolom, Sectiekop).</li>
<li><strong><code>slideMasters/</code></strong>: Globale stijlen, standaardpaletten, achtergrondvullingen en plaatsaanduidings‑overerving.</li>
<li><strong><code>theme/</code></strong>: Kleurpaletten (accent 1 tot 6, donkere/licht variaties) en lettertype‑schema&rsquo;s (hoofd‑/sublettertypen).</li>
<li><strong><code>media/</code></strong>: Raw images (PNG, JPEG, SVG), audio, and video files.</li>
</ul>
<h2 id="3-een-dia-ontleden-de-presentationml-p--drawingml-a-dialecten">3. Een dia ontleden: de PresentationML (<code>p:</code>) &amp; DrawingML (<code>a:</code>) dialecten</h2>
<p>Wanneer je <code>ppt/slides/slide1.xml</code> opent, kom je twee primaire XML‑naamruimtes tegen:</p>
<ol>
<li><strong>PresentationML (<code>p:</code>)</strong>: Governs structural presentation elements (slides, shape trees, canvas groups).</li>
<li><strong>DrawingML (<code>a:</code>)</strong>: Governs typography, geometry, 2D coordinates, gradient fills, and vector rendering.</li>
</ol>
<p>Hier is een vereenvoudigd voorbeeld van hoe een standaard tekstvorm eruitziet:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span><span style="color:#f92672">&lt;p:sp&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e">&lt;!-- 1. Non-visual shape properties (Identifiers, names) --&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;p:nvSpPr&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;p:cNvPr</span> <span style="color:#a6e22e">id=</span><span style="color:#e6db74">&#34;4&#34;</span> <span style="color:#a6e22e">name=</span><span style="color:#e6db74">&#34;Title Box 1&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;p:cNvSpPr&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&lt;a:spLocks</span> <span style="color:#a6e22e">noGrp=</span><span style="color:#e6db74">&#34;1&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/p:cNvSpPr&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;p:nvPr&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&lt;p:ph</span> <span style="color:#a6e22e">type=</span><span style="color:#e6db74">&#34;title&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/p:nvPr&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;/p:nvSpPr&gt;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e">&lt;!-- 2. Visual shape properties (Position, size, geometry) --&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;p:spPr&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;a:xfrm&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&lt;a:off</span> <span style="color:#a6e22e">x=</span><span style="color:#e6db74">&#34;1524000&#34;</span> <span style="color:#a6e22e">y=</span><span style="color:#e6db74">&#34;1143000&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&lt;a:ext</span> <span style="color:#a6e22e">cx=</span><span style="color:#e6db74">&#34;9144000&#34;</span> <span style="color:#a6e22e">cy=</span><span style="color:#e6db74">&#34;1828800&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/a:xfrm&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;a:prstGeom</span> <span style="color:#a6e22e">prst=</span><span style="color:#e6db74">&#34;rect&#34;</span><span style="color:#f92672">&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&lt;a:avLst/&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/a:prstGeom&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;a:solidFill&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&lt;a:schemeClr</span> <span style="color:#a6e22e">val=</span><span style="color:#e6db74">&#34;accent1&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/a:solidFill&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;/p:spPr&gt;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e">&lt;!-- 3. Text Body (Paragraphs, runs, styling) --&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;p:txBody&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;a:bodyPr</span> <span style="color:#a6e22e">rtlCol=</span><span style="color:#e6db74">&#34;0&#34;</span> <span style="color:#a6e22e">anchor=</span><span style="color:#e6db74">&#34;ctr&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;a:lstStyle/&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;a:p&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&lt;a:r&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&lt;a:rPr</span> <span style="color:#a6e22e">lang=</span><span style="color:#e6db74">&#34;en-US&#34;</span> <span style="color:#a6e22e">sz=</span><span style="color:#e6db74">&#34;3200&#34;</span> <span style="color:#a6e22e">b=</span><span style="color:#e6db74">&#34;1&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&lt;a:t&gt;</span>Mission Critical Architecture<span style="color:#f92672">&lt;/a:t&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&lt;/a:r&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/a:p&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;/p:txBody&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">&lt;/p:sp&gt;</span>
</span></span></code></pre></div><h3 id="cruciale-meeteenheden-emus-en-honderdsten-van-een-punt">Cruciale meeteenheden: EMU&rsquo;s en honderdsten van een punt</h3>
<p>Let op de coördinatennummers in <code>&lt;a:xfrm&gt;</code>:</p>
<ul>
<li><code>x=&quot;1524000&quot;</code></li>
<li><code>cx=&quot;9144000&quot;</code></li>
</ul>
<p>Dit zijn <strong>English Metric Units (EMUs)</strong>.</p>
<ul>
<li>$1 \text{ inch} = 914,400 \text{ EMUs}$</li>
<li>$1 \text{ cm} = 360,000 \text{ EMUs}$</li>
<li>$1 \text{ pt} = 12,700 \text{ EMUs}$</li>
</ul>
<p>EMU&rsquo;s stellen gehele getallen in staat exacte breuken van zowel inches als millimeters weer te geven zonder afrondingsfouten van floating‑point getallen op verschillende hardware‑architecturen.</p>
<p>Let ook op de lettergrootte:</p>
<ul>
<li><code>sz=&quot;3200&quot;</code> means <strong>32.00 pt</strong>. Font sizes in DrawingML are measured in hundredths of a point.</li>
</ul>
<h2 id="4-de-overervingsketen-waarom-vormen-onzichtbare-stijlen-overerven">4. De overervingsketen: waarom vormen onzichtbare stijlen overerven</h2>
<p>Een van de meest voorkomende valkuilen bij het reverse engineeren van PPTX‑bestanden is ervan uitgaan dat de visuele styling van een vorm volledig is gedeclareerd in zijn eigen <code>slideX.xml</code>.</p>
<p>In werkelijkheid vertrouwt OpenXML op een strikt <strong>4‑laag cascaderend overervingsmodel</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>[Theme: ppt/theme/theme1.xml]
</span></span><span style="display:flex;"><span>              │
</span></span><span style="display:flex;"><span>              ▼
</span></span><span style="display:flex;"><span>[Slide Master: ppt/slideMasters/slideMaster1.xml]
</span></span><span style="display:flex;"><span>              │
</span></span><span style="display:flex;"><span>              ▼
</span></span><span style="display:flex;"><span>[Slide Layout: ppt/slideLayouts/slideLayout1.xml]
</span></span><span style="display:flex;"><span>              │
</span></span><span style="display:flex;"><span>              ▼
</span></span><span style="display:flex;"><span>[Slide: ppt/slides/slide1.xml]
</span></span></code></pre></div><p>Als een tekstvak op <code>slide1.xml</code> bevat:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span><span style="color:#f92672">&lt;a:p&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;a:r&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;a:t&gt;</span>Revenue Projections<span style="color:#f92672">&lt;/a:t&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;/a:r&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">&lt;/a:p&gt;</span>
</span></span></code></pre></div><p>Er is geen lettertypefamilie, geen expliciete kleur en geen grootte gedeclareerd in de run (<code>&lt;a:r&gt;</code>). Om te achterhalen hoe PowerPoint deze tekst rendert, moet uw parser:</p>
<ol>
<li>Identify the placeholder type (<code>&lt;p:ph type=&quot;title&quot;/&gt;</code>).</li>
<li>Read the layout referenced in <code>slide1.xml.rels</code>.</li>
<li>Check if <code>slideLayout1.xml</code> provides styling overrides for that placeholder.</li>
<li>Fall back to <code>slideMaster1.xml</code> for default title text body styles.</li>
<li>Trace color tokens like <code>accent1</code> or <code>tx1</code> into <code>theme1.xml</code> to find the hexadecimal color code.</li>
</ol>
<p>Als u deze overervingsgrafiek overslaat, zal uw parser stijlen verkeerd lezen, waardoor lettertypen, lettergroottes en lay-outankers ontbreken.</p>
<h2 id="5-praktische-reverse-engineering-werkwijze">5. Praktische Reverse Engineering-werkwijze</h2>
<p>Wanneer u moet onderzoeken hoe een bepaalde PowerPoint-functie onder de motorkap werkt (bijv. morph-transities, complexe tabellen, vectorpaden), volg dan deze empirische aanpak:</p>
<h3 id="stap-1-maak-een-minimale-diff-pair">Stap 1: Maak een minimale &ldquo;Diff Pair&rdquo;</h3>
<ol>
<li>Open PowerPoint and create a blank slide.</li>
<li>Save it as <code>before.pptx</code>.</li>
<li>Apply the exact single change you wish to reverse engineer (e.g., add a drop shadow to a circle, change a bullet style, insert an embedded video).</li>
<li>Save it as <code>after.pptx</code>.</li>
</ol>
<h3 id="stap-2-pak-beide-archieven-uit">Stap 2: Pak beide archieven uit</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>unzip before.pptx -d before/
</span></span><span style="display:flex;"><span>unzip after.pptx -d after/
</span></span></code></pre></div><h3 id="stap-3-formatteer-de-xml">Stap 3: Formatteer de XML</h3>
<p>Ruwe XML in Office-archieven wordt meestal ontdaan van inspringing en regeleinde-tekens. Formatteer de bestanden vóór het vergelijken:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>find before/ after/ -name <span style="color:#e6db74">&#34;*.xml&#34;</span> -exec xmllint --format <span style="color:#f92672">{}</span> --output <span style="color:#f92672">{}</span> <span style="color:#ae81ff">\;</span>
</span></span></code></pre></div><h3 id="stap-4-voer-een-unified-diff-uit">Stap 4: Voer een Unified Diff uit</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>diff -uNr before/ after/ &gt; changes.patch
</span></span></code></pre></div><p>Het bekijken van <code>changes.patch</code> onthult de exacte tagnaam, namespace-attribuut en containerhiërarchie die PowerPoint heeft geïntroduceerd. Dit is de snelste manier om ongedocumenteerde of obscure schema-eigenschappen te ontdekken zonder door duizenden pagina&rsquo;s ECMA-376-documentatie te graven.</p>
<h2 id="6-een-aangepaste-micro-engine-bouwen-uitpakken-wijzigen-opnieuw-inpakken">6. Een aangepaste micro-engine bouwen: uitpakken, wijzigen, opnieuw inpakken</h2>
<p>Soms wil je geen zware enterprise-afhankelijkheid zoals Apache POI of de Microsoft OpenXML SDK—vooral niet in lichtgewicht serverless-omgevingen (AWS Lambda, Cloudflare Workers, edge-nodes).</p>
<p>Hier is een zelfstandige Python-patroon dat laat zien hoe je veilig een in-memory PPTX kunt uitpakken, aangepaste gegevens kunt injecteren met standaardbibliotheek-tools, en het vervolgens opnieuw kunt verpakken:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">import</span> zipfile
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> io
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> xml.etree.ElementTree <span style="color:#66d9ef">as</span> ET
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">modify_slide_title</span>(input_pptx_bytes: bytes, new_title: str) <span style="color:#f92672">-&gt;</span> bytes:
</span></span><span style="display:flex;"><span>    input_zip <span style="color:#f92672">=</span> zipfile<span style="color:#f92672">.</span>ZipFile(io<span style="color:#f92672">.</span>BytesIO(input_pptx_bytes))
</span></span><span style="display:flex;"><span>    output_buffer <span style="color:#f92672">=</span> io<span style="color:#f92672">.</span>BytesIO()
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">with</span> zipfile<span style="color:#f92672">.</span>ZipFile(output_buffer, <span style="color:#e6db74">&#34;w&#34;</span>, zipfile<span style="color:#f92672">.</span>ZIP_DEFLATED) <span style="color:#66d9ef">as</span> output_zip:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> item <span style="color:#f92672">in</span> input_zip<span style="color:#f92672">.</span>infolist():
</span></span><span style="display:flex;"><span>            content <span style="color:#f92672">=</span> input_zip<span style="color:#f92672">.</span>read(item<span style="color:#f92672">.</span>filename)
</span></span><span style="display:flex;"><span>            
</span></span><span style="display:flex;"><span>            <span style="color:#75715e"># Target slide 1</span>
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> item<span style="color:#f92672">.</span>filename <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;ppt/slides/slide1.xml&#34;</span>:
</span></span><span style="display:flex;"><span>                namespaces <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>                    <span style="color:#e6db74">&#39;p&#39;</span>: <span style="color:#e6db74">&#39;http://schemas.openxmlformats.org/presentationml/2006/main&#39;</span>,
</span></span><span style="display:flex;"><span>                    <span style="color:#e6db74">&#39;a&#39;</span>: <span style="color:#e6db74">&#39;http://schemas.openxmlformats.org/drawingml/2006/main&#39;</span>
</span></span><span style="display:flex;"><span>                }
</span></span><span style="display:flex;"><span>                
</span></span><span style="display:flex;"><span>                <span style="color:#75715e"># Register namespaces to preserve prefixes</span>
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">for</span> prefix, uri <span style="color:#f92672">in</span> namespaces<span style="color:#f92672">.</span>items():
</span></span><span style="display:flex;"><span>                    ET<span style="color:#f92672">.</span>register_namespace(prefix, uri)
</span></span><span style="display:flex;"><span>                    
</span></span><span style="display:flex;"><span>                root <span style="color:#f92672">=</span> ET<span style="color:#f92672">.</span>fromstring(content)
</span></span><span style="display:flex;"><span>                
</span></span><span style="display:flex;"><span>                <span style="color:#75715e"># Find title placeholder text run</span>
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">for</span> title_run <span style="color:#f92672">in</span> root<span style="color:#f92672">.</span>findall(<span style="color:#e6db74">&#34;.//p:sp[p:nvSpPr/p:nvPr/p:ph[@type=&#39;title&#39;]]//a:t&#34;</span>, namespaces):
</span></span><span style="display:flex;"><span>                    title_run<span style="color:#f92672">.</span>text <span style="color:#f92672">=</span> new_title
</span></span><span style="display:flex;"><span>                    <span style="color:#66d9ef">break</span>
</span></span><span style="display:flex;"><span>                
</span></span><span style="display:flex;"><span>                content <span style="color:#f92672">=</span> ET<span style="color:#f92672">.</span>tostring(root, encoding<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;utf-8&#34;</span>, xml_declaration<span style="color:#f92672">=</span><span style="color:#66d9ef">True</span>)
</span></span><span style="display:flex;"><span>            
</span></span><span style="display:flex;"><span>            output_zip<span style="color:#f92672">.</span>writestr(item, content)
</span></span><span style="display:flex;"><span>            
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> output_buffer<span style="color:#f92672">.</span>getvalue()
</span></span></code></pre></div><h3 id="belangrijke-valkuilen-bij-het-wijzigen-van-bestanden-op-byte-niveau">Belangrijke valkuilen bij het wijzigen van bestanden op byte-niveau:</h3>
<ol>
<li><strong>Namespace Preservation</strong>: XML parsers often rewrite prefixes (<code>xmlns:p</code> might become <code>xmlns:ns0</code>). While valid XML, PowerPoint&rsquo;s strict internal schema validation occasionally rejects non-standard prefix aliases. Register namespaces explicitly.</li>
<li><strong>ZIP Compression Methods</strong>: Ensure you write files back using standard deflate compression (<code>zipfile.ZIP_DEFLATED</code>).</li>
<li><strong>Stream Flushing</strong>: Always check that your zip buffer closes and flushes completely before sending bytes downstream.</li>
<li><strong>Preserve Relationships</strong>: If you remove a slide, you must also remove its entry from <code>ppt/presentation.xml</code>, delete its relationship in <code>ppt/_rels/presentation.xml.rels</code>, and scrub its content type from <code>[Content_Types].xml</code>.</li>
</ol>
<h2 id="7-prestaties--en-beveiligingsoverwegingen">7. Prestaties- en beveiligingsoverwegingen</h2>
<p>Reverse engineering van PPTX-bestanden gaat niet alleen over het bewerken van dia&rsquo;s; het gaat ook over het auditen van wat je systemen binnenkomt.</p>
<h3 id="beveiliging-miljard-lachjes--xxe">Beveiliging: Miljard Lachjes &amp; XXE</h3>
<p>Omdat PPTX-bestanden XML parseren, is elke server-side pipeline die door gebruikers ingediende presentaties verwerkt kwetsbaar voor:</p>
<ul>
<li><strong>XML External Entity (XXE) Injection</strong>: Malicious XML attempting to access <code>/etc/passwd</code> or query internal cloud metadata endpoints (<code>http://169.254.169.254/</code>).</li>
<li><strong>Entity Expansion Attacks (Billion Laughs)</strong>: Exponential entity loops exhausting system RAM.</li>
</ul>
<p><strong>Mitigatie</strong>: Schakel altijd <code>resolve_entities</code>, <code>load_dtd</code> en externe netwerkresolutie uit in uw XML-parser (bijv. met <code>defusedxml</code> in Python).</p>
<h3 id="beveiliging-macro-payloads-en-verborgen-streams">Beveiliging: Macro Payloads en Verborgen Streams</h3>
<p>Inspecteer bestanden op <code>.pptm</code>-inhoud die zich voordoet als <code>.pptx</code>-extensies. Let op <code>ppt/vbaProject.bin</code>, dat gecompileerde Visual Basic-code bevat. In standaard <code>.pptx</code>-bestanden is VBA-code verboden; het vinden van binaire payload-referenties in relaties moet onmiddellijk quarantaine‑signalen activeren.</p>
<h2 id="conclusie">Conclusie</h2>
<p>Reverse engineering van <code>.pptx</code>-bestanden ontrafelt presentatiesoftware. Zodra u beseft dat PowerPoint‑bestanden simpelweg gestructureerde zip‑pakketten zijn gevuld met coördinaten, schemareferenties en XML‑relatie‑bomen, bent u niet langer beperkt door bestaande derden‑abstracties.</p>
<p>Of u nu de doorvoersnelheid van slide‑generatie optimaliseert, aangepaste geautomatiseerde sanitizers schrijft, of renderingsfouten oplost, direct naar de onderliggende OpenXML‑architectuur kijken geeft u volledige controle over de presentatiestroom.</p>
<h2 id="veelgestelde-vragen-faq">Veelgestelde vragen (FAQ)</h2>
<p>**Q: Kunt u een .pptx converteren naar een standaard map en bestanden rechtstreeks in een IDE bewerken?</p>
<p><strong>A1:</strong> Ja, u kunt het archief uitpakken, de XML bewerken in een editor zoals VS Code, en de mapinhoud opnieuw zippen om het weer te openen in PowerPoint.</p>
<p>**Q: Waarom zegt PowerPoint dat mijn handmatig aangepaste PPTX‑bestand reparatie nodig heeft?</p>
<p><strong>A2:</strong> Dit gebeurt meestal als je misvormde XML hebt geïntroduceerd, een nieuw asset hebt weggelaten uit <code>[Content_Types].xml</code>, of een zwevende verwijzing hebt achtergelaten in een bijbehorend <code>.rels</code>‑bestand.</p>
<p>**Q: Welke meeteenheid gebruikt PowerPoint voor de positie en marges van vormen?</p>
<p><strong>A3:</strong> PowerPoint gebruikt Engelse metrische eenheden (EMU&rsquo;s), waarbij 1 inch gelijk is aan 914.400 EMU&rsquo;s en 1 punt gelijk is aan 12.700 EMU&rsquo;s.</p>
<p>**Q: Hoe kan ik alle afbeeldingen uit een presentatie <a href="https://products.fileformat.com/presentation/python/python-pptx/">programmeermatig extraheren</a> zonder externe bibliotheken?</p>
<p><strong>A4:</strong> Open eenvoudig het <code>.pptx</code>‑bestand met een standaard zip‑hulpmiddel en extraheer alle binaire bestanden die zich bevinden in de map <code>ppt/media/</code>.</p>
<p>**Q: Is het veilig om door gebruikers geüploade PPTX‑bestanden te parseren met standaard XML‑parsers?</p>
<p><strong>A5:</strong> Nee, je moet je parser versterken of veilige wrappers gebruiken zoals <code>defusedxml</code> om XML External Entity (XXE)‑ en zip‑bom‑aanvallen te blokkeren.</p>
<h2 id="zie-ook">Zie ook</h2>
<ul>
<li><a href="https://blog.fileformat.com/presentation/powerpoint-file-formats/">Presentation File Formats at FileFormat.com?</a></li>
<li><a href="https://blog.fileformat.com/presentation/apache-poi-api-to-access-powerpoint-file-formats/">Java API to Access PowerPoint File Formats</a></li>
<li><a href="https://blog.fileformat.com/presentation/odp-vs-pptx-opendocument-vs-microsoft-powerpoint-format-comparison/">ODP vs PPTX: OpenDocument vs Microsoft PowerPoint Presentation Format Comparison</a></li>
<li><a href="https://blog.fileformat.com/presentation/difference-between-ppt-and-pptx/">Difference Between PPT and PPTX</a></li>
<li><a href="https://blog.fileformat.com/presentation/create-presentation-in-java-with-apache-poi-api/">Create PowerPoint Presentation in Java with Apache POI API</a></li>
</ul>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    
  </channel>
</rss>
