<?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-omvänd ingenjörskonst on File Format Blog</title>
    <link>https://blog.fileformat.com/sv/tag/pptx-omv%C3%A4nd-ingenj%C3%B6rskonst/</link>
    <description>Recent content in PPTX-omvänd ingenjörskonst on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>sv</language>
    <lastBuildDate>Wed, 16 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.fileformat.com/sv/tag/pptx-omv%C3%A4nd-ingenj%C3%B6rskonst/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>PPTX-omvänd ingenjörskonst: Förstå PowerPoint-filer internt</title>
      <link>https://blog.fileformat.com/sv/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</link>
      <pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blog.fileformat.com/sv/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</guid>
      <description>Upptäck vad som verkligen finns inuti en `.pptx`-fil. Lär dig hur OpenXML-paketering, relationsgrafer, former och ritningsmarkup fungerar under huven.</description>
      <content:encoded><![CDATA[<p><strong>Senast uppdaterad</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="omvänd-ingenjörskonst-pptx4-filer-en-utvecklares-guide">Omvänd ingenjörskonst <a href="https://docs.fileformat.com/presentation/pptx/">PPTX</a> filer: En utvecklares guide</h2>
<p>Moderna presentationsdäck driver allt från investerarpresentationer till interna kvartalsmått. Men om du någonsin har behövt programatiskt extrahera text, ersätta mallar i realtid, bygga automatiska bildgenererare eller rensa konfidentiella presentationer, har du förmodligen snabbt insett: standardbibliotek på hög nivå för presentationer kan kännas som en oförutsägbar svart låda.</p>
<p>När bibliotek som <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> eller <a href="https://products.fileformat.com/presentation/net/openxmlsdk/">OpenXML SDK</a> når sina gränser—eller introducerar odokumenterade layoutbuggar—är den enda vägen ut att gå igenom. Du måste förstå vad en PowerPoint-presentation faktiskt är på byte- och schemanivå.</p>
<p>I den här djupdykningen kommer vi att dra tillbaka ridån för <code>.pptx</code>-formatet, packa upp dess interna struktur, spåra dess relationsgraf, dissekera dess ritningshierarkier och titta på praktiska strategier för reverse engineering, inspektion och manipulering av presentationer med rå kod.</p>
<h2 id="1-vad-är-en-pptx-fil-egentligen">1. Vad är en <code>.pptx</code>-fil egentligen?</h2>
<p>I grunden är en <code>.pptx</code>-fil inte en proprietär monolitisk binär som det gamla <code>.ppt</code>-formatet från 1990-talet. Sedan Microsoft introducerade Office Open XML (ECMA-376 och ISO/IEC 29500) är moderna Office-dokument <strong>Open Packaging Conventions (OPC)-arkiv</strong>.</p>
<p>På enkla svenska: <strong>en <code>.pptx</code>-fil är helt enkelt ett zip‑arkiv som innehåller XML-dokument och media‑resurser organiserade i ett deterministiskt katalogträd.</strong></p>
<p>Du kan bevisa detta på några sekunder med standardverktyg i terminalen:</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>Det resulterande katalogträdet ser anmärkningsvärt konsekvent ut:</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>Varje enskild visuell resurs, övergång, slide‑master‑arv, textrutans koordinat och vektorgrafik kodas i denna filhierarki.</p>
<h2 id="2-paketets-anatomi-viktiga-delsystem">2. Paketets anatomi: Viktiga delsystem</h2>
<p>För att reverse‑engineera presentationer effektivt måste du förstå ansvaret för varje komponent på toppnivå.</p>
<h3 id="content_typesxml"><code>[Content_Types].xml</code></h3>
<p>Detta är manifestet för OPC‑läsaren. Det mappar filändelser och explicita interna delnamn till standardiserade MIME-/innehållstyper. Om du skapar en ny slide eller lägger till en bild och misslyckas med att deklarera den i <code>[Content_Types].xml</code>, kommer PowerPoint att ange att presentationen är korrupt och be om återställning.</p>
<p>Exempel på kodsnutt:</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="relationsgrafen-_rels">Relationsgrafen <code>_rels/</code></h3>
<p>Ett av de mest avgörande koncepten i OpenXML är <strong>indirektion genom relationer</strong>. Delar pekar sällan direkt på råa filsökvägar. Istället har en fil (t.ex. <code>slide1.xml</code>) en associerad relationsfil som ligger i en syster <code>_rels</code>-mapp (t.ex. <code>_rels/slide1.xml.rels</code>).</p>
<p>Relationer definierar:</p>
<ul>
<li>Hyperlänkar (<code>r:id=&quot;rId2&quot;</code>, TargetMode=&ldquo;External&rdquo;)</li>
<li>Bilder och ljudspår lagrade i <code>ppt/media/</code></li>
<li>Layoutarvspunkter (<code>slideLayout1.xml</code>)</li>
<li>Anteckningsbilder, kommentarer och inbäddade typsnitt</li>
</ul>
<h3 id="docprops-metadata"><code>docProps/</code> (Metadata)</h3>
<ul>
<li><strong><code>core.xml</code></strong>: Dublin Core-metadata—författare, titel, skapandedatum, ändringstidstämpel.</li>
<li><strong><code>app.xml</code></strong>: Applikationsspecifik statistik—PowerPoint-version, totalt antal bilder, dolda bildantal, ordantal, namn på presentationsmallar.</li>
</ul>
<h3 id="ppt-presentationsmotorn"><code>ppt/</code> (Presentationsmotorn)</h3>
<p>Det här är där den faktiska presentationen finns:</p>
<ul>
<li><strong><code>presentation.xml</code></strong>: Huvudspinen. Den registrerar bild-ID:n, bildstorleksdimensioner, referenser till anteckningsmaster och standardteckensnittinställningar.</li>
<li><strong><code>slides/</code></strong>: De individuella bilderna (<code>slide1.xml</code>, <code>slide2.xml</code>, etc.).</li>
<li><strong><code>slideLayouts/</code></strong>: Masterstrukturella förinställningar (Titelsida, Två kolumner, Avsnittsrubrik).</li>
<li><strong><code>slideMasters/</code></strong>: Globala stilar, standardpaletter, bakgrundsfyllningar och ärvning av platshållare.</li>
<li><strong><code>theme/</code></strong>: Färgpaletter (accent 1 till 6, mörka/ljusa varianter) och teckensnittsscheman (huvud-/sekundära teckensnitt).</li>
<li><strong><code>media/</code></strong>: Råbilder (PNG, JPEG, SVG), ljud- och videofiler.</li>
</ul>
<h2 id="3-dissekera-en-bild-presentationml-p-och-drawingml-adialekterna">3. Dissekera en bild: PresentationML (<code>p:</code>)‑ och DrawingML (<code>a:</code>)‑dialekterna</h2>
<p>När du öppnar <code>ppt/slides/slide1.xml</code> stöter du på två primära XML-namnområden:</p>
<ol>
<li><strong>PresentationML (<code>p:</code>)</strong>: Styr strukturella presentations‑element (bilder, formträd, canvas‑grupper).</li>
<li><strong>DrawingML (<code>a:</code>)</strong>: Styr typografi, geometri, 2D‑koordinater, gradientfyllningar och vektorrendering.</li>
</ol>
<p>Här är ett förenklat exempel på hur en standardtextform ser ut:</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="väsentliga-måttenheter-emus-och-hundradelar-av-en-punkt">Väsentliga måttenheter: EMU:s och hundradelar av en punkt</h3>
<p>Observera koordinatnumren i <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>Detta är <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:er tillåter heltal att representera exakta bråkdelar av både tum och millimeter utan flyttalsavrundningsfel på olika hårdvaruarkitekturer.</p>
<p>Observera även teckenstorleken:</p>
<ul>
<li><code>sz=&quot;3200&quot;</code> betyder <strong>32,00 pt</strong>. Teckenstorlekar i DrawingML mäts i hundradelar av en punkt.</li>
</ul>
<h2 id="4-arvskedjan-varför-former-ärver-osynliga-stilar">4. Arvskedjan: varför former ärver osynliga stilar</h2>
<p>En av de vanligaste fallgroparna vid reverse engineering av PPTX-filer är att anta att en forms visuella stil är helt deklarerad i dess egen <code>slideX.xml</code>.</p>
<p>I verkligheten förlitar sig OpenXML på en strikt <strong>4-nivåers kaskadärvsmodell</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>Om en textruta i <code>slide1.xml</code> innehåller:</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>Det finns ingen teckensnittsfamilj, ingen explicit färg och ingen storlek deklarerad på körningen (<code>&lt;a:r&gt;</code>). För att ta reda på hur PowerPoint renderar den här texten måste din parser:</p>
<ol>
<li>Identifiera platshållartypen (<code>&lt;p:ph type=&quot;title&quot;/&gt;</code>).</li>
<li>Läs layouten som refereras i <code>slide1.xml.rels</code>.</li>
<li>Kontrollera om <code>slideLayout1.xml</code> tillhandahåller stilöverskrivningar för den platshållaren.</li>
<li>Falla tillbaka på <code>slideMaster1.xml</code> för standardstil för titeltextens kropp.</li>
<li>Spåra färgtoken som <code>accent1</code> eller <code>tx1</code> i <code>theme1.xml</code> för att hitta den hexadecimala färgkoden.</li>
</ol>
<p>Om du hoppar över detta arvsgraf kommer din parser att missförstå stilar, sakna teckensnitt, teckenstorlekar och layoutankare.</p>
<h2 id="5-praktiskt-arbetsflöde-för-reverse-engineering">5. Praktiskt arbetsflöde för reverse engineering</h2>
<p>När du behöver undersöka hur en specifik PowerPoint-funktion fungerar under huven (t.ex. morph-övergångar, komplexa tabeller, vektorsökvägar), följ detta empiriska tillvägagångssätt:</p>
<h3 id="steg-1-skapa-ett-minimalt-diff-par">Steg 1: Skapa ett minimalt &ldquo;Diff-par&rdquo;</h3>
<ol>
<li>Öppna PowerPoint och skapa en tom bild.</li>
<li>Spara den som <code>before.pptx</code>.</li>
<li>Tillämpa den exakta förändring du vill reverse engineer (t.ex. lägg till en skugga på en cirkel, ändra en punktstil, infoga en inbäddad video).</li>
<li>Spara den som <code>after.pptx</code>.</li>
</ol>
<h3 id="steg-2-packa-upp-båda-arkiven">Steg 2: Packa upp båda arkiven</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="steg-3-formatera-xml">Steg 3: Formatera XML</h3>
<p>Rå XML i Office-arkiv tas vanligtvis bort från indentering och radbrytningstecken. Innan du jämför, formatera filerna:</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="steg-4-kör-en-unified-diff">Steg 4: Kör en unified diff</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>Genom att granska <code>changes.patch</code> avslöjas det exakta taggnamnet, namnrymdsattributet och behållarhierarkin som PowerPoint introducerade. Detta är det snabbaste sättet att upptäcka odokumenterade eller obskyra schemaregenskaper utan att gräva igenom tusentals sidor av ECMA-376-dokumentation.</p>
<h2 id="6-bygga-en-anpassad-mikromotor-packa-upp-modifiera-packa-om">6. Bygga en anpassad mikro‑motor: packa upp, modifiera, packa om</h2>
<p>Ibland vill du inte ha ett tungt företagsberoende som Apache POI eller Microsoft OpenXML SDK—särskilt i lätta serverlösa körningar (AWS Lambda, Cloudflare Workers, edge-noder).</p>
<p>Här är ett fristående Python-mönster som demonstrerar hur man säkert packar upp en PPTX i minnet, injicerar anpassad data med standardbibliotekets verktyg och paketerar om den:</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="viktiga-fallgropar-när-du-modifierar-filer-på-rå-bytenivå">Viktiga fallgropar när du modifierar filer på rå byte‑nivå:</h3>
<ol>
<li><strong>Namespace Preservation</strong>: XML‑tolkar omskriver ofta prefix (<code>xmlns:p</code> kan bli <code>xmlns:ns0</code>). Även om det är giltig XML, avvisar PowerPoints strikta interna schemavalidering ibland icke‑standardiserade prefixalias. Registrera namnrymder explicit.</li>
<li><strong>ZIP Compression Methods</strong>: Se till att du skriver tillbaka filer med standard deflate‑komprimering (<code>zipfile.ZIP_DEFLATED</code>).</li>
<li><strong>Stream Flushing</strong>: Kontrollera alltid att din zip‑buffer stängs och spolas ut helt innan du skickar bytes vidare.</li>
<li><strong>Preserve Relationships</strong>: Om du tar bort en bild måste du också ta bort dess post i <code>ppt/presentation.xml</code>, radera dess relation i <code>ppt/_rels/presentation.xml.rels</code> och rensa dess innehållstyp från <code>[Content_Types].xml</code>.</li>
</ol>
<h2 id="7-prestanda-och-säkerhetsaspekter">7. Prestanda‑ och säkerhetsaspekter</h2>
<p>Reverse engineering av PPTX‑filer handlar inte bara om att redigera bilder; det handlar också om att granska vad som kommer in i dina system.</p>
<h3 id="säkerhet-miljard-skratt--xxe">Säkerhet: Miljard Skratt &amp; XXE</h3>
<p>Eftersom PPTX‑filer parsar XML är alla server‑sidiga pipelines som tar emot användarinskickade presentationer sårbara för:</p>
<ul>
<li><strong>XML External Entity (XXE) Injection</strong>: Skadlig XML som försöker komma åt <code>/etc/passwd</code> eller fråga interna moln‑metadata‑endpoints (<code>http://169.254.169.254/</code>).</li>
<li><strong>Entity Expansion Attacks (Billion Laughs)</strong>: Exponentiella entitets‑loopar som tömmer systemets RAM.</li>
</ul>
<p><strong>Minskning</strong>: Inaktivera alltid <code>resolve_entities</code>, <code>load_dtd</code> och extern nätverksupplösning i din XML‑parser (t.ex. med <code>defusedxml</code> i Python).</p>
<h3 id="säkerhet-makropayloads-och-dolda-strömmar">Säkerhet: Makropayloads och Dolda Strömmar</h3>
<p>Inspektera filer för <code>.pptm</code>‑innehåll som maskeras under <code>.pptx</code>‑tillägg. Leta efter <code>ppt/vbaProject.bin</code>, som innehåller kompilerad Visual Basic‑kod. I standard <code>.pptx</code>‑filer är VBA‑kod förbjuden; att hitta binära nyttolast‑referenser i relationer bör omedelbart utlösa karantänflaggor.</p>
<h2 id="slutsats">Slutsats</h2>
<p>Reverse engineering av <code>.pptx</code>‑filer avmystifierar presentationsprogramvaran. När du inser att PowerPoint‑filer bara är strukturerade zip‑paket fyllda med koordinater, schemareferenser och XML‑relationsträd, är du inte längre begränsad av befintliga tredjepartsabstraktioner.</p>
<p>Oavsett om du optimerar genomströmning för bildgenerering, skriver anpassade automatiska sanerare eller felsöker renderingsfel, ger en direkt titt på den underliggande OpenXML‑arkitekturen dig total kontroll över presentations‑pipeline:n.</p>
<h2 id="vanliga-frågor-faq">Vanliga frågor (FAQ)</h2>
<p>**Q: Kan du konvertera en .pptx till en vanlig mapp och redigera filer direkt i en IDE?</p>
<p><strong>A1:</strong> Ja, du kan extrahera arkivet, redigera XML‑filen i en editor som VS Code och återkomprimera katalogens innehåll för att öppna det igen i PowerPoint.</p>
<p>**Q: Varför säger PowerPoint att min manuellt modifierade PPTX-fil behöver repareras?</p>
<p><strong>A2:</strong> Detta händer vanligtvis om du har introducerat felaktig XML, utelämnat en ny resurs från <code>[Content_Types].xml</code>, eller lämnat en hängande referens i en associerad <code>.rels</code>-fil.</p>
<p>**Q: Vilken mätenhet använder PowerPoint för formpositioner och marginaler?</p>
<p><strong>A3:</strong> PowerPoint använder English Metric Units (EMUs), där 1 tum motsvarar 914 400 EMU och 1 punkt motsvarar 12 700 EMU.</p>
<p>**Q: Hur kan jag <a href="https://products.fileformat.com/presentation/python/python-pptx/">programmerat extrahera</a> alla bilder från en presentation utan externa bibliotek?</p>
<p><strong>A4:</strong> Öppna helt enkelt <code>.pptx</code>-filen med något standard zip-verktyg och extrahera alla binära filer som finns i katalogen <code>ppt/media/</code>.</p>
<p>**Q: Är det säkert att analysera användaruppladdade PPTX-filer med standard‑XML‑parsers?</p>
<p><strong>A5:</strong> Nej, du måste stärka din parser eller använda säkra omslag som <code>defusedxml</code> för att blockera XML External Entity (XXE) och zip‑bombattacker.</p>
<h2 id="se-även">Se även</h2>
<ul>
<li><a href="https://blog.fileformat.com/presentation/powerpoint-file-formats/">Presentationens filformat på FileFormat.com?</a></li>
<li><a href="https://blog.fileformat.com/presentation/apache-poi-api-to-access-powerpoint-file-formats/">Java API för att komma åt PowerPoint-filformat</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 presentationsformatjämförelse</a></li>
<li><a href="https://blog.fileformat.com/presentation/difference-between-ppt-and-pptx/">Skillnad mellan PPT och PPTX</a></li>
<li><a href="https://blog.fileformat.com/presentation/create-presentation-in-java-with-apache-poi-api/">Skapa PowerPoint-presentation i Java med Apache POI API</a></li>
</ul>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    
  </channel>
</rss>
