<?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>Kỹ Thuật Đảo Ngược PPTX on File Format Blog</title>
    <link>https://blog.fileformat.com/vi/tag/k%E1%BB%B9-thu%E1%BA%ADt-%C4%91%E1%BA%A3o-ng%C6%B0%E1%BB%A3c-pptx/</link>
    <description>Recent content in Kỹ Thuật Đảo Ngược PPTX on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>vi</language>
    <lastBuildDate>Wed, 16 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.fileformat.com/vi/tag/k%E1%BB%B9-thu%E1%BA%ADt-%C4%91%E1%BA%A3o-ng%C6%B0%E1%BB%A3c-pptx/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Kỹ Thuật Đảo Ngược PPTX: Hiểu Rõ Các Tệp PowerPoint Bên Trong</title>
      <link>https://blog.fileformat.com/vi/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</link>
      <pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blog.fileformat.com/vi/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</guid>
      <description>Khám phá những gì thực sự tồn tại bên trong tệp `.pptx`. Tìm hiểu cách gói OpenXML, đồ thị quan hệ, hình dạng và ngôn ngữ đánh dấu vẽ hoạt động bên trong.</description>
      <content:encoded><![CDATA[<p><strong>Cập nhật lần cuối</strong>: 16 Tháng 9, 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="kỹ-thuật-đảo-ngược-tệp-pptx4-hướng-dẫn-dành-cho-nhà-phát-triển">Kỹ Thuật Đảo Ngược Tệp <a href="https://docs.fileformat.com/presentation/pptx/">PPTX</a>: Hướng Dẫn Dành Cho Nhà Phát Triển</h2>
<p>Bộ trình thuyết trình hiện đại hỗ trợ mọi thứ từ buổi thuyết trình cho nhà đầu tư đến các chỉ số quý nội bộ. Nhưng nếu bạn từng phải trích xuất văn bản một cách lập trình, thay thế mẫu tại thời gian chạy, xây dựng công cụ tạo slide tự động, hoặc làm sạch các bản thuyết trình bí mật, bạn có lẽ đã nhanh chóng nhận ra: các thư viện trình bày cấp cao tiêu chuẩn có thể giống như một hộp đen khó đoán.</p>
<p>Khi các thư viện như <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> hoặc <a href="https://products.fileformat.com/presentation/net/openxmlsdk/">OpenXML SDK</a> đạt tới giới hạn—hoặc gây ra các lỗi bố cục chưa được tài liệu mô tả—cách duy nhất để vượt qua là đi thẳng vào bên trong. Bạn cần hiểu một bản trình chiếu PowerPoint thực sự là gì ở mức byte và schema.</p>
<p>Trong phần khám phá sâu này, chúng tôi sẽ hé lộ định dạng <code>.pptx</code>, giải nén cấu trúc nội bộ của nó, theo dõi đồ thị quan hệ, phân tích các cấp độ vẽ, và xem xét các chiến lược thực tiễn để đảo ngược kỹ thuật, kiểm tra và thao tác các bản thuyết trình bằng mã thô.</p>
<h2 id="1-tệp-pptx-thực-sự-là-gì">1. Tệp <code>.pptx</code> Thực Sự Là Gì?</h2>
<p>Về cốt lõi, một tệp <code>.pptx</code> không phải là một nhị phân độc quyền khối lượng lớn như định dạng <code>.ppt</code> cổ xưa của những năm 1990. Kể từ khi Microsoft giới thiệu Office Open XML (ECMA-376 và ISO/IEC 29500), các tài liệu Office hiện đại là <strong>các kho lưu trữ Open Packaging Conventions (OPC)</strong>.</p>
<p>Nói một cách đơn giản: <strong>một tệp <code>.pptx</code> chỉ là một kho lưu trữ zip chứa các tài liệu XML và các tài nguyên đa phương tiện được tổ chức trong một cây thư mục xác định</strong>.</p>
<p>Bạn có thể chứng minh điều này trong vài giây bằng cách sử dụng các công cụ terminal tiêu chuẩn:</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>Cây thư mục kết quả trông rất nhất quán:</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>Mỗi tài sản hình ảnh, chuyển đổi, kế thừa slide master, tọa độ hộp văn bản và đồ họa vector đều được mã hoá trong cấu trúc thư mục này.</p>
<h2 id="2-cấu-trúc-của-gói-các-tiểu-hệ-thống-chính">2. Cấu trúc của Gói: Các Tiểu Hệ thống Chính</h2>
<p>Để phân tích ngược các bản trình chiếu một cách hiệu quả, bạn phải hiểu vai trò của từng thành phần cấp cao.</p>
<h3 id="content_typesxml"><code>[Content_Types].xml</code></h3>
<p>Đây là manifest nhập cho trình đọc OPC. Nó ánh xạ các phần mở rộng tệp và tên phần nội bộ rõ ràng tới các loại MIME/nội dung chuẩn. Nếu bạn tạo một slide mới hoặc thêm một hình ảnh mà không khai báo nó trong <code>[Content_Types].xml</code>, PowerPoint sẽ cho rằng bộ trình chiếu bị hỏng và yêu cầu khôi phục.</p>
<p>Đoạn mã ví dụ:</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="đồ-thị-quan-hệ-_rels">Đồ thị Quan hệ <code>_rels/</code></h3>
<p>Một trong những khái niệm quan trọng nhất trong OpenXML là <strong>sự gián tiếp thông qua các mối quan hệ</strong>. Các phần hiếm khi chỉ tới các đường dẫn tệp thô một cách trực tiếp. Thay vào đó, một tệp (ví dụ, <code>slide1.xml</code>) có một tệp mối quan hệ liên kết nằm trong thư mục <code>_rels</code> cùng cấp (ví dụ, <code>_rels/slide1.xml.rels</code>).</p>
<p>Mối quan hệ định nghĩa:</p>
<ul>
<li>Liên kết siêu văn bản (<code>r:id=&quot;rId2&quot;</code>, TargetMode=&ldquo;External&rdquo;)</li>
<li>Hình ảnh và đoạn âm thanh được lưu trong <code>ppt/media/</code></li>
<li>Con trỏ kế thừa bố cục (<code>slideLayout1.xml</code>)</li>
<li>Các slide ghi chú, bình luận và phông chữ nhúng</li>
</ul>
<h3 id="docprops-siêu-dữ-liệu"><code>docProps/</code> (Siêu dữ liệu)</h3>
<ul>
<li><strong><code>core.xml</code></strong>: siêu dữ liệu Dublin Core—tác giả, tiêu đề, ngày tạo, thời gian chỉnh sửa.</li>
<li><strong><code>app.xml</code></strong>: thống kê đặc thù ứng dụng—phiên bản PowerPoint, tổng số slide, số slide ẩn, số từ, tên mẫu trình chiếu.</li>
</ul>
<h3 id="ppt-công-cụ-trình-chiếu"><code>ppt/</code> (Công cụ Trình chiếu)</h3>
<p>Đây là nơi bản trình chiếu thực tế nằm:</p>
<ul>
<li><strong><code>presentation.xml</code></strong>: Cột sống chính. Nó đăng ký ID slide, kích thước slide, tham chiếu master ghi chú và cài đặt phông chữ mặc định.</li>
<li><strong><code>slides/</code></strong>: Các slide riêng lẻ (<code>slide1.xml</code>, <code>slide2.xml</code>, v.v.).</li>
<li><strong><code>slideLayouts/</code></strong>: Các mẫu cấu trúc master (Slide Tiêu đề, Hai Cột, Tiêu đề Phần).</li>
<li><strong><code>slideMasters/</code></strong>: Kiểu toàn cục, bảng màu mặc định, nền tô, và kế thừa placeholder.</li>
<li><strong><code>theme/</code></strong>: Bảng màu (accent 1 đến 6, biến thể tối/sáng) và sơ đồ phông chữ (phông chữ chính/phụ).</li>
<li><strong><code>media/</code></strong>: Hình ảnh gốc (PNG, JPEG, SVG), âm thanh và tệp video.</li>
</ul>
<h2 id="3-phân-tích-một-slide-các-ngôn-ngữ-presentationml-p--drawingml-a">3. Phân tích một Slide: Các Ngôn ngữ PresentationML (<code>p:</code>) &amp; DrawingML (<code>a:</code>)</h2>
<p>Khi bạn mở <code>ppt/slides/slide1.xml</code>, bạn sẽ gặp hai không gian tên XML chính:</p>
<ol>
<li><strong>PresentationML (<code>p:</code>)</strong>: Điều khiển các yếu tố trình bày cấu trúc (bản trình chiếu, cây hình dạng, nhóm canvas).</li>
<li><strong>DrawingML (<code>a:</code>)</strong>: Điều khiển kiểu chữ, hình học, tọa độ 2D, màu nền gradient và việc render vector.</li>
</ol>
<p>Dưới đây là một ví dụ đơn giản về cách một hình dạng văn bản tiêu chuẩn trông như thế nào:</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="đơn-vị-đo-quan-trọng-emu-và-trăm-phần-của-một-điểm">Đơn vị Đo quan trọng: EMU và Trăm phần của một Điểm</h3>
<p>Lưu ý các số tọa độ trong <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>Đây là <strong>Đơn vị Đo lường Tiếng Anh (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 cho phép các số nguyên đại diện cho các phân số chính xác của cả inch và milimet mà không gặp lỗi làm tròn dấu phẩy động trên các kiến trúc phần cứng khác nhau.</p>
<p>Cũng lưu ý kích thước phông chữ:</p>
<ul>
<li><code>sz=\&quot;3200\&quot;</code> có nghĩa là <strong>32.00 pt</strong>. Kích thước phông chữ trong DrawingML được đo bằng hàng trăm của một điểm.</li>
</ul>
<h2 id="4-chuỗi-kế-thừa-tại-sao-các-hình-dạng-kế-thừa-kiểu-dáng-ẩn">4. Chuỗi Kế thừa: Tại sao Các Hình dạng Kế thừa Kiểu dáng Ẩn</h2>
<p>Một trong những bẫy phổ biến nhất khi đảo ngược kỹ thuật các tệp PPTX là giả định rằng kiểu dáng trực quan của một hình dạng được khai báo đầy đủ trong file <code>slideX.xml</code> của nó.</p>
<p>Trên thực tế, OpenXML dựa vào một <strong>mô hình kế thừa dạng thác 4 tầng</strong> chặt chẽ:</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>Nếu một hộp văn bản trên <code>slide1.xml</code> chứa:</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>Không có họ phông chữ, không có màu rõ ràng và không có kích thước được khai báo trên run (<code>&lt;a:r&gt;</code>). Để hiểu cách PowerPoint hiển thị văn bản này, bộ phân tích của bạn phải:</p>
<ol>
<li>Xác định loại placeholder (<code>&lt;p:ph type=&quot;title&quot;/&gt;</code>).</li>
<li>Đọc bố cục được tham chiếu trong <code>slide1.xml.rels</code>.</li>
<li>Kiểm tra xem <code>slideLayout1.xml</code> có cung cấp các ghi đè kiểu dáng cho placeholder đó không.</li>
<li>Quay lại <code>slideMaster1.xml</code> để lấy các kiểu mặc định cho tiêu đề và nội dung văn bản.</li>
<li>Theo dõi các token màu như <code>accent1</code> hoặc <code>tx1</code> trong <code>theme1.xml</code> để tìm mã màu thập lục phân.</li>
</ol>
<p>Nếu bạn bỏ qua đồ thị kế thừa này, bộ phân tích của bạn sẽ đọc sai các kiểu dáng, thiếu phông chữ, kích thước phông chữ và các điểm neo bố cục.</p>
<h2 id="5-quy-trình-kỹ-thuật-đảo-ngược-thực-tiễn">5. Quy trình Kỹ thuật Đảo ngược Thực tiễn</h2>
<p>Khi bạn cần điều tra cách một tính năng cụ thể của PowerPoint hoạt động bên trong (ví dụ: chuyển đổi morph, bảng phức tạp, đường vector), hãy thực hiện theo cách tiếp cận thực nghiệm này:</p>
<h3 id="bước-1-tạo-một-cặp-diff-tối-thiểu">Bước 1: Tạo một &ldquo;Cặp Diff&rdquo; tối thiểu</h3>
<ol>
<li>Mở PowerPoint và tạo một slide trống.</li>
<li>Lưu nó dưới dạng <code>before.pptx</code>.</li>
<li>Áp dụng thay đổi duy nhất mà bạn muốn phân tích ngược (ví dụ: thêm bóng đổ cho một vòng tròn, thay đổi kiểu dấu đầu dòng, chèn video nhúng).</li>
<li>Lưu nó dưới dạng <code>after.pptx</code>.</li>
</ol>
<h3 id="bước-2-giải-nén-cả-hai-lưu-trữ">Bước 2: Giải nén Cả Hai Lưu trữ</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="bước-3-định-dạng-xml">Bước 3: Định dạng XML</h3>
<p>XML thô bên trong các kho lưu trữ Office thường bị loại bỏ khoảng thụt và ký tự xuống dòng. Trước khi so sánh, hãy định dạng các tệ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>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="bước-4-chạy-unified-diff">Bước 4: Chạy 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>Xem xét <code>changes.patch</code> tiết lộ tên thẻ chính xác, thuộc tính không gian tên và cấu trúc phân cấp container mà PowerPoint đã giới thiệu. Đây là cách nhanh nhất để khám phá các thuộc tính schema chưa được tài liệu hoá hoặc khó hiểu mà không phải đào sâu qua hàng ngàn trang tài liệu ECMA-376.</p>
<h2 id="6-xây-dựng-micro-engine-tùy-chỉnh-giải-nén-sửa-đổi-đóng-gói-lại">6. Xây dựng Micro-Engine Tùy chỉnh: Giải nén, Sửa đổi, Đóng gói lại</h2>
<p>Đôi khi bạn không muốn một phụ thuộc doanh nghiệp nặng nề như Apache POI hoặc Microsoft OpenXML SDK—đặc biệt trong các môi trường serverless nhẹ (AWS Lambda, Cloudflare Workers, các nút edge).</p>
<p>Dưới đây là một mẫu Python tự chứa, minh họa cách giải nén an toàn một tệp PPTX trong bộ nhớ, chèn dữ liệu tùy chỉnh bằng các công cụ thư viện chuẩn, và đóng gói lại nó:</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="những-lưu-ý-quan-trọng-khi-sửa-đổi-tập-tin-ở-cấp-độ-byte-thô">Những Lưu ý Quan trọng Khi Sửa đổi Tập tin ở Cấp độ Byte Thô:</h3>
<ol>
<li><strong>Bảo tồn không gian tên</strong>: Trình phân tích XML thường ghi lại các tiền tố (<code>xmlns:p</code> có thể trở thành <code>xmlns:ns0</code>). Mặc dù là XML hợp lệ, việc kiểm tra sơ đồ nội bộ nghiêm ngặt của PowerPoint đôi khi từ chối các bí danh tiền tố không chuẩn. Hãy đăng ký không gian tên một cách rõ ràng.</li>
<li><strong>Phương pháp nén ZIP</strong>: Đảm bảo bạn ghi lại các tệp bằng cách sử dụng nén deflate tiêu chuẩn (<code>zipfile.ZIP_DEFLATED</code>).</li>
<li><strong>Xả luồng</strong>: Luôn kiểm tra rằng bộ đệm zip của bạn được đóng và xả hoàn toàn trước khi gửi byte xuống phía dưới.</li>
<li><strong>Bảo tồn mối quan hệ</strong>: Nếu bạn xóa một slide, bạn cũng phải xóa mục nhập của nó trong <code>ppt/presentation.xml</code>, xóa mối quan hệ trong <code>ppt/_rels/presentation.xml.rels</code>, và loại bỏ kiểu nội dung của nó khỏi <code>[Content_Types].xml</code>.</li>
</ol>
<h2 id="7-các-xem-xét-về-hiệu-suất--bảo-mật">7. Các Xem xét Về Hiệu suất &amp; Bảo mật</h2>
<p>Kỹ thuật ngược các tệp PPTX không chỉ là chỉnh sửa slide; mà còn là kiểm tra những gì được đưa vào hệ thống của bạn.</p>
<h3 id="bảo-mật-hàng-tỷ-tiếng-cười--xxe">Bảo mật: Hàng tỷ tiếng cười &amp; XXE</h3>
<p>Vì các tệp PPTX phân tích XML, bất kỳ pipeline phía máy chủ nào tiếp nhận các bản trình chiếu do người dùng gửi lên đều dễ bị:</p>
<ul>
<li><strong>Tiêm thực thể XML bên ngoài (XXE)</strong>: XML độc hại cố gắng truy cập <code>/etc/passwd</code> hoặc truy vấn các điểm cuối siêu dữ liệu đám mây nội bộ (<code>http://169.254.169.254/</code>).</li>
<li><strong>Tấn công mở rộng thực thể (Billion Laughs)</strong>: Các vòng lặp thực thể tăng cấp độ tiêu tốn RAM của hệ thống.</li>
</ul>
<p><strong>Mitigation</strong>: Luôn tắt <code>resolve_entities</code>, <code>load_dtd</code>, và việc giải quyết mạng bên ngoài trong bộ phân tích XML của bạn (ví dụ, sử dụng <code>defusedxml</code> trong Python).</p>
<h3 id="bảo-mật-gói-macro-và-luồng-ẩn">Bảo mật: Gói macro và luồng ẩn</h3>
<p>Kiểm tra các tệp để tìm nội dung <code>.pptm</code> ngụy trang dưới phần mở rộng <code>.pptx</code>. Hãy chú ý tới <code>ppt/vbaProject.bin</code>, chứa mã Visual Basic đã biên dịch. Trong các tệp <code>.pptx</code> tiêu chuẩn, mã VBA bị cấm; việc tìm thấy các tham chiếu tải trọng nhị phân trong các mối quan hệ nên ngay lập tức kích hoạt cờ cách ly.</p>
<h2 id="kết-luận">Kết luận</h2>
<p>Kỹ thuật đảo ngược các tệp <code>.pptx</code> giúp giải mã phần mềm trình chiếu. Khi bạn nhận ra rằng các tệp PowerPoint chỉ là các gói zip có cấu trúc, chứa các tọa độ, tham chiếu schema và cây quan hệ XML, bạn sẽ không còn bị ràng buộc bởi các trừu tượng của bên thứ ba.</p>
<p>Dù bạn đang tối ưu lưu lượng tạo slide, viết các bộ làm sạch tự động tùy chỉnh, hay khắc phục sự cố hiển thị, việc nhìn thẳng vào kiến trúc OpenXML nền tảng sẽ cho bạn kiểm soát hoàn toàn quy trình trình chiếu.</p>
<h2 id="câu-hỏi-thường-gặp-faq">Câu hỏi thường gặp (FAQ)</h2>
<p>**Q: Bạn có thể chuyển đổi một tệp .pptx thành thư mục tiêu chuẩn và chỉnh sửa các tệp trực tiếp trong IDE không?</p>
<p><strong>A1:</strong> Có, bạn có thể giải nén kho lưu trữ, chỉnh sửa XML trong một trình soạn thảo như VS Code, và nén lại nội dung thư mục để mở lại trong PowerPoint.</p>
<p>**Q: Tại sao PowerPoint lại thông báo tệp PPTX mà tôi đã chỉnh sửa thủ công cần được sửa chữa?</p>
<p><strong>A2:</strong> Thông thường điều này xảy ra nếu bạn đã đưa vào XML không hợp lệ, bỏ sót một tài sản mới trong <code>[Content_Types].xml</code>, hoặc để lại một tham chiếu lơ lửng trong tệp <code>.rels</code> liên quan.</p>
<p>**Q: PowerPoint sử dụng đơn vị đo nào cho vị trí và lề của các hình dạng?</p>
<p><strong>A3:</strong> PowerPoint sử dụng Đơn vị Đo tiếng Anh (EMUs), trong đó 1 inch bằng 914.400 EMUs và 1 point bằng 12.700 EMUs.</p>
<p>**Q: Làm thế nào tôi có thể <a href="https://products.fileformat.com/presentation/python/python-pptx/">trích xuất một cách lập trình</a> tất cả các hình ảnh từ một bản trình chiếu mà không cần thư viện bên ngoài?</p>
<p><strong>A4:</strong> Chỉ cần mở tệp <code>.pptx</code> bằng bất kỳ tiện ích zip tiêu chuẩn nào và giải nén tất cả các tệp nhị phân nằm trong thư mục <code>ppt/media/</code>.</p>
<p>**Q: Có an toàn khi phân tích các tệp PPTX do người dùng tải lên bằng các trình phân tích XML tiêu chuẩn không?</p>
<p><strong>A5:</strong> Không, bạn phải tăng cường bảo mật cho trình phân tích của mình hoặc sử dụng các lớp bao an toàn như <code>defusedxml</code> để chặn các tấn công XML External Entity (XXE) và zip-bomb.</p>
<h2 id="xem-thêm">Xem Thêm</h2>
<ul>
<li><a href="https://blog.fileformat.com/presentation/powerpoint-file-formats/">Định dạng tệp trình chiếu tại FileFormat.com?</a></li>
<li><a href="https://blog.fileformat.com/presentation/apache-poi-api-to-access-powerpoint-file-formats/">Java API để Truy cập Định dạng Tệp PowerPoint</a></li>
<li><a href="https://blog.fileformat.com/presentation/odp-vs-pptx-opendocument-vs-microsoft-powerpoint-format-comparison/">ODP vs PPTX: So sánh định dạng OpenDocument và Microsoft PowerPoint</a></li>
<li><a href="https://blog.fileformat.com/presentation/difference-between-ppt-and-pptx/">Sự khác biệt giữa PPT và PPTX</a></li>
<li><a href="https://blog.fileformat.com/presentation/create-presentation-in-java-with-apache-poi-api/">Tạo bài thuyết trình PowerPoint trong Java bằng API Apache POI</a></li>
</ul>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    
  </channel>
</rss>
