<?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/fa/tag/%D8%B3%D8%A7%D8%B2%D9%86%D8%AF%D9%87-%D8%B1%D8%A7%DB%8C%DA%AF%D8%A7%D9%86-pptx/</link>
    <description>Recent content in سازنده رایگان PPTX on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>fa</language>
    <lastBuildDate>Wed, 16 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.fileformat.com/fa/tag/%D8%B3%D8%A7%D8%B2%D9%86%D8%AF%D9%87-%D8%B1%D8%A7%DB%8C%DA%AF%D8%A7%D9%86-pptx/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>مهندسی معکوس PPTX: درک داخلی فایل‌های پاورپوینت</title>
      <link>https://blog.fileformat.com/fa/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</link>
      <pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blog.fileformat.com/fa/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> دههٔ 1990. از زمانی که مایکروسافت Office Open XML (ECMA-376 و ISO/IEC 29500) را معرفی کرد، اسناد مدرن آفیس <strong>آرشیوهای Open Packaging Conventions (OPC)</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="۲-ساختار-بسته-زیرسیستمهای-کلیدی">۲. ساختار بسته: زیرسیستم‌های کلیدی</h2>
<p>برای مهندسی معکوس مؤثر ارائه‌ها، باید مسئولیت‌های هر مؤلفهٔ سطح‑بالا را درک کنید.</p>
<h3 id="content_typesxml"><code>[Content_Types].xml</code></h3>
<p>این مانیفست ورودی برای خوانندهٔ OPC است. این مانیفست پسوندهای فایل و نام‌های داخلی صریح بخش‌ها را به انواع MIME/محتوا استاندارد نگاشت می‌کند. اگر یک اسلاید جدید ایجاد کنید یا تصویری اضافه کنید و آن را در <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>: ستون اصلی. شناسه‌های اسلاید، ابعاد اندازه اسلاید، ارجاعات نوت‌مستری و تنظیمات پیش‌فرض قلم را ثبت می‌کند.</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>: پالت‌های رنگی (اکسنت ۱ تا ۶، تنوع‌های تاریک/روشن) و طرح‌های قلم (قلم‌های اصلی/ثانویه).</li>
<li><strong><code>media/</code></strong>: تصاویر خام (PNG، JPEG، SVG)، صدا و فایل‌های ویدئویی.</li>
</ul>
<h2 id="۳-تجزیه-یک-اسلاید-گویشهای-presentationml-p-و-drawingml-a">۳. تجزیه یک اسلاید: گویش‌های PresentationML (<code>p:</code>) و 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>: تایپوگرافی، هندسه، مختصات دو‑بعدی، پرکننده‌های گرادیان و رندرینگ برداری را کنترل می‌کند.</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="واحدهای-اندازهگیری-حیاتی-emuها-و-صدمهای-یک-نقطه">واحدهای اندازه‌گیری حیاتی: EMUها و صدم‌های یک نقطه</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{ سانتی‌متر} = 360,000 \text{ EMUs}$</li>
<li>$1 \text{ پونت} = 12,700 \text{ EMUs}$</li>
</ul>
<p>EMUs به اعداد صحیح اجازه می‌دهند تا کسرهای دقیق هر دو اینچ و میلی‌متر را بدون خطاهای گرد کردن نقطه شناور در معماری‌های مختلف سخت‌افزاری نمایش دهند.</p>
<p>همچنین به اندازهٔ قلم توجه کنید:</p>
<ul>
<li><code>sz=\&quot;3200\&quot;</code> به معنای <strong>32.00 پونت</strong> است. اندازه‌های قلم در DrawingML بر پایهٔ صدم‌های یک پونت اندازه‌گیری می‌شوند.</li>
</ul>
<h2 id="۴-زنجیره-ارثبری-چرا-اشکال-سبکهای-نامرئی-را-به-ارث-میبرند">۴. زنجیره ارث‌بری: چرا اشکال سبک‌های نامرئی را به ارث می‌برند</h2>
<p>یکی از رایج‌ترین مشکلات هنگام مهندسی معکوس فایل‌های PPTX این است که فرض می‌شود استایل بصری یک شکل به‌طور کامل در داخل فایل <code>slideX.xml</code> خود آن اعلام شده است.</p>
<p>در واقع، OpenXML بر یک <strong>مدل وراثت سلسله‌مراتبی ۴ لایه‌ای</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>در این run (<code>&lt;a:r&gt;</code>) هیچ خانوادهٔ قلمی، رنگ صریح و اندازه‌ای اعلام نشده است. برای فهمیدن اینکه PowerPoint این متن را چگونه رندر می‌کند، تجزیه‌کنندهٔ شما باید:</p>
<ol>
<li>نوع جای‌دار (placeholder) را شناسایی کنید (<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="مرحله-۱-ایجاد-یک-جفت-تفاضل-حداقل">مرحله ۱: ایجاد یک &ldquo;جفت تفاضل&rdquo; حداقل</h3>
<ol>
<li>PowerPoint را باز کنید و یک اسلاید خالی ایجاد کنید.</li>
<li>آن را به عنوان <code>before.pptx</code> ذخیره کنید.</li>
<li>تغییر دقیق واحدی که می‌خواهید مهندسی معکوس کنید را اعمال کنید (مثلاً افزودن سایه‌دار به یک دایره، تغییر سبک گلوله، درج یک ویدئوی توکار).</li>
<li>آن را به عنوان <code>after.pptx</code> ذخیره کنید.</li>
</ol>
<h3 id="مرحله-۲-استخراج-هر-دو-بایگانی">مرحله ۲: استخراج هر دو بایگانی</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="مرحله-۳-قالببندی-xml">مرحله ۳: قالب‌بندی 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="مرحله-۴-اجرای-یک-تفاضل-یکپارچه">مرحله ۴: اجرای یک تفاضل یکپارچه</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 داشته باشید—به‌ویژه در زمان اجراهای سرورلس سبک (AWS Lambda، Cloudflare Workers، گره‌های لبه).</p>
<p>در اینجا یک الگوی خودکفا در پایتون آورده شده است که نشان می‌دهد چگونه می‌توان یک 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="امنیت-میلیارد-خندهها-و-xxe">امنیت: میلیارد خنده‌ها و XXE</h3>
<p>از آنجا که فایل‌های PPTX XML را تجزیه می‌کنند، هر خط لوله سمت سرور که ارائه‌های ارسال‌شده توسط کاربر را دریافت می‌کند، در معرض خطر زیر است:</p>
<ul>
<li><strong>تزریق موجودیت خارجی XML (XXE)</strong>: XML مخرب که سعی دارد به <code>/etc/passwd</code> دسترسی پیدا کند یا نقاط انتهایی متادیتای داخلی ابر (<code>http://169.254.169.254/</code>) را پرس‌وجو کند.</li>
<li><strong>حملات گسترش موجودیت (Billion Laughs)</strong>: حلقه‌های نمایی موجودیت که RAM سیستم را به‌طور کامل مصرف می‌کنند.</li>
</ul>
<p><strong>کاهش خطر</strong>: همیشه <code>resolve_entities</code>، <code>load_dtd</code> و حل شبکه خارجی را در تجزیه‌گر XML خود غیرفعال کنید (مثلاً با استفاده از <code>defusedxml</code> در پایتون).</p>
<h3 id="امنیت-بارهای-ماکرو-و-جریانهای-مخفی">امنیت: بارهای ماکرو و جریان‌های مخفی</h3>
<p>فایل‌ها را برای محتوای <code>.pptm</code> که به‌عنوان پسوند <code>.pptx</code> مخفی شده‌اند بررسی کنید. به <code>ppt/vbaProject.bin</code> که شامل کد کامپایل‌شده Visual Basic است، توجه کنید. در فایل‌های استاندارد <code>.pptx</code>، کد VBA ممنوع است؛ یافتن ارجاعات به بارگذاری باینری در روابط باید بلافاصله پرچم‌های قرنطینه را فعال کند.</p>
<h2 id="نتیجهگیری">نتیجه‌گیری</h2>
<p>مهندسی معکوس فایل‌های <code>.pptx</code> رمزگشایی نرم‌افزارهای ارائه را انجام می‌دهد. وقتی متوجه شوید که فایل‌های PowerPoint در واقع بسته‌های zip ساختار یافته‌ای هستند که شامل مختصات، ارجاعات به طرح‌واره و درخت‌های رابطه XML می‌باشند، دیگر تحت محدودیت انتزاعات شخص ثالث نیستید.</p>
<p>چه در حال بهینه‌سازی توان پردازش تولید اسلاید باشید، چه نوشتن پاک‌کننده‌های خودکار سفارشی یا رفع اشکالات رندرینگ، نگاه مستقیم به معماری زیرین 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 EMU و 1 پوینت برابر با 12,700 EMU است.</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> نه، باید پارسر خود را سخت‌سازی کنید یا از بسته‌های ایمنی مانند <code>defusedxml</code> برای مسدود کردن حملات XML External Entity (XXE) و بمب‌زدن zip استفاده کنید.</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/">API جاوا برای دسترسی به قالب‌های فایل PowerPoint</a></li>
<li><a href="https://blog.fileformat.com/presentation/odp-vs-pptx-opendocument-vs-microsoft-powerpoint-format-comparison/">ODP در مقابل PPTX: مقایسه فرمت ارائه OpenDocument در مقابل 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/">ایجاد ارائه پاورپوینت در جاوا با Apache POI API</a></li>
</ul>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    
  </channel>
</rss>
