<?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/he/tag/%D7%94%D7%A0%D7%93%D7%A1%D7%94-%D7%94%D7%A4%D7%95%D7%9B%D7%94-%D7%A9%D7%9C-pptx/</link>
    <description>Recent content in הנדסה הפוכה של PPTX on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>he</language>
    <lastBuildDate>Wed, 16 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.fileformat.com/he/tag/%D7%94%D7%A0%D7%93%D7%A1%D7%94-%D7%94%D7%A4%D7%95%D7%9B%D7%94-%D7%A9%D7%9C-pptx/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>הנדסה הפוכה של PPTX: הבנת קבצי PowerPoint מבפנים</title>
      <link>https://blog.fileformat.com/he/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</link>
      <pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blog.fileformat.com/he/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</guid>
      <description>גלה מה באמת נמצא בתוך קובץ `.pptx`. למד כיצד אריזת OpenXML, גרפי יחסים, צורות, וסימון ציור פועלים מאחורי הקלעים.</description>
      <content:encoded><![CDATA[<p><strong>עודכן לאחרונה</strong>: 16 ספטמבר, 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> העתיק של שנות ה‑90. מאז שמיקרוסופט הציגה את Office Open XML (ECMA-376 ו‑ISO/IEC 29500), מסמכי Office מודרניים הם <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="2-אנטומיה-של-החבילה-תתימערכות-מרכזיות">2. אנטומיה של החבילה: תתי‑מערכות מרכזיות</h2>
<p>כדי לבצע הנדסה הפוכה של מצגות בצורה יעילה, עליכם להבין את תפקידי כל רכיב ברמה העליונה.</p>
<h3 id="content_typesxml"><code>[Content_Types].xml</code></h3>
<p>זהו המניפסט הראשי עבור קורא OPC. הוא ממפה סיומות קבצים ושמות חלקים פנימיים מפורשים לסוגי MIME/תוכן מתוקנים. אם תיצרו שקופית חדשה או תוסיפו תמונה ולא תציינו זאת ב[Content_Types].xml, 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>, וכו&rsquo;).</li>
<li><strong><code>slideLayouts/</code></strong>: תבניות מבנה ראשיות (שקופית כותרת, שני עמודות, כותרת סעיף).</li>
<li><strong><code>slideMasters/</code></strong>: סגנונות גלובליים, ערכות צבע ברירת מחדל, מילוי רקע, והורשת מצייני מיקום.</li>
<li><strong><code>theme/</code></strong>: ערכות צבע (הדגשה 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>) ו‑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{ cm} = 360,000 \text{ EMUs}$</li>
<li>$1 \text{ pt} = 12,700 \text{ EMUs}$</li>
</ul>
<p>EMUs מאפשרים למספרים שלמים לייצג שברים מדויקים של אינצ&rsquo;ים ומילימטרים ללא שגיאות עיגול של נקודה צפה במגוון ארכיטקטורות חומרה.</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-צור-זוג-הבדלים-מינימלי">שלב 1: צור &ldquo;זוג הבדלים&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-הפעל-הבדל-מאוחד">שלב 4: הפעל הבדל מאוחד</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>להלן תבנית 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 buffer נסגר ומשתחרר במלואו לפני שליחת הבייטים למטה.</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">אבטחה: מיליארד צחוקים &amp; 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>התקפות הרחבת ישויות (ביליון צחוקים)</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), כאשר אינץ&rsquo; אחד שווה ל‑914,400 EMUs ונקודה אחת שווה ל‑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> לא, עליך לחזק את המפענח שלך או להשתמש במעטפות בטוחות כמו <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/">API של Java לגישה לפורמטים של 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/">יצירת מצגת PowerPoint ב‑Java עם Apache POI API</a></li>
</ul>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    
  </channel>
</rss>
