<?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 apgrieztā inženierija on File Format Blog</title>
    <link>https://blog.fileformat.com/lv/tag/pptx-apgriezt%C4%81-in%C5%BEenierija/</link>
    <description>Recent content in PPTX apgrieztā inženierija on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>lv</language>
    <lastBuildDate>Wed, 16 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.fileformat.com/lv/tag/pptx-apgriezt%C4%81-in%C5%BEenierija/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>PPTX apgrieztā inženierija: PowerPoint failu iekšējā izpratne</title>
      <link>https://blog.fileformat.com/lv/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</link>
      <pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blog.fileformat.com/lv/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</guid>
      <description>Atklājiet, kas patiesībā atrodas `.pptx` faila iekšienē. Uzziniet, kā darbojas OpenXML pakotne, attiecību grafi, formas un zīmēšanas marķējums.</description>
      <content:encoded><![CDATA[<p><strong>Pēdējoreiz atjaunināts</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="apgrieztā-inženierija-pptx4-failus-izstrādātāja-ceļvedis">Apgrieztā inženierija <a href="https://docs.fileformat.com/presentation/pptx/">PPTX</a> Failus: Izstrādātāja ceļvedis</h2>
<p>Mūsdienīgi prezentāciju komplekti nodrošina visu, sākot no investoru prezentācijām līdz iekšējiem ceturkšņa rādītājiem. Bet, ja jums jebkad bija jāizgūst teksts programmatiski, jāaizstāj veidnes izpildlaikā, jāveido automatizēti slaidu ģeneratori vai jāattīra konfidenciālas prezentācijas, jūs, iespējams, ātri sapratis: standarta augsta līmeņa prezentāciju bibliotēkas var likties kā neparedzama melna kaste.</p>
<p>Kad bibliotēkas, piemēram, <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> vai <a href="https://products.fileformat.com/presentation/net/openxmlsdk/">OpenXML SDK</a>, sasniedz savas robežas — vai arī ievieš neaprakstītas izkārtojuma kļūdas — vienīgais izceļas veids ir caur to. Jums jāizprot, kas patiesībā ir PowerPoint prezentācija baitu un shēmas līmenī.</p>
<p>Šajā padziļinātajā pārskatā mēs pacelsim aizkuli <code>.pptx</code> formātam, izpakosim tā iekšējo struktūru, izsekosim tās attiecību grafu, sadalīsim zīmējumu hierarhijas un aplūkosim praktiskus stratēģijas reversēšanai, pārbaudei un prezentāciju manipulēšanai ar neapstrādātu kodu.</p>
<h2 id="1-kas-patiesībā-ir-pptx-fails">1. Kas patiesībā ir <code>.pptx</code> fails?</h2>
<p>Pamatā <code>.pptx</code> fails nav īpašnieka monolītisks binārais fails, kā senais <code>.ppt</code> formāts no 1990. gadiem. Kopš Microsoft ieviesa Office Open XML (ECMA-376 un ISO/IEC 29500), mūsdienu Office dokumenti ir <strong>Open Packaging Conventions (OPC) arhīvi</strong>.</p>
<p>Vienkāršā angļu valodā: <strong><code>.pptx</code> fails ir vienkārši zip arhīvs, kas satur XML dokumentus un multivides resursus, sakārtotus deterministiskā direktoriju koks.</strong></p>
<p>To var pierādīt dažu sekunžu laikā, izmantojot standarta termināļa rīkus:</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>Izveidotais direktoriju koks izskatās pārsteidzoši konsekvents:</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>Katrs atsevišķais vizuālais resurss, pāreja, slaidu galvenā pārmantošana, teksta lodziņa koordināte un vektorgrafika ir kodificēta šajā failu hierarhijā.</p>
<h2 id="2-paketes-anatomija-galvenās-apakšsistēmas">2. Paketes anatomija: galvenās apakšsistēmas</h2>
<p>Lai efektīvi veiktu prezentāciju atpakaļizpēti, jāizprot katras augstākā līmeņa komponentes atbildība.</p>
<h3 id="content_typesxml"><code>[Content_Types].xml</code></h3>
<p>Šis ir OPC lasītāja ievades manifests. Tas kartē failu paplašinājumus un konkrētus iekšējos daļu nosaukumus uz standartizētiem MIME/content tipiem. Ja izveidojat jaunu slaidu vai pievienojat attēlu un neiekļaujat to <code>[Content_Types].xml</code>, PowerPoint paziņos, ka prezentācija ir bojāta, un piedāvās atjaunošanu.</p>
<p>Piemēra fragmenti:</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-attiecību-grafiks"><code>_rels/</code> attiecību grafiks</h3>
<p>Viens no svarīgākajiem jēdzieniem OpenXML ir <strong>indirekcija caur attiecībām</strong>. Daļas reti norāda tieši uz neapstrādātiem failu ceļiem. Tā vietā fails (piemēram, <code>slide1.xml</code>) ir saistīts ar attiecību failu, kas atrodas blakus <code>_rels</code> mapē (piemēram, <code>_rels/slide1.xml.rels</code>).</p>
<p>Attiecības definē:</p>
<ul>
<li>Hipersaites (<code>r:id=&quot;rId2&quot;</code>, TargetMode=&ldquo;External&rdquo;)</li>
<li>Attēli un audio celiņi, kas saglabāti <code>ppt/media/</code></li>
<li>Izkārtojuma mantošanas rādītāji (<code>slideLayout1.xml</code>)</li>
<li>Piezīmju slaidi, komentāri un iegultie fonti</li>
</ul>
<h3 id="docprops-metadati"><code>docProps/</code> (Metadati)</h3>
<ul>
<li><strong><code>core.xml</code></strong>: Dublin Core metadati — autors, nosaukums, izveides datums, modificēšanas laika zīmogs.</li>
<li><strong><code>app.xml</code></strong>: Lietojumprogrammas specifiskā statistika — PowerPoint versija, kopējais slaidu skaits, slēptu slaidu skaits, vārdu skaits, prezentācijas veidņu nosaukumi.</li>
</ul>
<h3 id="ppt-prezentācijas-dzinējs"><code>ppt/</code> (Prezentācijas dzinējs)</h3>
<p>Šeit ir patiesā prezentācija:</p>
<ul>
<li><strong><code>presentation.xml</code></strong>: Galvenais skelets. Tas reģistrē slaidu ID, slaidu izmēru dimensijas, piezīmju galveno atsauču un noklusējuma fontu iestatījumus.</li>
<li><strong><code>slides/</code></strong>: Atsevišķie slaidi (<code>slide1.xml</code>, <code>slide2.xml</code> utt.).</li>
<li><strong><code>slideLayouts/</code></strong>: Galvenie struktūras priekšiestatījumi (Virsraksta slaids, Divas kolonnas, Sadaļas galvene).</li>
<li><strong><code>slideMasters/</code></strong>: Globālie stili, noklusējuma paletes, fona aizpildījumi un viettura mantība.</li>
<li><strong><code>theme/</code></strong>: Krāsu paletes (akcenti 1 līdz 6, tumšas/gaišas variācijas) un fontu shēmas (galvenie/mazākie fonti).</li>
<li><strong><code>media/</code></strong>: Neapstrādāti attēli (PNG, JPEG, SVG), audio un video faili.</li>
</ul>
<h2 id="3-slaida-analīze-presentationml-p-un-drawingml-a-dialekti">3. Slaida analīze: PresentationML (<code>p:</code>) un DrawingML (<code>a:</code>) dialekti</h2>
<p>Kad atverat <code>ppt/slides/slide1.xml</code>, sastopaties ar divām galvenajām XML vārdtelpām:</p>
<ol>
<li><strong>PresentationML (<code>p:</code>)</strong>: Pārvalda strukturālos prezentācijas elementus (slaidi, formu koki, audekla grupas).</li>
<li><strong>DrawingML (<code>a:</code>)</strong>: Pārvalda tipogrāfiju, ģeometriju, 2D koordinātas, gradienta aizpildījumus un vektoru renderēšanu.</li>
</ol>
<p>Šeit ir vienkāršots piemērs tam, kā izskatās standarta teksta 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="svarīgas-mērvienības-emu-un-simtā-daļa-punkta">Svarīgas mērvienības: EMU un simtā daļa punkta</h3>
<p>Pievērsiet uzmanību koordinātu skaitļiem elementā <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>Šie ir <strong>Angļu metriskās vienības (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>EMUs ļauj veseliem skaitļiem attēlot precīzas frakcijas gan collās, gan milimetros, bez peldošā komata noapaļošanas kļūdām dažādās aparatūras arhitektūrās.</p>
<p>Pievērsiet arī uzmanību fonta lielumam:</p>
<ul>
<li><code>sz=&quot;3200&quot;</code> nozīmē <strong>32,00 pt</strong>. Fonta lielumi DrawingML ir mērīti simtdaļās no punkta.</li>
</ul>
<h2 id="4-mantošanas-ķēde-kāpēc-formas-manto-neredzamus-stilus">4. Mantošanas ķēde: Kāpēc formas manto neredzamus stilus</h2>
<p>Viens no visbiežākajiem ķīpsakām, veicot PPTX failu reverso inženieriju, ir pieņēmums, ka formas vizuālais stils ir pilnībā deklarēts tās pašas <code>slideX.xml</code> failā.</p>
<p>Patiesībā OpenXML balstās uz stingru <strong>4 līmeņu pakāpenisku mantošanas modeli</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>Ja teksta lodziņš <code>slide1.xml</code> satur:</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>Šajā izpildes posmā (<code>&lt;a:r&gt;</code>) nav norādīta fonta ģimene, nav skaidras krāsas un nav norādīts izmērs. Lai noskaidrotu, kā PowerPoint attēlo šo tekstu, jūsu parsētājam jā:</p>
<ol>
<li>Identificējiet viettura veidu (<code>&lt;p:ph type=&quot;title&quot;/&gt;</code>).</li>
<li>Izlasiet izkārtojumu, uz ko atsaucas <code>slide1.xml.rels</code>.</li>
<li>Pārbaudiet, vai <code>slideLayout1.xml</code> nodrošina stila pārrakstus šim vietturim.</li>
<li>Atkāpieties uz <code>slideMaster1.xml</code>, lai iegūtu noklusējuma virsraksta teksta ķermeņa stilus.</li>
<li>Izsekot krāsu marķierus, piemēram, <code>accent1</code> vai <code>tx1</code>, uz <code>theme1.xml</code>, lai atrastu heksadecimālo krāsas kodu.</li>
</ol>
<p>Ja izlaidosiet šo mantošanas grafiku, jūsu parsētājs nepareizi nolasīs stilus, trūkstošus fontus, fontu izmērus un izkārtojuma enkurus.</p>
<h2 id="5-praktiskais-reversās-inženierijas-darbplūsma">5. Praktiskais reversās inženierijas darbplūsma</h2>
<p>Kad jums jāizpēta, kā konkrēta PowerPoint funkcija darbojas iekšpusē (piemēram, morfēšanas pārejas, sarežģītas tabulas, vektoru ceļi), sekojiet šai empīriskajai pieejai:</p>
<h3 id="1-solis-izveidot-minimālu-diff-pāri">1. solis: Izveidot minimālu &ldquo;Diff pāri&rdquo;</h3>
<ol>
<li>Atveriet PowerPoint un izveidojiet tukšu slaidu.</li>
<li>Saglabājiet to kā <code>before.pptx</code>.</li>
<li>Izpildiet tieši vienu izmaiņu, ko vēlaties atpakaļizvērtēt (piemēram, pievienojiet krīzes ēnu aplim, mainiet aizzīmes stilu, ievietojiet iegultu video).</li>
<li>Saglabājiet to kā <code>after.pptx</code>.</li>
</ol>
<h3 id="2-solis-atpakot-abus-arhīvus">2. solis: Atpakot abus arhīvus</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-solis-formatēt-xml">3. solis: Formatēt XML</h3>
<p>Neapstrādāts XML Office arhīvos parasti tiek noņemts no atkāpēm un jaunu rindu rakstzīmēm. Pirms salīdzināšanas formatējiet 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-solis-izpildīt-vienotu-diff">4. solis: Izpildīt vienotu 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>Pārskatot <code>changes.patch</code>, tiek atklāts precīzs birkas nosaukums, nosaukumvietas atribūts un konteineru hierarhija, ko ieviesa PowerPoint. Tas ir ātrākais veids, kā atklāt neaprakstītas vai nepazīstamas shēmas īpašības, neierakstoties tūkstošu ECMA-376 dokumentācijas lapu.</p>
<h2 id="6-pielāgota-mikro-dzinēja-izveide-atpakot-modificēt-pārpakot">6. Pielāgota mikro-dzinēja izveide: Atpakot, modificēt, pārpakot</h2>
<p>Dažreiz nevēlaties smagu uzņēmuma atkarību, piemēram, Apache POI vai Microsoft OpenXML SDK—īpaši vieglos bezservera izpildes vidēs (AWS Lambda, Cloudflare Workers, malas mezgli).</p>
<p>Šeit ir pašpietiekams Python paraugs, kas parāda, kā droši atpakot atmiņā esošu PPTX, injicēt pielāgotus datus, izmantojot standarta bibliotēkas rīkus, un to pārpakot:</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="svarīgi-brīdinājumi-modificējot-failus-neapstrādātā-baitu-līmenī">Svarīgi brīdinājumi, modificējot failus neapstrādātā baitu līmenī:</h3>
<ol>
<li><strong>Namespace saglabāšana</strong>: XML parsētāji bieži pārraksta prefiksus (<code>xmlns:p</code> var kļūt par <code>xmlns:ns0</code>). Lai gan tas ir derīgs XML, PowerPoint stingra iekšējā shēmas validācija dažkārt noraida nestandarta prefiksu aliasus. Reģistrējiet vārdtelpas tieši.</li>
<li><strong>ZIP saspiešanas metodes</strong>: Pārliecinieties, ka rakstāt failus atpakaļ, izmantojot standarta deflate saspiešanu (<code>zipfile.ZIP_DEFLATED</code>).</li>
<li><strong>Plūsmas iztīrīšana</strong>: Vienmēr pārbaudiet, vai jūsu zip buferis pilnībā aizveras un iztīras, pirms nosūtāt baitus tālāk.</li>
<li><strong>Saglabāt attiecības</strong>: Ja noņemat slaidu, jums arī jānoņem tā ieraksts no <code>ppt/presentation.xml</code>, jāizdzēš tā attiecība <code>ppt/_rels/presentation.xml.rels</code>, un jāiztīra tā satura tips no <code>[Content_Types].xml</code>.</li>
</ol>
<h2 id="7-veiktspējas-un-drošības-apsvērumi">7. Veiktspējas un drošības apsvērumi</h2>
<p>PPTX failu atpakaļizpēte nav tikai par slaidu rediģēšanu; tas arī ietver to, kas tiek ievadīts jūsu sistēmās.</p>
<h3 id="drošība-miljards-smieklu--xxe">Drošība: Miljards Smieklu &amp; XXE</h3>
<p>Tā kā PPTX faili parsē XML, jebkura servera puses caurule, kas apstrādā lietotāju iesniegtas prezentācijas, ir pakļauta:</p>
<ul>
<li><strong>XML ārējā entītija (XXE) injekcija</strong>: ļaundabīgs XML, kas mēģina piekļūt <code>/etc/passwd</code> vai vaicāt iekšējus mākoņa metadatu galapunktus (<code>http://169.254.169.254/</code>).</li>
<li><strong>Entītiju paplašināšanas uzbrukumi (Billion Laughs)</strong>: eksponenciāli entītiju cikli, kas iztērē sistēmas RAM.</li>
</ul>
<p><strong>Mitigācija</strong>: Vienmēr atspējojiet <code>resolve_entities</code>, <code>load_dtd</code> un ārējo tīkla izšķiršanu jūsu XML parserī (piemēram, izmantojot <code>defusedxml</code> Pythonā).</p>
<h3 id="drošība-makro-nesošanas-un-slēptās-plūsmas">Drošība: Makro Nesošanas un Slēptās Plūsmas</h3>
<p>Pārbaudiet failus, vai <code>.pptm</code> saturs neizstaro kā <code>.pptx</code> paplašinājums. Uzmanieties no <code>ppt/vbaProject.bin</code>, kas satur kompilētu Visual Basic kodu. Standarta <code>.pptx</code> failos VBA kods ir aizliegts; bināro slodzes atsauču atrašana attiecībās nekavējoties jāizsauc karantīnas brīdinājumi.</p>
<h2 id="secinājums">Secinājums</h2>
<p>Apgrieztā inženierija <code>.pptx</code> failiem demistificē prezentāciju programmatūru. Kad saprotat, ka PowerPoint faili ir vienkārši strukturēti zip pakotnes, kas satur koordinātas, shēmas atsauces un XML attiecību koku, jūs vairs neesat ierobežoti ar esošajām trešo pušu abstrakcijām.</p>
<p>Neatkarīgi no tā, vai optimizējat slaidu ģenerēšanas caurplūdi, rakstāt pielāgotus automatizētus sanitārus vai novēršat renderēšanas traucējumus, tieša skatīšanās uz pamatā esošo OpenXML arhitektūru sniedz pilnīgu kontroli pār prezentācijas cauruļvadu.</p>
<h2 id="biežāk-uzdotie-jautājumi-buj">Biežāk uzdotie jautājumi (BUJ)</h2>
<p>**Q: Vai varat konvertēt .pptx uz standarta mapi un rediģēt failus tieši IDE?</p>
<p><strong>A1:</strong> Jā, jūs varat izvilkt arhīvu, rediģēt XML redaktorā, piemēram, VS Code, un atkal saspiest direktorijas saturu, lai to atvērtu PowerPoint.</p>
<p>**Q: Kāpēc PowerPoint saka, ka manuāli modificētajam PPTX failam ir jāveic remonts?</p>
<p><strong>A2:</strong> Parasti tas notiek, ja jūs ievadījāt nepareizu XML, izlaida jaunus resursus no <code>[Content_Types].xml</code>, vai atstāja peldošu atsauci saistītā <code>.rels</code> failā.</p>
<p>**Q: Kādu mērvienību PowerPoint izmanto figūru pozīcijām un robežām?</p>
<p><strong>A3:</strong> PowerPoint izmanto angļu metriskās vienības (EMUs), kur 1 collas ir 914,400 EMU un 1 punkts ir 12,700 EMU.</p>
<p>**Q: Kā es varu <a href="https://products.fileformat.com/presentation/python/python-pptx/">programmatiski izvilkt</a> visus attēlus no prezentācijas bez ārējām bibliotēkām?</p>
<p><strong>A4:</strong> Vienkārši atveriet <code>.pptx</code> failu ar jebkuru standarta zip rīku un izvelciet visus bināros failus, kas atrodas <code>ppt/media/</code> direktorijā.</p>
<p>**Q: Vai ir droši parsēt lietotāju augšupielādētus PPTX failus ar standarta XML parsētājiem?</p>
<p><strong>A5:</strong> Nē, jums jāstiprina savs parsētājs vai jāizmanto droši apvalki, piemēram, <code>defusedxml</code>, lai bloķētu XML ārējo elementu (XXE) un zip-bombas uzbrukumus.</p>
<h2 id="skatīt-arī">Skatīt arī</h2>
<ul>
<li><a href="https://blog.fileformat.com/presentation/powerpoint-file-formats/">Prezentāciju failu formāti vietnē FileFormat.com?</a></li>
<li><a href="https://blog.fileformat.com/presentation/apache-poi-api-to-access-powerpoint-file-formats/">Java API, lai piekļūtu PowerPoint failu formātiem</a></li>
<li><a href="https://blog.fileformat.com/presentation/odp-vs-pptx-opendocument-vs-microsoft-powerpoint-format-comparison/">ODP vs PPTX: OpenDocument pret Microsoft PowerPoint prezentācijas formāta salīdzinājums</a></li>
<li><a href="https://blog.fileformat.com/presentation/difference-between-ppt-and-pptx/">Atšķirība starp PPT un PPTX</a></li>
<li><a href="https://blog.fileformat.com/presentation/create-presentation-in-java-with-apache-poi-api/">Izveidot PowerPoint prezentāciju Java ar Apache POI API</a></li>
</ul>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    
  </channel>
</rss>
