<?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>Rekayasa Balik PPTX on File Format Blog</title>
    <link>https://blog.fileformat.com/id/tag/rekayasa-balik-pptx/</link>
    <description>Recent content in Rekayasa Balik PPTX on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>id</language>
    <lastBuildDate>Wed, 16 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.fileformat.com/id/tag/rekayasa-balik-pptx/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Rekayasa Balik PPTX: Memahami File PowerPoint Secara Internal</title>
      <link>https://blog.fileformat.com/id/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</link>
      <pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blog.fileformat.com/id/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</guid>
      <description>Temukan apa yang sebenarnya ada di dalam file `.pptx`. Pelajari bagaimana paket OpenXML, grafik hubungan, bentuk, dan markup gambar bekerja di balik layar.</description>
      <content:encoded><![CDATA[<p><strong>Terakhir Diperbarui</strong>: 16 Sep, 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="rekayasa-balik-pptx4-file-panduan-pengembang">Rekayasa Balik <a href="https://docs.fileformat.com/presentation/pptx/">PPTX</a> File: Panduan Pengembang</h2>
<p>Dek presentasi modern mendukung segala hal mulai dari pitch investor hingga metrik kuartalan internal. Namun jika Anda pernah harus secara programatis mengekstrak teks, mengganti templat saat runtime, membangun generator slide otomatis, atau membersihkan presentasi rahasia, Anda mungkin segera menyadari sesuatu: perpustakaan presentasi tingkat tinggi standar dapat terasa seperti kotak hitam yang tidak dapat diprediksi.</p>
<p>Ketika perpustakaan seperti <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>, atau <a href="https://products.fileformat.com/presentation/net/openxmlsdk/">OpenXML SDK</a> mencapai batasnya—atau memperkenalkan bug tata letak yang tidak terdokumentasi—satu-satunya cara keluar adalah melaluinya. Anda perlu memahami apa sebenarnya presentasi PowerPoint pada tingkat byte dan skema.</p>
<p>Dalam penyelaman mendalam ini, kami akan mengungkap tirai format <code>.pptx</code>, membongkar struktur internalnya, melacak grafik hubungannya, mengurai hierarki gambarannya, dan melihat strategi praktis untuk rekayasa balik, inspeksi, serta manipulasi presentasi dengan kode mentah.</p>
<h2 id="1-apa-sebenarnya-file-pptx">1. Apa sebenarnya file <code>.pptx</code>?</h2>
<p>Pada dasarnya, file <code>.pptx</code> bukanlah binary monolitik proprietari seperti format <code>.ppt</code> kuno dari tahun 1990-an. Sejak Microsoft memperkenalkan Office Open XML (ECMA-376 dan ISO/IEC 29500), dokumen Office modern adalah <strong>arsip Open Packaging Conventions (OPC)</strong>.</p>
<p>Dalam bahasa sederhana: <strong>file <code>.pptx</code> hanyalah arsip zip yang berisi dokumen XML dan aset media yang diatur dalam struktur direktori deterministik.</strong></p>
<p>Anda dapat membuktikannya dalam hitungan detik menggunakan alat terminal standar:</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>Pohon direktori yang dihasilkan tampak sangat konsisten:</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>Setiap aset visual, transisi, pewarisan master slide, koordinat kotak teks, dan grafik vektor dikodifikasi dalam hierarki file ini.</p>
<h2 id="2-anatomi-paket-subsistem-utama">2. Anatomi Paket: Sub‑sistem Utama</h2>
<p>Untuk merekayasa balik presentasi secara efektif, Anda harus memahami tanggung jawab masing-masing komponen tingkat atas.</p>
<h3 id="content_typesxml"><code>[Content_Types].xml</code></h3>
<p>Ini adalah manifest masuk untuk pembaca OPC. Ia memetakan ekstensi file dan nama bagian internal yang eksplisit ke tipe MIME/konten standar. Jika Anda membuat slide baru atau menambahkan gambar dan tidak mendeklarasikannya di <code>[Content_Types].xml</code>, PowerPoint akan menganggap dek rusak dan meminta pemulihan.</p>
<p>Contoh potongan kode:</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="grafik-hubungan-_rels">Grafik Hubungan <code>_rels/</code></h3>
<p>Salah satu konsep paling penting dalam OpenXML adalah <strong>indireksi melalui relationships</strong>. Bagian-bagian jarang menunjuk langsung ke jalur file mentah. Sebaliknya, sebuah file (misalnya <code>slide1.xml</code>) memiliki file relationship terkait yang terletak di folder <code>_rels</code> saudara (misalnya <code>_rels/slide1.xml.rels</code>).</p>
<p>Hubungan mendefinisikan:</p>
<ul>
<li>Tautan hiper (<code>r:id=&quot;rId2&quot;</code>, TargetMode=&ldquo;External&rdquo;)</li>
<li>Gambar dan trek audio yang disimpan di <code>ppt/media/</code></li>
<li>Penunjuk pewarisan tata letak (<code>slideLayout1.xml</code>)</li>
<li>Slide catatan, komentar, dan font yang tertanam</li>
</ul>
<h3 id="docprops-metadata"><code>docProps/</code> (Metadata)</h3>
<ul>
<li><strong><code>core.xml</code></strong>: metadata Dublin Core—penulis, judul, tanggal pembuatan, cap waktu modifikasi.</li>
<li><strong><code>app.xml</code></strong>: statistik khusus aplikasi—versi PowerPoint, total jumlah slide, jumlah slide tersembunyi, jumlah kata, nama templat presentasi.</li>
</ul>
<h3 id="ppt-mesin-presentasi"><code>ppt/</code> (Mesin Presentasi)</h3>
<p>Di sinilah presentasi sebenarnya berada:</p>
<ul>
<li><strong><code>presentation.xml</code></strong>: Tulang punggung utama. Ini mendaftarkan ID slide, dimensi ukuran slide, referensi master catatan, dan pengaturan font default.</li>
<li><strong><code>slides/</code></strong>: Slide individual (<code>slide1.xml</code>, <code>slide2.xml</code>, dll).</li>
<li><strong><code>slideLayouts/</code></strong>: Preset struktural master (Slide Judul, Dua Kolom, Header Seksi).</li>
<li><strong><code>slideMasters/</code></strong>: Gaya global, palet default, isi latar belakang, dan pewarisan placeholder.</li>
<li><strong><code>theme/</code></strong>: Palet warna (aksen 1 hingga 6, variasi gelap/terang) dan skema font (font utama/minor).</li>
<li><strong><code>media/</code></strong>: Gambar mentah (PNG, JPEG, SVG), audio, dan file video.</li>
</ul>
<h2 id="3-membongkar-slide-dialek-presentationml-p--drawingml-a">3. Membongkar Slide: Dialek PresentationML (<code>p:</code>) &amp; DrawingML (<code>a:</code>)</h2>
<p>Saat Anda membuka <code>ppt/slides/slide1.xml</code>, Anda akan menemukan dua namespace XML utama:</p>
<ol>
<li><strong>PresentationML (<code>p:</code>)</strong>: Mengatur elemen presentasi struktural (slide, pohon bentuk, grup kanvas).</li>
<li><strong>DrawingML (<code>a:</code>)</strong>: Mengatur tipografi, geometri, koordinat 2D, isian gradien, dan rendering vektor.</li>
</ol>
<p>Berikut contoh sederhana dari bentuk teks standar:</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="unit-ukuran-penting-emu-dan-seperseratus-poin">Unit Ukuran Penting: EMU dan Seperseratus Poin</h3>
<p>Perhatikan angka koordinat dalam <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>Ini adalah <strong>Unit Metrik Inggris (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 memungkinkan bilangan bulat mewakili pecahan tepat dari inci dan milimeter tanpa kesalahan pembulatan floating-point di berbagai arsitektur perangkat keras.</p>
<p>Perhatikan juga ukuran font:</p>
<ul>
<li><code>sz=&quot;3200&quot;</code> berarti <strong>32,00 pt</strong>. Ukuran font dalam DrawingML diukur dalam satuan satu per seratus poin.</li>
</ul>
<h2 id="4-rantai-pewarisan-mengapa-bentuk-mewarisi-gaya-tak-terlihat">4. Rantai Pewarisan: Mengapa Bentuk Mewarisi Gaya Tak Terlihat</h2>
<p>Salah satu jebakan paling umum saat merekayasa balik file PPTX adalah mengasumsikan bahwa gaya visual sebuah bentuk sepenuhnya dideklarasikan di dalam <code>slideX.xml</code> miliknya.</p>
<p>Pada kenyataannya, OpenXML bergantung pada <strong>model pewarisan berjenjang 4 tingkat</strong> yang ketat:</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>Jika sebuah kotak teks pada <code>slide1.xml</code> berisi:</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>Tidak ada keluarga font, tidak ada warna eksplisit, dan tidak ada ukuran yang dideklarasikan pada run (<code>&lt;a:r&gt;</code>). Untuk mengetahui bagaimana PowerPoint merender teks ini, parser Anda harus:</p>
<ol>
<li>Identifikasi jenis placeholder (<code>&lt;p:ph type=&quot;title&quot;/&gt;</code>).</li>
<li>Baca tata letak yang direferensikan dalam <code>slide1.xml.rels</code>.</li>
<li>Periksa apakah <code>slideLayout1.xml</code> menyediakan penimpaan gaya untuk placeholder tersebut.</li>
<li>Gunakan <code>slideMaster1.xml</code> sebagai cadangan untuk gaya default teks judul.</li>
<li>Lacak token warna seperti <code>accent1</code> atau <code>tx1</code> ke dalam <code>theme1.xml</code> untuk menemukan kode warna heksadesimal.</li>
</ol>
<p>Jika Anda melewatkan grafik pewarisan ini, parser Anda akan salah membaca gaya, kehilangan font, ukuran font, dan anchor tata letak.</p>
<h2 id="5-alur-kerja-rekayasa-balik-praktis">5. Alur Kerja Rekayasa Balik Praktis</h2>
<p>Ketika Anda perlu menyelidiki bagaimana fitur PowerPoint tertentu bekerja di balik layar (mis., transisi morph, tabel kompleks, jalur vektor), ikuti pendekatan empiris ini:</p>
<h3 id="langkah-1-buat-diff-pair-minimal">Langkah 1: Buat &ldquo;Diff Pair&rdquo; Minimal</h3>
<ol>
<li>Buka PowerPoint dan buat slide kosong.</li>
<li>Simpan sebagai <code>before.pptx</code>.</li>
<li>Terapkan satu perubahan tepat yang ingin Anda rekayasa balik (mis., tambahkan bayangan jatuh pada lingkaran, ubah gaya bullet, sisipkan video tersemat).</li>
<li>Simpan sebagai <code>after.pptx</code>.</li>
</ol>
<h3 id="langkah-2-buka-kedua-arsip">Langkah 2: Buka Kedua Arsip</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="langkah-3-format-xml">Langkah 3: Format XML</h3>
<p>XML mentah di dalam arsip Office biasanya dihilangkan indentasi dan karakter baris baru. Sebelum melakukan diff, format file-file tersebut:</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="langkah-4-jalankan-unified-diff">Langkah 4: Jalankan 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>Meninjau <code>changes.patch</code> mengungkapkan nama tag yang tepat, atribut namespace, dan hierarki kontainer yang diperkenalkan PowerPoint. Ini adalah cara tercepat untuk menemukan properti skema yang tidak terdokumentasi atau obscure tanpa harus menggali ribuan halaman dokumentasi ECMA-376.</p>
<h2 id="6-membangun-mikro-engine-kustom-buka-modifikasi-kemasi-ulang">6. Membangun Mikro-Engine Kustom: Buka, Modifikasi, Kemasi Ulang</h2>
<p>Kadang-kadang Anda tidak menginginkan ketergantungan perusahaan yang berat seperti Apache POI atau Microsoft OpenXML SDK—terutama dalam runtime serverless yang ringan (AWS Lambda, Cloudflare Workers, node edge).</p>
<p>Berikut adalah pola Python mandiri yang menunjukkan cara mengekstrak zip PPTX dalam memori dengan aman, menyuntikkan data khusus menggunakan alat pustaka standar, dan mengemas ulangnya:</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="hal-hal-penting-saat-memodifikasi-file-pada-tingkat-byte-mentah">Hal-hal Penting Saat Memodifikasi File pada Tingkat Byte Mentah:</h3>
<ol>
<li><strong>Preservasi Namespace</strong>: Parser XML sering menulis ulang prefiks (<code>xmlns:p</code> mungkin menjadi <code>xmlns:ns0</code>). Meskipun XML valid, validasi skema internal PowerPoint yang ketat kadang menolak alias prefiks yang tidak standar. Daftarkan namespace secara eksplisit.</li>
<li><strong>Metode Kompresi ZIP</strong>: Pastikan Anda menulis kembali file menggunakan kompresi deflate standar (<code>zipfile.ZIP_DEFLATED</code>).</li>
<li><strong>Pengosongan Stream</strong>: Selalu periksa bahwa buffer zip Anda menutup dan mengosongkan sepenuhnya sebelum mengirim byte ke hilir.</li>
<li><strong>Pertahankan Relasi</strong>: Jika Anda menghapus slide, Anda juga harus menghapus entri-nya dari <code>ppt/presentation.xml</code>, menghapus relasinya di <code>ppt/_rels/presentation.xml.rels</code>, dan membersihkan tipe kontennya dari <code>[Content_Types].xml</code>.</li>
</ol>
<h2 id="7-pertimbangan-kinerja--keamanan">7. Pertimbangan Kinerja &amp; Keamanan</h2>
<p>Merekayasa balik file PPTX tidak hanya tentang mengedit slide; tetapi juga tentang mengaudit apa yang masuk ke sistem Anda.</p>
<h3 id="keamanan-tawa-miliar--xxe">Keamanan: Tawa Miliar &amp; XXE</h3>
<p>Karena file PPTX mem-parsing XML, setiap pipeline sisi server yang menerima presentasi yang diajukan pengguna rentan terhadap:</p>
<ul>
<li><strong>Injeksi Entitas Eksternal XML (XXE)</strong>: XML berbahaya yang mencoba mengakses <code>/etc/passwd</code> atau menanyakan endpoint metadata cloud internal (<code>http://169.254.169.254/</code>).</li>
<li><strong>Serangan Ekspansi Entitas (Billion Laughs)</strong>: Loop entitas eksponensial yang menghabiskan RAM sistem.</li>
</ul>
<p><strong>Mitigasi</strong>: Selalu nonaktifkan <code>resolve_entities</code>, <code>load_dtd</code>, dan resolusi jaringan eksternal di parser XML Anda (mis., menggunakan <code>defusedxml</code> dalam Python).</p>
<h3 id="keamanan-muatan-makro-dan-aliran-tersembunyi">Keamanan: Muatan Makro dan Aliran Tersembunyi</h3>
<p>Periksa file untuk konten <code>.pptm</code> yang menyamar di bawah ekstensi <code>.pptx</code>. Waspadai <code>ppt/vbaProject.bin</code>, yang berisi kode Visual Basic yang telah dikompilasi. Pada file <code>.pptx</code> standar, kode VBA dilarang; menemukan referensi payload biner dalam relationships harus segera memicu flag karantina.</p>
<h2 id="kesimpulan">Kesimpulan</h2>
<p>Rekayasa balik file <code>.pptx</code> mengungkap misteri perangkat lunak presentasi. Setelah Anda menyadari bahwa file PowerPoint hanyalah paket zip terstruktur yang berisi koordinat, referensi skema, dan pohon hubungan XML, Anda tidak lagi terikat oleh abstraksi pihak ketiga yang ada.</p>
<p>Apakah Anda sedang mengoptimalkan throughput pembuatan slide, menulis sanitizer otomatis khusus, atau memecahkan masalah gangguan rendering, melihat langsung pada arsitektur OpenXML yang mendasari memberi Anda kontrol penuh atas alur kerja presentasi.</p>
<h2 id="pertanyaan-yang-sering-diajukan-faq">Pertanyaan yang Sering Diajukan (FAQ)</h2>
<p>**Q: Apakah Anda dapat mengonversi .pptx menjadi folder standar dan mengedit file secara langsung di IDE?</p>
<p><strong>A1:</strong> Ya, Anda dapat mengekstrak arsip, mengedit XML di editor seperti VS Code, dan meng-zip kembali isi direktori untuk membukanya kembali di PowerPoint.</p>
<p>**Q: Mengapa PowerPoint mengatakan file PPTX yang saya modifikasi secara manual perlu diperbaiki?</p>
<p><strong>A2:</strong> Ini biasanya terjadi jika Anda memperkenalkan XML yang rusak, menghilangkan aset baru dari <code>[Content_Types].xml</code>, atau meninggalkan referensi yang menggantung dalam file <code>.rels</code> yang terkait.</p>
<p>**Q: Unit pengukuran apa yang digunakan PowerPoint untuk posisi dan margin bentuk?</p>
<p><strong>A3:</strong> PowerPoint menggunakan English Metric Units (EMUs), di mana 1 inci sama dengan 914.400 EMU dan 1 poin sama dengan 12.700 EMU.</p>
<p>**Q: Bagaimana saya dapat <a href="https://products.fileformat.com/presentation/python/python-pptx/">mengekstrak secara programatik</a> semua gambar dari presentasi tanpa perpustakaan eksternal?</p>
<p><strong>A4:</strong> Cukup buka file <code>.pptx</code> dengan utilitas zip standar apa pun dan ekstrak semua file biner yang berada di dalam direktori <code>ppt/media/</code>.</p>
<p>**Q: Apakah aman untuk mengurai file PPTX yang diunggah pengguna dengan parser XML standar?</p>
<p><strong>A5:</strong> Tidak, Anda harus memperkuat parser Anda atau menggunakan pembungkus aman seperti <code>defusedxml</code> untuk memblokir serangan XML External Entity (XXE) dan zip-bomb.</p>
<h2 id="lihat-juga">Lihat Juga</h2>
<ul>
<li><a href="https://blog.fileformat.com/presentation/powerpoint-file-formats/">Format File Presentasi di FileFormat.com?</a></li>
<li><a href="https://blog.fileformat.com/presentation/apache-poi-api-to-access-powerpoint-file-formats/">Java API untuk Mengakses Format File PowerPoint</a></li>
<li><a href="https://blog.fileformat.com/presentation/odp-vs-pptx-opendocument-vs-microsoft-powerpoint-format-comparison/">ODP vs PPTX: Perbandingan Format OpenDocument vs Microsoft PowerPoint</a></li>
<li><a href="https://blog.fileformat.com/presentation/difference-between-ppt-and-pptx/">Perbedaan Antara PPT dan PPTX</a></li>
<li><a href="https://blog.fileformat.com/presentation/create-presentation-in-java-with-apache-poi-api/">Buat Presentasi PowerPoint di Java dengan API Apache POI</a></li>
</ul>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    
  </channel>
</rss>
