<?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 atvirkštinė inžinerija on File Format Blog</title>
    <link>https://blog.fileformat.com/lt/tag/pptx-atvirk%C5%A1tin%C4%97-in%C5%BEinerija/</link>
    <description>Recent content in PPTX atvirkštinė inžinerija on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>lt</language>
    <lastBuildDate>Wed, 16 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.fileformat.com/lt/tag/pptx-atvirk%C5%A1tin%C4%97-in%C5%BEinerija/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>PPTX atvirkštinė inžinerija: PowerPoint failų vidinis supratimas</title>
      <link>https://blog.fileformat.com/lt/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</link>
      <pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blog.fileformat.com/lt/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</guid>
      <description>Sužinokite, kas iš tikrųjų slypi `.pptx` failo viduje. Sužinokite, kaip veikia OpenXML pakavimas, ryšių grafikai, formos ir braižymo žymėjimas.</description>
      <content:encoded><![CDATA[<p><strong>Paskutinį kartą atnaujinta</strong>: 16 Rugs, 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="atvirkštinė-inžinerija-pptx4-failų-kūrėjo-vadovas">Atvirkštinė inžinerija <a href="https://docs.fileformat.com/presentation/pptx/">PPTX</a> failų: kūrėjo vadovas</h2>
<p>Modernios pristatymo skaidrių rinkmenos suteikia galią viskam – nuo investuotojų pristatymų iki vidinių ketvirčio rodiklių. Bet jei kada nors turėjote programiškai išgauti tekstą, pakeisti šablonus vykdymo metu, sukurti automatizuotus skaidrių generatorius arba išvalyti konfidencialius pristatymus, greičiausiai greitai supratote: standartinės aukšto lygio pristatymo bibliotekos gali pasirodyti kaip nenuspėjama juoda dėžutė.</p>
<p>Kai bibliotekos, tokios kaip <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> arba <a href="https://products.fileformat.com/presentation/net/openxmlsdk/">OpenXML SDK</a>, pasiekia savo ribas – arba įveda neaprašytas išdėstymo klaidas – vienintelis išeitis yra peržengti ribas. Jums reikia suprasti, kas iš tikrųjų yra PowerPoint pristatymas baitų ir schemos lygiu.</p>
<p>Šiame gilios analizės straipsnyje atskleisime <code>.pptx</code> formato paslaptis, išpakuosime jo vidinę struktūrą, sekime jo ryšių grafiką, išskaidysime braižymo hierarchijas ir pažvelgsime į praktines strategijas, kaip atvirkščiai inžinieruoti, tikrinti ir manipuliuoti pristatymais naudojant gryną kodą.</p>
<h2 id="1-kas-iš-tikrųjų-yra-pptx-failas">1. Kas iš tikrųjų yra <code>.pptx</code> failas?</h2>
<p>Iš esmės, <code>.pptx</code> failas nėra nuosavybinis monolitinis dvejetainis failas, kaip senas 1990‑ų metų <code>.ppt</code> formatas. Nuo tada, kai Microsoft pristatė Office Open XML (ECMA-376 ir ISO/IEC 29500), šiuolaikiniai Office dokumentai yra <strong>Open Packaging Conventions (OPC) archyvai</strong>.</p>
<p>Paprasčiausiai angliškai: <strong><code>.pptx</code> failas yra tiesiog zip archyvas, kuriame yra XML dokumentai ir medijos ištekliai, organizuoti deterministiniame katalogų medyje.</strong></p>
<p>Tai galite įrodyti per kelias sekundes naudodami standartines terminalo priemones:</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>Gautas katalogų medis atrodo nepaprastai nuosekliai:</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>Kiekvienas vizualinis išteklius, perėjimas, skaidrių šablono paveldėjimas, teksto dėžutės koordinatė ir vektorinis grafikas yra užkoduoti šioje failų hierarchijoje.</p>
<h2 id="2-paketo-anatomija-pagrindinės-posistemos">2. Paketo anatomija: pagrindinės posistemos</h2>
<p>Norint efektyviai atkurti prezentacijas, turite suprasti kiekvieno aukščiausio lygio komponento atsakomybę.</p>
<h3 id="content_typesxml"><code>[Content_Types].xml</code></h3>
<p>Tai yra įėjimo manifestas OPC skaitytojui. Jis susieja failų plėtinius ir aiškius vidinius dalių pavadinimus su standartizuotais MIME/content tipais. Jei sukursite naują skaidrę arba pridėsite paveikslėlį ir nepateiksite jo <code>[Content_Types].xml</code>, PowerPoint paskelbs, kad pristata yra sugadinta, ir paprašys atkurti.</p>
<p>Pavyzdinis fragmentas:</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="_rels-ryšių-grafikas"><code>_rels/</code> ryšių grafikas</h3>
<p>Viena svarbiausių OpenXML koncepcijų yra <strong>indirekcija per ryšius</strong>. Daliniai retai rodo tiesiogiai į neapdorotus failų kelius. Vietoj to, failas (pvz., <code>slide1.xml</code>) turi susijusį ryšių failą, esantį šalia esantiame <code>_rels</code> aplanke (pvz., <code>_rels/slide1.xml.rels</code>).</p>
<p>Ryšiai apibrėžia:</p>
<ul>
<li>Hipersaitai (<code>r:id=&quot;rId2&quot;</code>, TargetMode=&ldquo;External&rdquo;)</li>
<li>Vaizdai ir garso takeliai, saugomi <code>ppt/media/</code></li>
<li>Išdėstymo paveldėjimo rodyklės (<code>slideLayout1.xml</code>)</li>
<li>Pastabų skaidrės, komentarai ir įterpti šriftai</li>
</ul>
<h3 id="docprops-metaduomenys"><code>docProps/</code> (Metaduomenys)</h3>
<ul>
<li><strong><code>core.xml</code></strong>: Dublin Core metaduomenys — autorius, pavadinimas, sukūrimo data, modifikavimo laiko žyma.</li>
<li><strong><code>app.xml</code></strong>: Programai specifinė statistika — PowerPoint versija, bendras skaidrių skaičius, paslėptų skaidrių skaičius, žodžių skaičius, pristatymo šablonų pavadinimai.</li>
</ul>
<h3 id="ppt-pateikčių-variklis"><code>ppt/</code> (Pateikčių variklis)</h3>
<p>Čia yra tikroji prezentacija:</p>
<ul>
<li><strong><code>presentation.xml</code></strong>: Pagrindinis stuburas. Jis registruoja skaidrių ID, skaidrių dydžio matmenis, pastabų pagrindo nuorodas ir numatytuosius šriftų nustatymus.</li>
<li><strong><code>slides/</code></strong>: Atskiri skaidrės (<code>slide1.xml</code>, <code>slide2.xml</code> ir kt.).</li>
<li><strong><code>slideLayouts/</code></strong>: Pagrindiniai struktūriniai šablonai (Pavadinimo skaidrė, Dviejų stulpelių, Skyriaus antraštė).</li>
<li><strong><code>slideMasters/</code></strong>: Globalūs stiliai, numatytosios paletės, fono užpildai ir vietų rezervavimo paveldėjimas.</li>
<li><strong><code>theme/</code></strong>: Spalvų paletės (akcentai 1–6, tamsios/šviesios variacijos) ir šriftų schemos (pagrindiniai/šalutiniai šriftai).</li>
<li><strong><code>media/</code></strong>: Neapdoroti vaizdai (PNG, JPEG, SVG), garso ir vaizdo failai.</li>
</ul>
<h2 id="3-skaidrių-nagrinėjimas-presentationml-p--drawingml-a-dialektai">3. Skaidrių nagrinėjimas: PresentationML (<code>p:</code>) &amp; DrawingML (<code>a:</code>) dialektai</h2>
<p>Kai atidarote <code>ppt/slides/slide1.xml</code>, susiduriate su dviem pagrindiniais XML vardų sritimis:</p>
<ol>
<li><strong>PresentationML (<code>p:</code>)</strong>: Valdo struktūrinius pristatymo elementus (skaidrės, formų medžiai, drobės grupės).</li>
<li><strong>DrawingML (<code>a:</code>)</strong>: Valdo tipografiją, geometriją, 2D koordinates, gradientų užpildus ir vektorų atvaizdavimą.</li>
</ol>
<p>Čia yra supaprastintas pavyzdys, kaip atrodo standartinė teksto forma:</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="svarbūs-matavimo-vienetai-emu-ir-šimto-dalys-taško">Svarbūs matavimo vienetai: EMU ir šimto dalys taško</h3>
<p>Atkreipkite dėmesį į koordinačių skaičius elemente <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>Tai yra <strong>Anglų metrinių vienetų (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 leidžia sveikuosius skaičius naudoti tikslioms abiejų colių ir milimetrų dalims atvaizduoti, nepatiriant slankaus kablelio suapvalinimo klaidų skirtingose aparatinės įrangos architektūrose.</p>
<p>Taip pat atkreipkite dėmesį į šrifto dydį:</p>
<ul>
<li><code>sz=&quot;3200&quot;</code> reiškia <strong>32,00 pt</strong>. Šrifto dydžiai DrawingML yra matuojami šimto dalimis taško.</li>
</ul>
<h2 id="4-paveldėjimo-grandinė-kodėl-formos-paveldi-nematomus-stilius">4. Paveldėjimo grandinė: kodėl formos paveldi nematomus stilius</h2>
<p>Vienas iš dažniausiai pasitaikančių spąstų atvirkštiniam PPTX failų analizavimui yra manyti, kad figūros vizualinis stilius yra visiškai deklaruotas jos pačios <code>slideX.xml</code> faile.</p>
<p>Iš tikrųjų, OpenXML remiasi griežtu <strong>keturių lygių kaskadinės paveldėjimo modeliu</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>Jei teksto laukas <code>slide1.xml</code> faile turi:</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>Nėra šrifto šeimos, nėra aiškios spalvos ir nėra nurodyto dydžio šioje sekcijoje (<code>&lt;a:r&gt;</code>). Norint sužinoti, kaip PowerPoint atvaizduoja šį tekstą, jūsų analizatoriui reikia:</p>
<ol>
<li>Nustatykite rezervuoto vietos tipą (<code>&lt;p:ph type=&quot;title&quot;/&gt;</code>).</li>
<li>Perskaitykite išdėstymą, į kurį nuoroda <code>slide1.xml.rels</code>.</li>
<li>Patikrinkite, ar <code>slideLayout1.xml</code> suteikia stiliaus perrašymus tam rezervuotam vietai.</li>
<li>Grįžkite į <code>slideMaster1.xml</code>, kad gautumėte numatytuosius antraštės teksto kūno stilius.</li>
<li>Sekite spalvų žetonus, pvz., <code>accent1</code> arba <code>tx1</code>, <code>theme1.xml</code> faile, kad rastumėte šešioliktainį spalvos kodą.</li>
</ol>
<p>Jei praleisite šį paveldėjimo grafą, jūsų analizatorius neteisingai perskaitys stilius, trūks šriftų, šriftų dydžių ir išdėstymo inkarų.</p>
<h2 id="5-praktinis-atvirkštinio-inžinerijos-darbo-procesas">5. Praktinis atvirkštinio inžinerijos darbo procesas</h2>
<p>Kai reikia ištirti, kaip veikia tam tikra PowerPoint funkcija viduje (pvz., morph perėjimai, sudėtingos lentelės, vektoriniai keliai), vadovaukitės šiuo empirišku požiūriu:</p>
<h3 id="1-žingsnis-sukurkite-minimalų-diff-pair">1 žingsnis: Sukurkite minimalų &ldquo;Diff Pair&rdquo;</h3>
<ol>
<li>Atidarykite PowerPoint ir sukurkite tuščią skaidrę.</li>
<li>Išsaugokite ją kaip <code>before.pptx</code>.</li>
<li>Taikykite tikslų vieną pakeitimą, kurį norite atkurti (pvz., pridėkite šešėlį prie apskritimo, pakeiskite kulkų stilių, įterpkite įterptą vaizdo įrašą).</li>
<li>Išsaugokite ją kaip <code>after.pptx</code>.</li>
</ol>
<h3 id="2-žingsnis-išpakuokite-abu-archyvus">2 žingsnis: Išpakuokite abu archyvus</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="3-žingsnis-formatuokite-xml">3 žingsnis: Formatuokite XML</h3>
<p>Neapdorotas XML Office archyvuose paprastai neturi įtraukų ir naujų eilučių simbolių. Prieš lyginant, suformatuokite failus:</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="4-žingsnis-vykdykite-vieningą-diff">4 žingsnis: Vykdykite vieningą 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>Peržiūrint <code>changes.patch</code> atskleidžiamas tikslus žymės pavadinimas, vardų srities atributas ir konteinerio hierarchija, kurią įvedė PowerPoint. Tai greičiausias būdas atrasti neaprašytas ar neaiškias schemos savybes neperžvalgant tūkstančių ECMA-376 dokumentacijos puslapių.</p>
<h2 id="6-individualaus-mikrovariklio-kūrimas-išpakuoti-modifikuoti-supakuoti">6. Individualaus mikrovariklio kūrimas: išpakuoti, modifikuoti, supakuoti</h2>
<p>Kartais nenorite naudoti sunkaus įmoninio priklausomybės, tokio kaip Apache POI ar Microsoft OpenXML SDK—ypač lengvuose serverless aplinkose (AWS Lambda, Cloudflare Workers, krašto mazgai).</p>
<p>Štai savarankiškas Python šablonas, demonstruojantis, kaip saugiai išskleisti atmintyje esantį PPTX, įterpti pasirinktinius duomenis naudojant standartinės bibliotekos įrankius ir vėl supakuoti jį:</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="svarbūs-niuansai-modifikuojant-failus-žaliame-baitų-lygyje">Svarbūs niuansai modifikuojant failus žaliame baitų lygyje:</h3>
<ol>
<li><strong>Vardų erdvės išsaugojimas</strong>: XML analizatoriai dažnai perrašo priešdėlius (<code>xmlns:p</code> gali tapti <code>xmlns:ns0</code>). Nors tai galimas XML, PowerPoint griežta vidinė schemos validacija kartais atmeta nestandartinius priešdėlių aliasus. Registruokite vardų erdves aiškiai.</li>
<li><strong>ZIP suspaudimo metodai</strong>: Įsitikinkite, kad rašote failus naudodami standartinį deflate suspaudimą (<code>zipfile.ZIP_DEFLATED</code>).</li>
<li><strong>Srauto išvalymas</strong>: Visada patikrinkite, ar jūsų zip buferis užsidaro ir išvalo duomenis visiškai prieš siunčiant baitus toliau.</li>
<li><strong>Išlaikyti ryšius</strong>: Jei pašalinate skaidrę, turite taip pat pašalinti jos įrašą iš <code>ppt/presentation.xml</code>, ištrinti jos ryšį <code>ppt/_rels/presentation.xml.rels</code> ir išvalyti jos turinio tipą iš <code>[Content_Types].xml</code>.</li>
</ol>
<h2 id="7-našumo-ir-saugumo-svarstymai">7. Našumo ir saugumo svarstymai</h2>
<p>PPTX failų atvirkštinis inžineravimas nėra tik skaidrių redagavimas; tai taip pat yra apie tai, kas patenka į jūsų sistemas.</p>
<h3 id="saugumas-milijonas-juokų--xxe">Saugumas: Milijonas Juokų &amp; XXE</h3>
<p>Kadangi PPTX failai apdoroja XML, bet kuri serverio pusės duomenų srauto, priimanti vartotojų pateiktas prezentacijas, yra pažeidžiama dėl:</p>
<ul>
<li><strong>XML išorinių objektų (XXE) įterpimas</strong>: Kenksmingas XML, bandantis pasiekti <code>/etc/passwd</code> arba užklausti vidinių debesų metaduomenų galinių taškų (<code>http://169.254.169.254/</code>).</li>
<li><strong>Objektų išplėtimo atakos (Billion Laughs)</strong>: Eksponentiniai objektų ciklai, išsekantys sistemos RAM.</li>
</ul>
<p><strong>Mitigacija</strong>: Visada išjunkite <code>resolve_entities</code>, <code>load_dtd</code> ir išorinį tinklo sprendimą savo XML analizatoriui (pvz., naudojant <code>defusedxml</code> Python kalboje).</p>
<h3 id="saugumas-makrokomandų-krovinių-ir-paslėptų-srautų">Saugumas: Makrokomandų Krovinių ir Paslėptų Srautų</h3>
<p>Patikrinkite failus dėl <code>.pptm</code> turinio, apsimetiančio <code>.pptx</code> plėtiniu. Atkreipkite dėmesį į <code>ppt/vbaProject.bin</code>, kuriame yra sukompiliuotas Visual Basic kodas. Įprastuose <code>.pptx</code> failuose VBA kodas draudžiamas; radus dvejetainių duomenų naštų nuorodas ryšiuose, turėtų nedelsiant būti suaktyvintos karantino vėliavos.</p>
<h2 id="išvada">Išvada</h2>
<p>Atvirkštinis <code>.pptx</code> failų inžinerijos procesas demistifikuoja pristatymo programinę įrangą. Kai suprantate, kad PowerPoint failai yra tiesiog struktūruotos zip paketų, užpildytų koordinatėmis, schemų nuorodomis ir XML ryšių medžiais, nebeliekiate apriboti esamų trečiųjų šalių abstrakcijų.</p>
<p>Nesvarbu, ar optimizuojate skaidrių generavimo pralaidumą, rašote pasirinktinius automatizuotus valiklius, ar sprendžiate atvaizdavimo sutrikimus, tiesioginis žvilgsnis į pagrindinę OpenXML architektūrą suteikia visišką kontrolę prieš pristatymo kanalą.</p>
<h2 id="dažnai-užduodami-klausimai-duk">Dažnai užduodami klausimai (DUK)</h2>
<p>**Q: Ar galite konvertuoti .pptx į įprastą aplanką ir tiesiogiai redaguoti failus IDE aplinkoje?</p>
<p><strong>A1:</strong> Taip, galite išskleisti archyvą, redaguoti XML redaktoriuje, pvz., VS Code, ir vėl suspausti katalogo turinį, kad jį atidarytumėte PowerPoint programoje.</p>
<p>**Q: Kodėl PowerPoint sako, kad mano rankiniu būdu modifikuotas PPTX failas reikalauja taisymo?</p>
<p><strong>A2:</strong> Tai paprastai įvyksta, jei įvedėte neteisingą XML, praleidote naują išteklių iš <code>[Content_Types].xml</code>, arba palikote nebaigtą nuorodą susijusiame <code>.rels</code> faile.</p>
<p>**Q: Kokį matavimo vienetą PowerPoint naudoja formų pozicijoms ir paraštėms?</p>
<p><strong>A3:</strong> PowerPoint naudoja Anglų metrinius vienetus (EMU), kur 1 colį sudaro 914 400 EMU, o 1 taškas – 12 700 EMU.</p>
<p>**Q: Kaip galiu <a href="https://products.fileformat.com/presentation/python/python-pptx/">programiškai išgauti</a> visas nuotraukas iš pristatymo be išorinių bibliotekų?</p>
<p><strong>A4:</strong> Tiesiog atidarykite <code>.pptx</code> failą bet kuriuo standartiniu zip įrankiu ir išskleiskite visus binarinius failus, esančius <code>ppt/media/</code> kataloge.</p>
<p>**Q: Ar saugu analizuoti vartotojų įkeltus PPTX failus naudojant standartinius XML analizatorius?</p>
<p><strong>A5:</strong> Ne, turite sustiprinti savo analizatorių arba naudoti saugius apvalkinius, pvz., <code>defusedxml</code>, kad užblokuotumėte XML išorinių elementų (XXE) ir zip-bombų atakas.</p>
<h2 id="taip-pat-žiūrėkite">Taip pat žiūrėkite</h2>
<ul>
<li><a href="https://blog.fileformat.com/presentation/powerpoint-file-formats/">Prezentacijų failų formatai FileFormat.com?</a></li>
<li><a href="https://blog.fileformat.com/presentation/apache-poi-api-to-access-powerpoint-file-formats/">Java API prieigai prie PowerPoint failų formatų</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 pristatymo formato palyginimas</a></li>
<li><a href="https://blog.fileformat.com/presentation/difference-between-ppt-and-pptx/">Skirtumas tarp PPT ir PPTX</a></li>
<li><a href="https://blog.fileformat.com/presentation/create-presentation-in-java-with-apache-poi-api/">Sukurkite PowerPoint pristatymą Java kalba naudojant Apache POI API</a></li>
</ul>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    
  </channel>
</rss>
