<?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 reverzní inženýrství on File Format Blog</title>
    <link>https://blog.fileformat.com/cs/tag/pptx-reverzn%C3%AD-in%C5%BEen%C3%BDrstv%C3%AD/</link>
    <description>Recent content in PPTX reverzní inženýrství on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>cs</language>
    <lastBuildDate>Wed, 16 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.fileformat.com/cs/tag/pptx-reverzn%C3%AD-in%C5%BEen%C3%BDrstv%C3%AD/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>PPTX reverzní inženýrství: Porozumění internímu fungování souborů PowerPoint</title>
      <link>https://blog.fileformat.com/cs/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</link>
      <pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blog.fileformat.com/cs/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</guid>
      <description>Objevte, co se skutečně skrývá uvnitř souboru `.pptx`. Naučte se, jak funguje balíčkování OpenXML, grafy vztahů, tvary a značkování kreslení pod kapotou.</description>
      <content:encoded><![CDATA[<p><strong>Poslední aktualizace</strong>: 16. září 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="reverzní-inženýrství-pptx4-soubory-průvodce-pro-vývojáře">Reverzní inženýrství <a href="https://docs.fileformat.com/presentation/pptx/">PPTX</a> soubory: Průvodce pro vývojáře</h2>
<p>Moderní prezentační sady pohánějí vše od investičních pitchů po interní čtvrtletní metriky. Ale pokud jste někdy museli programově extrahovat text, nahrazovat šablony za běhu, vytvářet automatizované generátory snímků nebo čistit důvěrné prezentace, pravděpodobně jste si rychle uvědomili: standardní knihovny pro prezentace na vysoké úrovni mohou působit jako nepředvídatelná černá skříňka.</p>
<p>Když knihovny jako <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> nebo <a href="https://products.fileformat.com/presentation/net/openxmlsdk/">OpenXML SDK</a> narazí na své limity — nebo zavádějí nezdokumentované chyby rozvržení — jediný způsob ven je skrz. Musíte pochopit, co PowerPointová prezentace ve skutečnosti je na úrovni bajtů a schématu.</p>
<p>V tomto podrobném průzkumu odhalíme formát <code>.pptx</code>, rozbalíme jeho vnitřní strukturu, vystopujeme graf vztahů, rozebíráme hierarchie kreslení a podíváme se na praktické strategie pro reverzní inženýrství, inspekci a manipulaci s prezentacemi pomocí surového kódu.</p>
<h2 id="1-co-je-vlastně-soubor-pptx">1. Co je vlastně soubor <code>.pptx</code>?</h2>
<p>V jádru není soubor <code>.pptx</code> proprietární monolitický binární soubor jako starý formát <code>.ppt</code> z 90. let. Od chvíle, kdy Microsoft představil Office Open XML (ECMA-376 a ISO/IEC 29500), jsou moderní dokumenty Office <strong>archivy podle Open Packaging Conventions (OPC)</strong>.</p>
<p>Jednoduše řečeno: <strong>soubor <code>.pptx</code> je jen zip archiv obsahující XML dokumenty a mediální soubory uspořádané v deterministickém adresářovém stromu.</strong></p>
<p>Můžete to dokázat během několika sekund pomocí standardních nástrojů v terminálu:</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>Výsledný adresářový strom vypadá pozoruhodně konzistentně:</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>Každý vizuální prvek, přechod, dědičnost hlavního snímku, souřadnice textového pole a vektorová grafika jsou zakódovány v této hierarchii souborů.</p>
<h2 id="2-anatomie-balíčku-klíčové-subsystémy">2. Anatomie balíčku: Klíčové subsystémy</h2>
<p>Abyste mohli efektivně reverzně analyzovat prezentace, musíte pochopit odpovědnosti každé komponenty na nejvyšší úrovni.</p>
<h3 id="content_typesxml"><code>[Content_Types].xml</code></h3>
<p>Toto je vstupní manifest pro čtečku OPC. Mapuje přípony souborů a explicitní interní názvy částí na standardizované MIME/content typy. Pokud vytvoříte nový snímek nebo přidáte obrázek a nezadáte jej v <code>[Content_Types].xml</code>, PowerPoint označí prezentaci jako poškozenou a vyzve k obnovení.</p>
<p>Ukázkový úryvek:</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="graf-vztahů-_rels">Graf vztahů <code>_rels/</code></h3>
<p>Jedním z nejdůležitějších konceptů v OpenXML je <strong>nepřímý odkaz prostřednictvím vztahů</strong>. Části zřídka ukazují přímo na surové cesty k souborům. Místo toho má soubor (např. <code>slide1.xml</code>) přidružený soubor vztahů umístěný ve vedlejším adresáři <code>_rels</code> (např. <code>_rels/slide1.xml.rels</code>).</p>
<p>Vztahy definují:</p>
<ul>
<li>Hyperlinky (<code>r:id=\&quot;rId2\&quot;</code>, TargetMode=&quot;External&quot;)</li>
<li>Obrázky a zvukové stopy uložené v <code>ppt/media/</code></li>
<li>Ukazatele dědičnosti rozvržení (<code>slideLayout1.xml</code>)</li>
<li>Poznámkové snímky, komentáře a vložená písma</li>
</ul>
<h3 id="docprops-metadata"><code>docProps/</code> (Metadata)</h3>
<ul>
<li><strong><code>core.xml</code></strong>: metadata Dublin Core — autor, název, datum vytvoření, časová značka úpravy.</li>
<li><strong><code>app.xml</code></strong>: aplikačně specifické statistiky — verze PowerPointu, celkový počet snímků, počet skrytých snímků, počet slov, názvy šablon prezentace.</li>
</ul>
<h3 id="ppt-prezentace"><code>ppt/</code> (Prezentace)</h3>
<p>Zde se nachází skutečná prezentace:</p>
<ul>
<li><strong><code>presentation.xml</code></strong>: Hlavní struktura. Registruje ID snímků, rozměry velikosti snímků, odkazy na hlavní poznámky a výchozí nastavení písma.</li>
<li><strong><code>slides/</code></strong>: Jednotlivé snímky (<code>slide1.xml</code>, <code>slide2.xml</code>, atd.).</li>
<li><strong><code>slideLayouts/</code></strong>: Hlavní strukturální předvolby (titulní snímek, dva sloupce, záhlaví sekce).</li>
<li><strong><code>slideMasters/</code></strong>: Globální styly, výchozí palety, výplně pozadí a dědičnost zástupných prvků.</li>
<li><strong><code>theme/</code></strong>: Barevné palety (akcent 1 až 6, tmavé/světlé varianty) a schémata písem (hlavní/vedlejší písma).</li>
<li><strong><code>media/</code></strong>: Surové obrázky (PNG, JPEG, SVG), audio a video soubory.</li>
</ul>
<h2 id="3-rozbor-snímku-dialekty-presentationml-p-a-drawingml-a">3. Rozbor snímku: Dialekty PresentationML (<code>p:</code>) a DrawingML (<code>a:</code>)</h2>
<p>Když otevřete <code>ppt/slides/slide1.xml</code>, setkáte se se dvěma hlavními XML jmennými prostory:</p>
<ol>
<li><strong>PresentationML (<code>p:</code>)</strong>: Řídí strukturované prezentační prvky (snímky, stromové tvary, skupiny pláten).</li>
<li><strong>DrawingML (<code>a:</code>)</strong>: Řídí typografii, geometrii, 2D souřadnice, gradientové výplně a vektorové vykreslování.</li>
</ol>
<p>Zde je zjednodušený příklad toho, jak vypadá standardní textový tvar:</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="klíčové-jednotky-měření-emu-a-setiny-bodu">Klíčové jednotky měření: EMU a setiny bodu</h3>
<p>Všimněte si čísel souřadnic v <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>Jedná se o <strong>anglické metrické jednotky (EMU)</strong>.</p>
<ul>
<li>$1 \text{ palec} = 914,400 \text{ EMU}$</li>
<li>$1 \text{ cm} = 360,000 \text{ EMUs}$</li>
<li>$1 \text{ pt} = 12,700 \text{ EMUs}$</li>
</ul>
<p>EMUs umožňují celým číslům představovat přesné zlomky jak palců, tak milimetrů bez chyb zaokrouhlování s plovoucí desetinnou čárkou napříč různými hardwarovými architekturami.</p>
<p>Všimněte si také velikosti písma:</p>
<ul>
<li><code>sz=&quot;3200&quot;</code> znamená <strong>32,00 pt</strong>. Velikosti písma v DrawingML jsou měřeny v setinách bodu.</li>
</ul>
<h2 id="4-řetězec-dědičnosti-proč-tvary-dědí-neviditelné-styly">4. Řetězec dědičnosti: Proč tvary dědí neviditelné styly</h2>
<p>Jedním z nejčastějších úskalí při reverzním inženýrství souborů PPTX je předpoklad, že vizuální stylování tvaru je plně deklarováno v jeho vlastním souboru <code>slideX.xml</code>.</p>
<p>Ve skutečnosti OpenXML spoléhá na přísný <strong>čtyřúrovňový kaskádový model dědičnosti</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>Pokud textové pole v <code>slide1.xml</code> obsahuje:</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>Na běhu (<code>&lt;a:r&gt;</code>) není deklarována žádná rodina písma, žádná explicitní barva ani velikost. Abyste zjistili, jak PowerPoint tento text vykresluje, váš parser musí:</p>
<ol>
<li>Identifikovat typ zástupného prvku (<code>&lt;p:ph type=&quot;title&quot;/&gt;</code>).</li>
<li>Přečíst rozvržení odkazované v <code>slide1.xml.rels</code>.</li>
<li>Zkontrolovat, zda <code>slideLayout1.xml</code> poskytuje přepsání stylů pro tento zástupný prvek.</li>
<li>Vrátit se k <code>slideMaster1.xml</code> pro výchozí styly těla titulního textu.</li>
<li>Sledovat tokeny barev jako <code>accent1</code> nebo <code>tx1</code> v <code>theme1.xml</code>, abyste našli hexadecimální kód barvy.</li>
</ol>
<p>Pokud tento graf dědičnosti přeskočíte, váš parser špatně přečte styly, chybějící písma, velikosti písma a ukotvení rozvržení.</p>
<h2 id="5-praktický-postup-reverzního-inženýrství">5. Praktický postup reverzního inženýrství</h2>
<p>Když potřebujete prozkoumat, jak konkrétní funkce PowerPointu funguje pod povrchem (např. morph přechody, složité tabulky, vektorové cesty), postupujte podle tohoto empirického přístupu:</p>
<h3 id="krok-1-vytvořte-minimální-diff-pair">Krok 1: Vytvořte minimální &ldquo;Diff Pair&rdquo;</h3>
<ol>
<li>Otevřete PowerPoint a vytvořte prázdný snímek.</li>
<li>Uložte jej jako <code>before.pptx</code>.</li>
<li>Použijte přesně tu jedinou změnu, kterou chcete reverzně analyzovat (např. přidejte stín k kruhu, změňte styl odrážky, vložte vložené video).</li>
<li>Uložte jej jako <code>after.pptx</code>.</li>
</ol>
<h3 id="krok-2-rozbalte-oba-archivy">Krok 2: Rozbalte oba archivy</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="krok-3-naformátujte-xml">Krok 3: Naformátujte XML</h3>
<p>Surový XML uvnitř archivů Office je obvykle zbaven odsazení a znaků nových řádků. Před porovnáním (diffem) souborů je naformátujte:</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="krok-4-spusťte-unified-diff">Krok 4: Spusťte 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>Prohlížením <code>changes.patch</code> odhalíte přesný název značky, atribut jmenného prostoru a hierarchii kontejneru, kterou PowerPoint zavedl. To je nejrychlejší způsob, jak objevit nedokumentované nebo nejasné vlastnosti schématu, aniž byste prohrabávali tisíce stránek dokumentace ECMA-376.</p>
<h2 id="6-vytváření-vlastního-mikroenginu-rozbalit-upravit-znovu-zabalit">6. Vytváření vlastního mikroenginu: rozbalit, upravit, znovu zabalit</h2>
<p>Někdy nechcete těžkou podnikatelskou závislost jako Apache POI nebo Microsoft OpenXML SDK – zejména v lehkých serverless prostředích (AWS Lambda, Cloudflare Workers, edge uzly).</p>
<p>Zde je samostatný Python vzor, který ukazuje, jak bezpečně rozbalit PPTX v paměti, vložit vlastní data pomocí nástrojů standardní knihovny a znovu jej zabalit:</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="klíčové-úskalí-při-úpravě-souborů-na-úrovni-surových-bajtů">Klíčové úskalí při úpravě souborů na úrovni surových bajtů:</h3>
<ol>
<li><strong>Zachování jmenných prostorů</strong>: XML parsery často přepisují předpony (<code>xmlns:p</code> může být přepsáno na <code>xmlns:ns0</code>). Přestože je to platné XML, přísná interní validace schématu PowerPointu občas odmítá nestandardní aliasy předpon. Registrujte jmenné prostory explicitně.</li>
<li><strong>Metody komprese ZIP</strong>: Ujistěte se, že soubory zapisujete zpět pomocí standardní deflate komprese (<code>zipfile.ZIP_DEFLATED</code>).</li>
<li><strong>Vyprázdnění proudu</strong>: Vždy zkontrolujte, že váš zip buffer se uzavře a kompletně vyprázdní před odesláním bajtů dál.</li>
<li><strong>Zachování vztahů</strong>: Pokud odstraníte snímek, musíte také odstranit jeho záznam z <code>ppt/presentation.xml</code>, smazat jeho vztah v <code>ppt/_rels/presentation.xml.rels</code> a vyčistit jeho typ obsahu z <code>[Content_Types].xml</code>.</li>
</ol>
<h2 id="7-úvahy-o-výkonu-a-zabezpečení">7. Úvahy o výkonu a zabezpečení</h2>
<p>Reverse engineering souborů PPTX není jen o úpravě snímků; jde také o audit toho, co vstupuje do vašich systémů.</p>
<h3 id="bezpečnost-miliarda-smíchů-a-xxe">Bezpečnost: miliarda smíchů a XXE</h3>
<p>Protože soubory PPTX parsují XML, jakýkoli serverový pipeline přijímající uživatelsky zaslané prezentace je zranitelný vůči:</p>
<ul>
<li><strong>Injekce XML externí entity (XXE)</strong>: Škodlivé XML pokoušející se přistoupit k <code>/etc/passwd</code> nebo dotazovat interní koncové body cloudových metadat (<code>http://169.254.169.254/</code>).</li>
<li><strong>Útoky rozšířením entit (Billion Laughs)</strong>: Exponenciální smyčky entit vyčerpávající RAM systému.</li>
</ul>
<p><strong>Zmírnění</strong>: Vždy zakazujte <code>resolve_entities</code>, <code>load_dtd</code> a externí síťové řešení ve vašem XML parseru (např. pomocí <code>defusedxml</code> v Pythonu).</p>
<h3 id="bezpečnost-makro-payloady-a-skryté-proudy">Bezpečnost: makro payloady a skryté proudy</h3>
<p>Prohlédněte soubory na obsah <code>.pptm</code> maskovaný pod příponou <code>.pptx</code>. Dávejte pozor na <code>ppt/vbaProject.bin</code>, který obsahuje zkompilovaný kód Visual Basic. Ve standardních souborech <code>.pptx</code> je VBA kód zakázán; nalezení odkazů na binární payload v relacích by mělo okamžitě spustit karanténní příznaky.</p>
<h2 id="závěr">Závěr</h2>
<p>Reverse engineering souborů <code>.pptx</code> demystifikuje prezentační software. Jakmile si uvědomíte, že soubory PowerPoint jsou jen strukturované zip balíčky naplněné souřadnicemi, odkazy na schémata a XML stromy vztahů, již nejste omezeni existujícími abstrakcemi třetích stran.</p>
<p>Ať už optimalizujete propustnost generování snímků, píšete vlastní automatizované čističe, nebo řešíte problémy s vykreslováním, přímý pohled na podkladovou architekturu OpenXML vám poskytuje úplnou kontrolu nad prezentačním pipeline.</p>
<h2 id="často-kladené-otázky-faq">Často kladené otázky (FAQ)</h2>
<p>**Q: Můžete převést .pptx na standardní složku a upravovat soubory přímo v IDE?</p>
<p><strong>A1:</strong> Ano, můžete rozbalit archiv, upravit XML v editoru jako VS Code a znovu zkomprimovat obsah adresáře, aby se otevřel zpět v PowerPointu.</p>
<p>**Q: Proč PowerPoint říká, že můj ručně upravený soubor PPTX potřebuje opravu?</p>
<p><strong>A2:</strong> Toto se obvykle stane, pokud jste zavlekl poškozené XML, vynechal nový asset z <code>[Content_Types].xml</code>, nebo zanechal visící odkaz v přidruženém souboru <code>.rels</code>.</p>
<p>**Q: Jakou měrnou jednotku PowerPoint používá pro pozice tvarů a okraje?</p>
<p><strong>A3:</strong> PowerPoint používá English Metric Units (EMUs), kde 1 palec odpovídá 914 400 EMU a 1 bod odpovídá 12 700 EMU.</p>
<p>**Q: Jak mohu <a href="https://products.fileformat.com/presentation/python/python-pptx/">programově extrahovat</a> všechny obrázky z prezentace bez externích knihoven?</p>
<p><strong>A4:</strong> Jednoduše otevřete soubor <code>.pptx</code> pomocí libovolného standardního zip nástroje a extrahujte všechny binární soubory umístěné ve složce <code>ppt/media/</code>.</p>
<p>**Q: Je bezpečné parsovat uživateli nahrané soubory PPTX pomocí standardních XML parserů?</p>
<p><strong>A5:</strong> Ne, musíte svůj parser zpevnit nebo použít bezpečné obaly jako <code>defusedxml</code>, aby se zablokovaly útoky XML External Entity (XXE) a zip‑bomba.</p>
<h2 id="viz-také">Viz také</h2>
<ul>
<li><a href="https://blog.fileformat.com/presentation/powerpoint-file-formats/">Formáty souborů prezentací na FileFormat.com?</a></li>
<li><a href="https://blog.fileformat.com/presentation/apache-poi-api-to-access-powerpoint-file-formats/">Java API pro přístup k formátům souborů PowerPoint</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 – srovnání formátu prezentace</a></li>
<li><a href="https://blog.fileformat.com/presentation/difference-between-ppt-and-pptx/">Rozdíl mezi PPT a PPTX</a></li>
<li><a href="https://blog.fileformat.com/presentation/create-presentation-in-java-with-apache-poi-api/">Vytvořte PowerPoint prezentaci v Javě pomocí Apache POI API</a></li>
</ul>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    
  </channel>
</rss>
