<?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>Kejuruteraan Terbalik PPTX on File Format Blog</title>
    <link>https://blog.fileformat.com/ms/tag/kejuruteraan-terbalik-pptx/</link>
    <description>Recent content in Kejuruteraan Terbalik PPTX on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ms</language>
    <lastBuildDate>Wed, 16 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.fileformat.com/ms/tag/kejuruteraan-terbalik-pptx/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Kejuruteraan Terbalik PPTX: Memahami Fail PowerPoint Secara Dalaman</title>
      <link>https://blog.fileformat.com/ms/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</link>
      <pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blog.fileformat.com/ms/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</guid>
      <description>Temui apa yang sebenarnya terdapat dalam fail `.pptx`. Pelajari bagaimana pembungkusan OpenXML, graf hubungan, bentuk, dan markup lukisan berfungsi di sebalik tabir.</description>
      <content:encoded><![CDATA[<p><strong>Kemas Kini Terakhir</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="kejuruteraan-terbalik-pptx4-fail-panduan-pembangun">Kejuruteraan Terbalik <a href="https://docs.fileformat.com/presentation/pptx/">PPTX</a> Fail: Panduan Pembangun</h2>
<p>Dek persembahan moden menyokong segala-galanya dari pembentangan pelabur hingga metrik suku tahunan dalaman. Tetapi jika anda pernah perlu mengekstrak teks secara programatik, menggantikan templat semasa masa jalan, membina penjana slaid automatik, atau membersihkan persembahan sulit, anda mungkin menyedari dengan cepat: perpustakaan persembahan peringkat tinggi yang standard boleh terasa seperti kotak hitam yang tidak dapat diramalkan.</p>
<p>Apabila 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 had mereka—atau memperkenalkan pepijat susun atur yang tidak didokumentasikan—satu-satunya cara keluar ialah menerobosinya. Anda perlu memahami apa sebenarnya persembahan PowerPoint pada tahap bait dan skema.</p>
<p>Dalam selaman mendalam ini, kami akan menyingkap tirai format <code>.pptx</code>, membuka struktur dalaman, menjejaki graf hubungan, membahagikan hierarki lukisan, dan melihat strategi praktikal untuk kejuruteraan songsang, pemeriksaan, serta manipulasi persembahan dengan kod mentah.</p>
<h2 id="1-apa-itu-fail-pptx-sebenarnya">1. Apa Itu Fail <code>.pptx</code> Sebenarnya?</h2>
<p>Pada dasarnya, fail <code>.pptx</code> bukanlah binari proprietari monolitik seperti format <code>.ppt</code> kuno pada tahun 1990-an. Sejak Microsoft memperkenalkan Office Open XML (ECMA-376 dan ISO/IEC 29500), dokumen Office moden adalah <strong>arkib Open Packaging Conventions (OPC)</strong>.</p>
<p>Dalam bahasa yang mudah: <strong>fail <code>.pptx</code> hanyalah arkib zip yang mengandungi dokumen XML dan aset media yang disusun dalam struktur direktori yang deterministik.</strong></p>
<p>Anda boleh membuktikannya dalam beberapa saat menggunakan alat terminal standard:</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>Pokok direktori yang terhasil kelihatan 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, peralihan, warisan slaid utama, koordinat kotak teks, dan grafik vektor dikodkan dalam hierarki fail ini.</p>
<h2 id="2-anatomi-pakej-sub-sistem-utama">2. Anatomi Pakej: Sub-sistem Utama</h2>
<p>Untuk mengubah suai persembahan dengan berkesan, anda mesti memahami tanggungjawab setiap komponen peringkat atas.</p>
<h3 id="content_typesxml"><code>[Content_Types].xml</code></h3>
<p>Ini adalah manifes masuk untuk pembaca OPC. Ia memetakan sambungan fail dan nama bahagian dalaman yang jelas kepada jenis MIME/kandungan piawai. Jika anda membuat slaid baru atau menambah imej dan gagal menyatakannya dalam <code>[Content_Types].xml</code>, PowerPoint akan mengisytiharkan dek rosak dan meminta pemulihan.</p>
<p>Contoh snippet:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span><span style="color:#f92672">&lt;Types</span> <span style="color:#a6e22e">xmlns=</span><span style="color:#e6db74">&#34;http://schemas.openxmlformats.org/package/2006/content-types&#34;</span><span style="color:#f92672">&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;Default</span> <span style="color:#a6e22e">Extension=</span><span style="color:#e6db74">&#34;xml&#34;</span> <span style="color:#a6e22e">ContentType=</span><span style="color:#e6db74">&#34;application/xml&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;Default</span> <span style="color:#a6e22e">Extension=</span><span style="color:#e6db74">&#34;rels&#34;</span> <span style="color:#a6e22e">ContentType=</span><span style="color:#e6db74">&#34;application/vnd.openxmlformats-package.relationships+xml&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;Default</span> <span style="color:#a6e22e">Extension=</span><span style="color:#e6db74">&#34;png&#34;</span> <span style="color:#a6e22e">ContentType=</span><span style="color:#e6db74">&#34;image/png&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;Override</span> <span style="color:#a6e22e">PartName=</span><span style="color:#e6db74">&#34;/ppt/presentation.xml&#34;</span> 
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">ContentType=</span><span style="color:#e6db74">&#34;application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">&lt;/Types&gt;</span>
</span></span></code></pre></div><h3 id="graf-hubungan-_rels">Graf Hubungan <code>_rels/</code></h3>
<p>Salah satu konsep paling penting dalam OpenXML ialah <strong>indireksi melalui hubungan</strong>. Bahagian jarang menunjuk secara langsung ke laluan fail mentah. Sebaliknya, satu fail (contoh, <code>slide1.xml</code>) mempunyai fail hubungan yang berkaitan yang terletak dalam folder <code>_rels</code> sebelah (contoh, <code>_rels/slide1.xml.rels</code>).</p>
<p>Hubungan mendefinisikan:</p>
<ul>
<li>Pautan hiper (<code>r:id=&quot;rId2&quot;</code>, TargetMode=&ldquo;External&rdquo;)</li>
<li>Imej dan trek audio yang disimpan dalam <code>ppt/media/</code></li>
<li>Penunjuk pewarisan susun atur (<code>slideLayout1.xml</code>)</li>
<li>Slaid nota, komen, dan fon terbenam</li>
</ul>
<h3 id="docprops-metadata"><code>docProps/</code> (Metadata)</h3>
<ul>
<li><strong><code>core.xml</code></strong>: Metadata Dublin Core—pengarang, tajuk, tarikh penciptaan, cap masa pengubahsuaian.</li>
<li><strong><code>app.xml</code></strong>: Statistik khusus aplikasi—versi PowerPoint, jumlah bilangan slaid, bilangan slaid tersembunyi, kiraan perkataan, nama templat persembahan.</li>
</ul>
<h3 id="ppt-enjin-persembahan"><code>ppt/</code> (Enjin Persembahan)</h3>
<p>Di sinilah persembahan sebenar berada:</p>
<ul>
<li><strong><code>presentation.xml</code></strong>: Tulang belakang utama. Ia mendaftar ID slaid, dimensi saiz slaid, rujukan nota utama, dan tetapan fon lalai.</li>
<li><strong><code>slides/</code></strong>: Slaid individu (<code>slide1.xml</code>, <code>slide2.xml</code>, dll).</li>
<li><strong><code>slideLayouts/</code></strong>: Praset struktur utama (Slaid Tajuk, Dua Lajur, Tajuk Bahagian).</li>
<li><strong><code>slideMasters/</code></strong>: Gaya global, palet lalai, isian latar belakang, dan warisan tempat letak.</li>
<li><strong><code>theme/</code></strong>: Palet warna (aksen 1 hingga 6, variasi gelap/cerah) dan skema fon (fon utama/kecil).</li>
<li><strong><code>media/</code></strong>: Imej mentah (PNG, JPEG, SVG), audio, dan fail video.</li>
</ul>
<h2 id="3-membongkar-slaid-dialek-presentationml-p--drawingml-a">3. Membongkar Slaid: Dialek PresentationML (<code>p:</code>) &amp; DrawingML (<code>a:</code>)</h2>
<p>Apabila anda membuka <code>ppt/slides/slide1.xml</code>, anda akan menemui dua ruang nama XML utama:</p>
<ol>
<li><strong>PresentationML (<code>p:</code>)</strong>: Mengawal elemen persembahan struktur (slaid, pokok bentuk, kumpulan kanvas).</li>
<li><strong>DrawingML (<code>a:</code>)</strong>: Mengawal tipografi, geometri, koordinat 2D, isian gradien, dan rendering vektor.</li>
</ol>
<p>Berikut ialah contoh ringkas tentang bagaimana bentuk teks standard kelihatan:</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-persepuluh-peratus-titik">Unit Ukuran Penting: EMU dan Persepuluh Peratus Titik</h3>
<p>Perhatikan nombor 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 ialah <strong>English Metric Units (EMUs)</strong>.</p>
<ul>
<li>$1 \text{ inch} = 914,400 \text{ EMUs}$</li>
<li>$1 \text{ cm} = 360,000 \text{ EMUs}$</li>
<li>$1 \text{ pt} = 12,700 \text{ EMUs}$</li>
</ul>
<p>EMUs membenarkan integer mewakili pecahan tepat bagi inci dan milimeter tanpa ralat pembundaran titik apung merentasi pelbagai seni bina perkakasan.</p>
<p>Perhatikan juga saiz fon:</p>
<ul>
<li><code>sz=&quot;3200&quot;</code> bermaksud <strong>32.00 pt</strong>. Saiz fon dalam DrawingML diukur dalam peratus titik.</li>
</ul>
<h2 id="4-rantaian-pewarisan-mengapa-bentuk-mewarisi-gaya-tidak-kelihatan">4. Rantaian Pewarisan: Mengapa Bentuk Mewarisi Gaya Tidak Kelihatan</h2>
<p>Salah satu perangkap paling umum semasa kejuruteraan terbalik fail PPTX ialah menganggap bahawa gaya visual sesuatu bentuk dinyatakan sepenuhnya di dalam <code>slideX.xml</code>nya.</p>
<p>Pada hakikatnya, OpenXML bergantung pada <strong>model pewarisan berperingkat 4 lapisan yang ketat</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>Jika kotak teks pada <code>slide1.xml</code> mengandungi:</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>Tiada keluarga fon, tiada warna eksplisit, dan tiada saiz yang dinyatakan pada run (<code>&lt;a:r&gt;</code>). Untuk mengetahui bagaimana PowerPoint memaparkan teks ini, parser anda mesti:</p>
<ol>
<li>Kenal pasti jenis tempat letak (<code>&lt;p:ph type=&quot;title&quot;/&gt;</code>).</li>
<li>Baca susun atur yang dirujuk dalam <code>slide1.xml.rels</code>.</li>
<li>Semak sama ada <code>slideLayout1.xml</code> menyediakan penggantian gaya untuk tempat letak itu.</li>
<li>Kembali kepada <code>slideMaster1.xml</code> untuk gaya badan teks tajuk lalai.</li>
<li>Jejaki token warna seperti <code>accent1</code> atau <code>tx1</code> dalam <code>theme1.xml</code> untuk mencari kod warna heksadesimal.</li>
</ol>
<p>Jika anda melangkau graf pewarisan ini, parser anda akan salah membaca gaya, kehilangan fon, saiz fon, dan penanda susun atur.</p>
<h2 id="5-aliran-kerja-kejuruteraan-songsang-praktikal">5. Aliran Kerja Kejuruteraan Songsang Praktikal</h2>
<p>Apabila anda perlu menyelidik bagaimana ciri PowerPoint tertentu berfungsi di belakang tabir (contoh: peralihan morph, jadual kompleks, laluan vektor), ikuti pendekatan empirik ini:</p>
<h3 id="langkah-1-buat-diff-pair-minimum">Langkah 1: Buat &ldquo;Diff Pair&rdquo; Minimum</h3>
<ol>
<li>Buka PowerPoint dan buat slaid kosong.</li>
<li>Simpan sebagai <code>before.pptx</code>.</li>
<li>Terapkan perubahan tunggal yang tepat yang anda ingin kejuruteraan terbalik (contoh: tambahkan bayang jatuh pada bulatan, ubah gaya bullet, sisipkan video terbenam).</li>
<li>Simpan sebagai <code>after.pptx</code>.</li>
</ol>
<h3 id="langkah-2-buka-kedua-dua-arkib">Langkah 2: Buka Kedua-dua Arkib</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 dalam arkib Office biasanya dibuang penjarakan dan aksara baris baru. Sebelum membuat perbezaan, formatkan fail:</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-diff-bersepadu">Langkah 4: Jalankan Diff Bersepadu</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>Mengkaji <code>changes.patch</code> mendedahkan nama tag tepat, atribut ruang nama, dan hierarki kontena yang diperkenalkan oleh PowerPoint. Ini adalah cara paling cepat untuk menemui sifat skema yang tidak didokumentasikan atau sukar difahami tanpa menyelam melalui ribuan halaman dokumentasi ECMA-376.</p>
<h2 id="6-membina-mikro-enjin-tersuai-buka-ubah-bungkukkan-semula">6. Membina Mikro-Enjin Tersuai: Buka, Ubah, Bungkukkan Semula</h2>
<p>Kadang-kadang anda tidak mahu kebergantungan perusahaan yang berat seperti Apache POI atau Microsoft OpenXML SDK—terutamanya dalam runtime tanpa pelayan yang ringan (AWS Lambda, Cloudflare Workers, nod tepi).</p>
<p>Berikut ialah corak Python berdiri sendiri yang menunjukkan cara membuka zip PPTX dalam memori dengan selamat, menyuntik data tersuai menggunakan alat perpustakaan piawai, dan membungkus semula:</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="perkara-penting-yang-perlu-diperhatikan-semasa-mengubah-fail-pada-tahap-byte-mentah">Perkara Penting yang Perlu Diperhatikan Semasa Mengubah Fail pada Tahap Byte Mentah:</h3>
<ol>
<li><strong>Pemeliharaan Namespace</strong>: Pengurai XML sering menulis semula awalan (<code>xmlns:p</code> mungkin menjadi <code>xmlns:ns0</code>). Walaupun XML yang sah, pengesahan skema dalaman PowerPoint yang ketat kadang-kadang menolak alias awalan yang tidak standard. Daftarkan namespace secara eksplisit.</li>
<li><strong>Kaedah Pemampatan ZIP</strong>: Pastikan anda menulis semula fail menggunakan pemampatan deflate standard (<code>zipfile.ZIP_DEFLATED</code>).</li>
<li><strong>Pembuangan Aliran</strong>: Sentiasa periksa bahawa penampan zip anda ditutup dan dibuang sepenuhnya sebelum menghantar bait ke hiliran.</li>
<li><strong>Kekalkan Hubungan</strong>: Jika anda mengeluarkan slaid, anda juga mesti mengeluarkan entri tersebut daripada <code>ppt/presentation.xml</code>, memadam hubungannya dalam <code>ppt/_rels/presentation.xml.rels</code>, dan membersihkan jenis kandungannya daripada <code>[Content_Types].xml</code>.</li>
</ol>
<h2 id="7-pertimbangan-prestasi--keselamatan">7. Pertimbangan Prestasi &amp; Keselamatan</h2>
<p>Kejuruteraan terbalik fail PPTX bukan hanya tentang menyunting slaid; ia juga tentang mengaudit apa yang masuk ke dalam sistem anda.</p>
<h3 id="keselamatan-bilion-ketawa--xxe">Keselamatan: Bilion Ketawa &amp; XXE</h3>
<p>Oleh kerana fail PPTX memproses XML, sebarang saluran sisi pelayan yang mengambil persembahan yang dihantar pengguna terdedah kepada:</p>
<ul>
<li><strong>Serangan Entiti Luaran XML (XXE)</strong>: XML berniat jahat yang cuba mengakses <code>/etc/passwd</code> atau menanyakan titik akhir metadata awan dalaman (<code>http://169.254.169.254/</code>).</li>
<li><strong>Serangan Pengembangan Entiti (Billion Laughs)</strong>: Gelung entiti eksponen yang menghabiskan RAM sistem.</li>
</ul>
<p><strong>Mitigasi</strong>: Sentiasa lumpuhkan <code>resolve_entities</code>, <code>load_dtd</code>, dan resolusi rangkaian luaran dalam parser XML anda (contohnya, menggunakan <code>defusedxml</code> dalam Python).</p>
<h3 id="keselamatan-muatan-makro-dan-aliran-tersembunyi">Keselamatan: Muatan Makro dan Aliran Tersembunyi</h3>
<p>Periksa fail untuk kandungan <code>.pptm</code> yang menyamar di bawah sambungan <code>.pptx</code>. Perhatikan <code>ppt/vbaProject.bin</code>, yang mengandungi kod visual basic yang telah disusun. Dalam fail <code>.pptx</code> standard, kod VBA dilarang; menemukan rujukan muatan binari dalam hubungan harus serta-merta mencetuskan bendera karantina.</p>
<h2 id="kesimpulan">Kesimpulan</h2>
<p>Kejuruteraan songsang fail <code>.pptx</code> menyingkap misteri perisian persembahan. Setelah anda menyedari bahawa fail PowerPoint hanyalah pakej zip berstruktur yang dipenuhi dengan koordinat, rujukan skema, dan pokok hubungan XML, anda tidak lagi terikat dengan abstraksi pihak ketiga yang sedia ada.</p>
<p>Sama ada anda sedang mengoptimumkan kelajuan penjanaan slaid, menulis penyahjangkit automatik tersuai, atau menyelesaikan masalah gangguan rendering, melihat secara langsung pada seni bina OpenXML yang mendasari memberi anda kawalan penuh ke atas aliran kerja persembahan.</p>
<h2 id="soalan-lazim-faq">Soalan Lazim (FAQ)</h2>
<p>**Q: Bolehkah anda menukar .pptx kepada folder standard dan mengedit fail secara langsung dalam IDE?</p>
<p><strong>A1:</strong> Ya, anda boleh mengekstrak arkib, mengedit XML dalam penyunting seperti VS Code, dan menyusun semula (re-zip) kandungan direktori untuk membukanya semula dalam PowerPoint.</p>
<p>**Q: Mengapa PowerPoint mengatakan fail PPTX yang saya ubah secara manual memerlukan pembaikan?</p>
<p><strong>A2:</strong> Ini biasanya berlaku jika anda memperkenalkan XML yang rosak, mengabaikan aset baru dari <code>[Content_Types].xml</code>, atau meninggalkan rujukan tergantung dalam fail <code>.rels</code> yang berkaitan.</p>
<p>**Q: Apakah unit ukuran yang digunakan PowerPoint untuk kedudukan bentuk dan margin?</p>
<p><strong>A3:</strong> PowerPoint menggunakan English Metric Units (EMUs), di mana 1 inci bersamaan dengan 914,400 EMUs dan 1 mata titik bersamaan dengan 12,700 EMUs.</p>
<p>**Q: Bagaimana saya boleh <a href="https://products.fileformat.com/presentation/python/python-pptx/">mengekstrak secara program</a> semua imej daripada persembahan tanpa perpustakaan luaran?</p>
<p><strong>A4:</strong> Cukup buka fail <code>.pptx</code> dengan sebarang utiliti zip standard dan ekstrak semua fail binari yang terletak di dalam direktori <code>ppt/media/</code>.</p>
<p>**Q: Adakah selamat untuk mengurai fail PPTX yang dimuat naik pengguna dengan pengurai XML standard?</p>
<p><strong>A5:</strong> Tidak, anda mesti mengukuhkan pengurai anda atau menggunakan pembungkus selamat seperti <code>defusedxml</code> untuk menyekat 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 Fail Persembahan 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 Fail PowerPoint</a></li>
<li><a href="https://blog.fileformat.com/presentation/odp-vs-pptx-opendocument-vs-microsoft-powerpoint-format-comparison/">ODP vs PPTX: OpenDocument vs Format Persembahan Microsoft PowerPoint</a></li>
<li><a href="https://blog.fileformat.com/presentation/difference-between-ppt-and-pptx/">Perbezaan Antara PPT dan PPTX</a></li>
<li><a href="https://blog.fileformat.com/presentation/create-presentation-in-java-with-apache-poi-api/">Buat Pembentangan PowerPoint dalam Java dengan API Apache POI</a></li>
</ul>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    
  </channel>
</rss>
