<?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 on File Format Blog</title>
    <link>https://blog.fileformat.com/th/tag/%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%A7%E0%B8%B4%E0%B8%A8%E0%B8%A7%E0%B8%81%E0%B8%A3%E0%B8%A3%E0%B8%A1%E0%B8%A2%E0%B9%89%E0%B8%AD%E0%B8%99%E0%B8%81%E0%B8%A5%E0%B8%B1%E0%B8%9A-pptx/</link>
    <description>Recent content in การวิศวกรรมย้อนกลับ PPTX on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>th</language>
    <lastBuildDate>Wed, 16 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.fileformat.com/th/tag/%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%A7%E0%B8%B4%E0%B8%A8%E0%B8%A7%E0%B8%81%E0%B8%A3%E0%B8%A3%E0%B8%A1%E0%B8%A2%E0%B9%89%E0%B8%AD%E0%B8%99%E0%B8%81%E0%B8%A5%E0%B8%B1%E0%B8%9A-pptx/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>การวิศวกรรมย้อนกลับ PPTX: ทำความเข้าใจไฟล์ PowerPoint ภายใน</title>
      <link>https://blog.fileformat.com/th/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</link>
      <pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blog.fileformat.com/th/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</guid>
      <description>ค้นพบสิ่งที่จริง ๆ แล้วอยู่ภายในไฟล์ `.pptx` เรียนรู้ว่าการบรรจุ OpenXML, กราฟความสัมพันธ์, รูปร่าง, และการทำเครื่องหมายการวาดทำงานอย่างไรภายใน</description>
      <content:encoded><![CDATA[<p><strong>อัปเดตล่าสุด</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="การวศวกรรมยอนกลบไฟล-pptx4-คมอสำหรบนกพฒนา">การวิศวกรรมย้อนกลับไฟล์ <a href="https://docs.fileformat.com/presentation/pptx/">PPTX</a>: คู่มือสำหรับนักพัฒนา</h2>
<p>ชุดสไลด์การนำเสนอสมัยใหม่ขับเคลื่อนทุกอย่างตั้งแต่การนำเสนอต่อผู้ลงทุนจนถึงเมตริกไตรมาสภายในองค์กร แต่หากคุณเคยต้องดึงข้อความออกโดยโปรแกรม, แทนที่เทมเพลตในขณะทำงาน, สร้างเครื่องสร้างสไลด์อัตโนมัติ, หรือทำความสะอาดการนำเสนอที่เป็นความลับ คุณอาจสังเกตได้อย่างรวดเร็วว่าไลบรารีการนำเสนอระดับสูงมาตรฐานอาจรู้สึกเหมือนกล่องดำที่ไม่สามารถคาดเดาได้</p>
<p>เมื่อไลบรารีเช่น <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> หรือ <a href="https://products.fileformat.com/presentation/net/openxmlsdk/">OpenXML SDK</a> ถึงขีดจำกัด—หรือแนะนำบั๊กการจัดรูปแบบที่ไม่ได้รับการบันทึก—วิธีเดียวที่เหลือคือการเจาะลึก คุณต้องเข้าใจว่าการนำเสนอ PowerPoint คืออะไรในระดับไบต์และสคีม่า</p>
<p>ในการสำรวจเชิงลึกนี้ เราจะเปิดเผยรูปแบบ <code>.pptx</code> แยกโครงสร้างภายในของมัน, ติดตามกราฟความสัมพันธ์, แยกวิเคราะห์ลำดับชั้นการวาด, และพิจารณากลยุทธ์เชิงปฏิบัติสำหรับการวิศวกรรมย้อนกลับ, การตรวจสอบ, และการจัดการการนำเสนอด้วยโค้ดดิบ</p>
<h2 id="1-ไฟล-pptx-คออะไรจรง-ๆ">1. ไฟล์ <code>.pptx</code> คืออะไรจริง ๆ?</h2>
<p>โดยพื้นฐานแล้ว ไฟล์ <code>.pptx</code> ไม่ใช่ไบนารีแบบโมโนลิธิกที่เป็นกรรมสิทธิ์เหมือนรูปแบบ <code>.ppt</code> เก่าในยุค 1990s ตั้งแต่ Microsoft แนะนำ Office Open XML (ECMA-376 และ ISO/IEC 29500) เอกสาร Office สมัยใหม่จึงเป็น <strong>Open Packaging Conventions (OPC) archives</strong>.</p>
<p>โดยง่ายๆ: <strong>ไฟล์ <code>.pptx</code> คือแค่ไฟล์ zip ที่บรรจุเอกสาร XML และสื่อที่จัดเรียงในโครงสร้างไดเรกทอรีที่กำหนดไว้ล่วงหน้า</strong>.</p>
<p>คุณสามารถพิสูจน์ได้ในไม่กี่วินาทีโดยใช้เครื่องมือเทอร์มินัลมาตรฐาน:</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>โครงสร้างไดเรกทอรีที่ได้ดูสอดคล้องกันอย่างน่าประหลาดใจ:</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>สินทรัพย์ภาพทุกชิ้น, การเปลี่ยนภาพ, การสืบทอดสไลด์มาสเตอร์, พิกัดกล่องข้อความ, และกราฟิกเวกเตอร์ทั้งหมดถูกบันทึกไว้ในโครงสร้างไฟล์นี้.</p>
<h2 id="2-โครงสรางของแพคเกจ-ระบบยอยสำคญ">2. โครงสร้างของแพคเกจ: ระบบย่อยสำคัญ</h2>
<p>เพื่อทำการวิศวกรรมย้อนกลับของงานนำเสนออย่างมีประสิทธิภาพ คุณต้องเข้าใจหน้าที่ของแต่ละส่วนระดับบนสุด.</p>
<h3 id="content_typesxml"><code>[Content_Types].xml</code></h3>
<p>นี่คือไฟล์ manifest เข้าสำหรับตัวอ่าน OPC มันทำการแมปส่วนขยายไฟล์และชื่อส่วนภายในที่ชัดเจนไปยังประเภท MIME/content มาตรฐาน หากคุณสร้างสไลด์ใหม่หรือเพิ่มรูปภาพแล้วไม่ได้ระบุไว้ใน <code>[Content_Types].xml</code> PowerPoint จะระบุว่าเด็คเสียหายและขอให้ทำการกู้คืน.</p>
<p>ตัวอย่างสแนปเพต:</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-กราฟความสมพนธ"><code>_rels/</code> กราฟความสัมพันธ์</h3>
<p>หนึ่งในแนวคิดที่สำคัญที่สุดใน OpenXML คือ <strong>การอ้อมผ่านความสัมพันธ์</strong>. ส่วนต่าง ๆ แทบไม่ชี้โดยตรงไปยังเส้นทางไฟล์ดิบ. แทนที่จะเป็นเช่นนั้น ไฟล์ (เช่น <code>slide1.xml</code>) จะมีไฟล์ความสัมพันธ์ที่เกี่ยวข้องซึ่งอยู่ในโฟลเดอร์พี่น้อง <code>_rels</code> (เช่น <code>_rels/slide1.xml.rels</code>).</p>
<p>ความสัมพันธ์กำหนด:</p>
<ul>
<li>ไฮเปอร์ลิงก์ (<code>r:id=&quot;rId2&quot;</code>, TargetMode=&ldquo;External&rdquo;)</li>
<li>ภาพและแทร็กเสียงที่จัดเก็บใน <code>ppt/media/</code></li>
<li>ตัวชี้การสืบทอดเลย์เอาต์ (<code>slideLayout1.xml</code>)</li>
<li>สไลด์บันทึก, ความคิดเห็น, และฟอนต์ที่ฝังไว้</li>
</ul>
<h3 id="docprops-เมตาดาตา"><code>docProps/</code> (เมตาดาต้า)</h3>
<ul>
<li><strong><code>core.xml</code></strong>: เมตาดาต้า Dublin Core—ผู้เขียน, ชื่อเรื่อง, วันที่สร้าง, เวลาประทับการแก้ไข.</li>
<li><strong><code>app.xml</code></strong>: สถิติเฉพาะแอปพลิเคชัน—เวอร์ชัน PowerPoint, จำนวนสไลด์ทั้งหมด, จำนวนสไลด์ที่ซ่อน, จำนวนคำ, ชื่อเทมเพลตการนำเสนอ.</li>
</ul>
<h3 id="ppt-เครองยนตการนำเสนอ"><code>ppt/</code> (เครื่องยนต์การนำเสนอ)</h3>
<p>นี่คือที่ที่การนำเสนอจริงอยู่:</p>
<ul>
<li><strong><code>presentation.xml</code></strong>: โครงหลักของการนำเสนอ มันลงทะเบียน ID ของสไลด์, ขนาดของสไลด์, การอ้างอิงโน้ตมาสเตอร์, และการตั้งค่าแบบอักษรเริ่มต้น.</li>
<li><strong><code>slides/</code></strong>: สไลด์แต่ละอัน (<code>slide1.xml</code>, <code>slide2.xml</code>, เป็นต้น).</li>
<li><strong><code>slideLayouts/</code></strong>: พรีเซ็ตโครงสร้างมาสเตอร์ (สไลด์หัวเรื่อง, สองคอลัมน์, ส่วนหัวเรื่อง).</li>
<li><strong><code>slideMasters/</code></strong>: สไตล์ทั่วโลก, พาเลตเริ่มต้น, การเติมพื้นหลัง, และการสืบทอดตำแหน่งตัวแทน.</li>
<li><strong><code>theme/</code></strong>: พาเลตสี (accent 1 ถึง 6, ความแตกต่างแบบมืด/สว่าง) และโครงแบบฟอนต์ (ฟอนต์หลัก/รอง).</li>
<li><strong><code>media/</code></strong>: รูปภาพดิบ (PNG, JPEG, SVG), เสียง, และไฟล์วิดีโอ.</li>
</ul>
<h2 id="3-การแยกสไลด-ภาษายอย-presentationml-p--drawingml-a">3. การแยกสไลด์: ภาษาย่อย PresentationML (<code>p:</code>) &amp; DrawingML (<code>a:</code>)</h2>
<p>เมื่อคุณเปิด <code>ppt/slides/slide1.xml</code> คุณจะพบสองเนมสเปซ XML หลัก:</p>
<ol>
<li><strong>PresentationML (<code>p:</code>)</strong>: ควบคุมองค์ประกอบการนำเสนอเชิงโครงสร้าง (สไลด์, ต้นไม้รูปร่าง, กลุ่มแคนวาส).</li>
<li><strong>DrawingML (<code>a:</code>)</strong>: ควบคุมการพิมพ์แบบ, เรขาคณิต, พิกัด 2 มิติ, การเติมสีไล่ระดับ, และการเรนเดอร์เวกเตอร์.</li>
</ol>
<p>นี่คือตัวอย่างแบบตัดทอนของรูปร่างข้อความมาตรฐานที่เป็นลักษณะเช่นนี้:</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="หนวยวดสำคญ-emus-และรอยสวนของจด">หน่วยวัดสำคัญ: EMUs และร้อยส่วนของจุด</h3>
<p>สังเกตตัวเลขพิกัดใน <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>เหล่านี้คือ <strong>หน่วยเมตริกอังกฤษ (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 อนุญาตให้จำนวนเต็มแทนเศษส่วนที่แม่นยำของทั้งนิ้วและมิลลิเมตรโดยไม่มีข้อผิดพลาดจากการปัดเศษแบบจุดลอยตัวในสถาปัตยกรรมฮาร์ดแวร์ที่แตกต่างกัน</p>
<p>โปรดสังเกตขนาดฟอนต์ด้วย:</p>
<ul>
<li><code>sz=&quot;3200&quot;</code> หมายถึง <strong>32.00 pt</strong>. ขนาดฟอนต์ใน DrawingML วัดเป็นร้อยส่วนของจุด.</li>
</ul>
<h2 id="4-โซการสบทอด-ทำไมรปรางจงสบทอดสไตลทมองไมเหน">4. โซ่การสืบทอด: ทำไมรูปร่างจึงสืบทอดสไตล์ที่มองไม่เห็น</h2>
<p>หนึ่งในข้อผิดพลาดที่พบบ่อยที่สุดเมื่อทำการวิศวกรรมย้อนกลับไฟล์ PPTX คือการสมมติว่าการจัดรูปแบบภาพของรูปร่างถูกประกาศอย่างเต็มที่ภายในไฟล์ <code>slideX.xml</code> ของมันเอง.</p>
<p>ในความเป็นจริง OpenXML พึ่งพาโมเดลการสืบทอดแบบ <strong>ลำดับชั้น 4 ชั้น</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>หากกล่องข้อความบน <code>slide1.xml</code> มีเนื้อหา:</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>ไม่มีการกำหนดฟอนต์, ไม่มีสีที่ระบุอย่างชัดเจน, และไม่มีขนาดที่ระบุบนรัน (<code>&lt;a:r&gt;</code>). เพื่อหาวิธีที่ PowerPoint แสดงข้อความนี้ ตัวพาร์เซอร์ของคุณต้อง:</p>
<ol>
<li>ระบุประเภทของตัวแทนตำแหน่ง (<code>&lt;p:ph type=\&quot;title\&quot;/&gt;</code>).</li>
<li>อ่านเลย์เอาต์ที่อ้างอิงใน <code>slide1.xml.rels</code>.</li>
<li>ตรวจสอบว่า <code>slideLayout1.xml</code> มีการแทนที่สไตล์สำหรับตัวแทนตำแหน่งนั้นหรือไม่.</li>
<li>ย้อนกลับไปที่ <code>slideMaster1.xml</code> เพื่อใช้สไตล์เริ่มต้นของข้อความหัวเรื่อง.</li>
<li>ติดตามโทเคนสีเช่น <code>accent1</code> หรือ <code>tx1</code> ไปยัง <code>theme1.xml</code> เพื่อค้นหารหัสสีแบบฐานสิบหก.</li>
</ol>
<p>หากคุณข้ามกราฟการสืบทอดนี้ ตัวพาร์เซอร์ของคุณจะอ่านสไตล์ผิดพลาด, ขาดฟอนต์, ขนาดฟอนต์, และจุดยึดของเลย์เอาต์.</p>
<h2 id="5-กระบวนการทำงานการวศวกรรมยอนกลบเชงปฏบต">5. กระบวนการทำงานการวิศวกรรมย้อนกลับเชิงปฏิบัติ</h2>
<p>เมื่อคุณต้องการตรวจสอบว่าฟีเจอร์เฉพาะของ PowerPoint ทำงานอย่างไรภายใน (เช่น การเปลี่ยนภาพแบบ morph, ตารางซับซ้อน, เส้นทางเวกเตอร์) ให้ทำตามแนวทางเชิงประจักษ์นี้:</p>
<h3 id="ขนตอนท-1-สราง-diff-pair-ขนตำ">ขั้นตอนที่ 1: สร้าง &ldquo;Diff Pair&rdquo; ขั้นต่ำ</h3>
<ol>
<li>เปิด PowerPoint และสร้างสไลด์เปล่า.</li>
<li>บันทึกเป็น <code>before.pptx</code>.</li>
<li>ใช้การเปลี่ยนแปลงเดียวที่คุณต้องการทำการย้อนกลับ (เช่น เพิ่มเงาตกลงบนวงกลม, เปลี่ยนสไตล์ของหัวข้อย่อย, แทรกวิดีโอฝังตัว).</li>
<li>บันทึกเป็น <code>after.pptx</code>.</li>
</ol>
<h3 id="ขนตอนท-2-แยกคลงขอมลทงสอง">ขั้นตอนที่ 2: แยกคลังข้อมูลทั้งสอง</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-จดรปแบบ-xml">ขั้นตอนที่ 3: จัดรูปแบบ XML</h3>
<p>XML ดิบภายในไฟล์อาร์ไคฟ์ของ Office มักจะถูกลบการเยื้องและอักขระขึ้นบรรทัดใหม่ออก ก่อนทำการเปรียบเทียบ ให้จัดรูปแบบไฟล์:</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-รน-unified-diff">ขั้นตอนที่ 4: รัน 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>การตรวจสอบ <code>changes.patch</code> จะเปิดเผยชื่อแท็กที่แน่นอน, แอตทริบิวต์เนมสเปซ, และลำดับชั้นของคอนเทนเนอร์ที่ PowerPoint แนะนำ นี่เป็นวิธีที่เร็วที่สุดในการค้นพบคุณสมบัติสคีมาที่ไม่ได้รับการบันทึกหรือซับซ้อนโดยไม่ต้องขุดค้นผ่านหลายพันหน้าในเอกสาร ECMA-376.</p>
<h2 id="6-การสรางไมโครเอนจนแบบกำหนดเอง-แยก-แกไข-แพคใหม">6. การสร้างไมโครเอนจินแบบกำหนดเอง: แยก, แก้ไข, แพ็คใหม่</h2>
<p>บางครั้งคุณอาจไม่ต้องการการพึ่งพาองค์กรที่หนักหน่วงเช่น Apache POI หรือ Microsoft OpenXML SDK—โดยเฉพาะอย่างยิ่งในสภาพแวดล้อม serverless ที่มีน้ำหนักเบา (AWS Lambda, Cloudflare Workers, edge nodes).</p>
<p>ต่อไปนี้เป็นรูปแบบ Python ที่ทำงานอิสระซึ่งแสดงวิธีการแตกไฟล์ PPTX ในหน่วยความจำอย่างปลอดภัย, แทรกข้อมูลที่กำหนดเองโดยใช้เครื่องมือในไลบรารีมาตรฐาน, และทำการบรรจุใหม่:</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="ขอสำคญทควรระวงเมอแกไขไฟลในระดบไบตดบ">ข้อสำคัญที่ควรระวังเมื่อแก้ไขไฟล์ในระดับไบต์ดิบ:</h3>
<ol>
<li><strong>การรักษาเนมสเปซ</strong>: ตัวแยกวิเคราะห์ XML มักจะเขียนทับคำนำหน้า (<code>xmlns:p</code> อาจกลายเป็น <code>xmlns:ns0</code>). แม้จะเป็น XML ที่ถูกต้อง, การตรวจสอบสคีมาภายในของ PowerPoint อย่างเข้มงวดบางครั้งจะปฏิเสธนามแฝงที่ไม่เป็นมาตรฐาน. ลงทะเบียนเนมสเปซอย่างชัดเจน.</li>
<li><strong>วิธีการบีบอัด ZIP</strong>: ตรวจสอบให้แน่ใจว่าคุณเขียนไฟล์กลับโดยใช้การบีบอัดแบบ deflate มาตรฐาน (<code>zipfile.ZIP_DEFLATED</code>).</li>
<li><strong>การล้างสตรีม</strong>: ตรวจสอบเสมอว่าบัฟเฟอร์ zip ของคุณปิดและล้างข้อมูลอย่างสมบูรณ์ก่อนส่งไบต์ต่อไป.</li>
<li><strong>รักษาความสัมพันธ์</strong>: หากคุณลบสไลด์, คุณต้องลบรายการของมันจาก <code>ppt/presentation.xml</code>, ลบความสัมพันธ์ใน <code>ppt/_rels/presentation.xml.rels</code>, และทำความสะอาดประเภทเนื้อหาจาก <code>[Content_Types].xml</code>.</li>
</ol>
<h2 id="7-พจารณาดานประสทธภาพและความปลอดภย">7. พิจารณาด้านประสิทธิภาพและความปลอดภัย</h2>
<p>การวิศวกรรมย้อนกลับไฟล์ PPTX ไม่ได้เป็นเพียงการแก้ไขสไลด์; มันยังเกี่ยวกับการตรวจสอบสิ่งที่เข้าสู่ระบบของคุณ.</p>
<h3 id="ความปลอดภย-billion-laughs--xxe">ความปลอดภัย: Billion Laughs &amp; XXE</h3>
<p>เนื่องจากไฟล์ PPTX แยกวิเคราะห์ XML, สายงานฝั่งเซิร์ฟเวอร์ใด ๆ ที่รับไฟล์นำเสนอจากผู้ใช้จะเสี่ยงต่อ:</p>
<ul>
<li><strong>การฉีด XML External Entity (XXE)</strong>: XML ที่เป็นอันตรายพยายามเข้าถึง <code>/etc/passwd</code> หรือสอบถามจุดสิ้นสุดเมตาดาต้าในคลาวด์ภายใน (<code>http://169.254.169.254/</code>).</li>
<li><strong>การโจมตีแบบ Entity Expansion (Billion Laughs)</strong>: ลูปเอนทิตีแบบเอ็กซ์โพเนนเชียลทำให้ RAM ของระบบหมด.</li>
</ul>
<p><strong>Mitigation</strong>: ควรปิดการทำงานของ <code>resolve_entities</code>, <code>load_dtd</code> และการแก้ไขเครือข่ายภายนอกในตัวแยกวิเคราะห์ XML ของคุณเสมอ (เช่น ใช้ <code>defusedxml</code> ใน Python).</p>
<h3 id="ความปลอดภย-macro-payloads-และ-hidden-streams">ความปลอดภัย: Macro Payloads และ Hidden Streams</h3>
<p>ตรวจสอบไฟล์เพื่อหาเนื้อหา <code>.pptm</code> ที่แอบอ้างเป็นไฟล์ที่มีนามสกุล <code>.pptx</code>. ระวังไฟล์ <code>ppt/vbaProject.bin</code> ซึ่งบรรจุโค้ด Visual Basic ที่คอมไพล์แล้ว. ในไฟล์ <code>.pptx</code> มาตรฐาน โค้ด VBA ถูกห้ามใช้; การพบอ้างอิงถึง payload ไบนารีในความสัมพันธ์ควรทำให้ระบบตั้งค่าสถานะกักกันทันที.</p>
<h2 id="สรป">สรุป</h2>
<p>การวิศวกรรมย้อนกลับไฟล์ <code>.pptx</code> ทำให้ซอฟต์แวร์การนำเสนอไม่ซับซ้อนอีกต่อไป. เมื่อคุณตระหนักว่าไฟล์ PowerPoint เป็นเพียงแพ็คเกจ zip ที่มีโครงสร้างเรียบง่ายซึ่งเต็มไปด้วยพิกัด, การอ้างอิงสคีม่า, และต้นไม้ความสัมพันธ์ XML, คุณจะไม่ถูกจำกัดโดยการอธิบายของบุคคลที่สามอีกต่อไป.</p>
<p>ไม่ว่าคุณจะกำลังเพิ่มประสิทธิภาพการสร้างสไลด์, เขียนเครื่องมือทำความสะอาดอัตโนมัติแบบกำหนดเอง, หรือแก้ไขปัญหา glitches การเรนเดอร์, การมองโดยตรงที่สถาปัตยกรรม OpenXML พื้นฐานจะให้การควบคุมเต็มรูปแบบเหนือกระบวนการนำเสนอ.</p>
<h2 id="คำถามทพบบอย-faq">คำถามที่พบบ่อย (FAQ)</h2>
<p>**Q: คุณสามารถแปลงไฟล์ .pptx เป็นโฟลเดอร์มาตรฐานและแก้ไขไฟล์โดยตรงใน IDE ได้หรือไม่?</p>
<p><strong>A1:</strong> ใช่, คุณสามารถแตกไฟล์อาร์ไคฟ์, แก้ไข XML ในโปรแกรมแก้ไขเช่น VS Code, และบีบอัดโฟลเดอร์ใหม่เพื่อเปิดกลับใน PowerPoint.</p>
<p>**Q: ทำไม PowerPoint ถึงบอกว่าไฟล์ PPTX ที่ฉันแก้ไขด้วยตนเองต้องการการซ่อมแซม?</p>
<p><strong>A2:</strong> โดยทั่วไปจะเกิดขึ้นหากคุณใส่ XML ที่มีรูปแบบไม่ถูกต้อง, ละเว้นทรัพยากรใหม่จาก <code>[Content_Types].xml</code>, หรือทิ้งการอ้างอิงที่ค้างอยู่ในไฟล์ <code>.rels</code> ที่เกี่ยวข้อง.</p>
<p>**Q: PowerPoint ใช้หน่วยวัดอะไรสำหรับตำแหน่งและระยะขอบของรูปร่าง?</p>
<p><strong>A3:</strong> PowerPoint ใช้หน่วยเมตริกอังกฤษ (EMUs) โดยที่ 1 นิ้วเท่ากับ 914,400 EMUs และ 1 จุดเท่ากับ 12,700 EMUs.</p>
<p>**Q: ฉันจะ <a href="https://products.fileformat.com/presentation/python/python-pptx/">ดึงข้อมูลโดยโปรแกรม</a> รูปภาพทั้งหมดจากงานนำเสนอได้อย่างไรโดยไม่ใช้ไลบรารีภายนอก?</p>
<p><strong>A4:</strong> เพียงเปิดไฟล์ <code>.pptx</code> ด้วยยูทิลิตี้ zip มาตรฐานใดก็ได้และสกัดไฟล์ไบนารีทั้งหมดที่อยู่ในไดเรกทอรี <code>ppt/media/</code>.</p>
<p>**Q: ปลอดภัยหรือไม่ที่จะพาร์สไฟล์ PPTX ที่ผู้ใช้อัปโหลดด้วยตัวพาร์ส XML มาตรฐาน?</p>
<p><strong>A5:</strong> ไม่, คุณต้องเสริมความแข็งแรงให้กับตัวพาร์สของคุณหรือใช้ wrapper ที่ปลอดภัยเช่น <code>defusedxml</code> เพื่อบล็อกการโจมตี XML External Entity (XXE) และ zip‑bomb.</p>
<h2 id="ดเพมเตม">ดูเพิ่มเติม</h2>
<ul>
<li><a href="https://blog.fileformat.com/presentation/powerpoint-file-formats/">รูปแบบไฟล์การนำเสนอที่ FileFormat.com?</a></li>
<li><a href="https://blog.fileformat.com/presentation/apache-poi-api-to-access-powerpoint-file-formats/">Java API เพื่อเข้าถึงรูปแบบไฟล์ PowerPoint</a></li>
<li><a href="https://blog.fileformat.com/presentation/odp-vs-pptx-opendocument-vs-microsoft-powerpoint-format-comparison/">ODP vs PPTX: OpenDocument vs การเปรียบเทียบรูปแบบการนำเสนอของ Microsoft PowerPoint</a></li>
<li><a href="https://blog.fileformat.com/presentation/difference-between-ppt-and-pptx/">ความแตกต่างระหว่าง PPT และ PPTX</a></li>
<li><a href="https://blog.fileformat.com/presentation/create-presentation-in-java-with-apache-poi-api/">สร้างงานนำเสนอ PowerPoint ด้วย Java และ Apache POI API</a></li>
</ul>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    
  </channel>
</rss>
