<?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/el/tag/%CE%B1%CE%BD%CF%84%CE%AF%CF%83%CF%84%CF%81%CE%BF%CF%86%CE%B7-%CE%BC%CE%B7%CF%87%CE%B1%CE%BD%CE%B9%CE%BA%CE%AE-pptx/</link>
    <description>Recent content in Αντίστροφη Μηχανική PPTX on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>el</language>
    <lastBuildDate>Wed, 16 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.fileformat.com/el/tag/%CE%B1%CE%BD%CF%84%CE%AF%CF%83%CF%84%CF%81%CE%BF%CF%86%CE%B7-%CE%BC%CE%B7%CF%87%CE%B1%CE%BD%CE%B9%CE%BA%CE%AE-pptx/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Αντίστροφη Μηχανική PPTX: Κατανόηση των Αρχείων PowerPoint Εσωτερικά</title>
      <link>https://blog.fileformat.com/el/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</link>
      <pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blog.fileformat.com/el/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>Τα σύγχρονα decks παρουσίασης τροφοδοτούν τα πάντα, από παρουσιάσεις σε επενδυτές μέχρι εσωτερικά τριμηνιαία μετρικά. Αλλά αν έχετε ποτέ χρειαστεί να εξάγετε κείμενο προγραμματιστικά, να αντικαθιστάτε πρότυπα σε χρόνο εκτέλεσης, να δημιουργείτε αυτόματους δημιουργούς διαφανειών ή να καθαρίζετε εμπιστευτικές παρουσιάσεις, πιθανότατα έχετε συνειδητοποιήσει γρήγορα κάτι: οι τυπικές βιβλιοθήκες παρουσίασης υψηλού επιπέδου μπορούν να μοιάζουν με ένα απρόβλεπτο μαύρο κουτί.</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 σε επίπεδο byte και σχήματος.</p>
<p>Σε αυτή τη βαθιά ανάλυση, θα αποκαλύψουμε το <code>.pptx</code> format, θα αποσυσκευάσουμε τη εσωτερική του δομή, θα εντοπίσουμε το γράφημα σχέσεων, θα διασπάσουμε τις ιεραρχίες σχεδίασης και θα εξετάσουμε πρακτικές στρατηγικές για αντίστροφη μηχανική, επιθεώρηση και χειρισμό παρουσιάσεων με ακατέργαστο κώδικα.</p>
<h2 id="1-τι-είναι-πραγματικά-ένα-αρχείο-pptx">1. Τι Είναι πραγματικά ένα αρχείο <code>.pptx</code>;</h2>
<p>Στην ουσία, ένα αρχείο <code>.pptx</code> δεν είναι ένα ιδιόκτητο μονολιθικό δυαδικό όπως η αρχαία μορφή <code>.ppt</code> της δεκαετίας του 1990. Από τότε που η Microsoft εισήγαγε το 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>Κάθε μεμονωμένο οπτικό στοιχείο, μετάβαση, κληρονομικότητα του master διαφάνειας, συντεταγμένη του πλαισίου κειμένου και διανυσματικό γραφικό είναι κωδικοποιημένα σε αυτήν την ιεραρχία αρχείων.</p>
<h2 id="2-ανατομία-του-πακέτου-κύρια-υποσυστήματα">2. Ανατομία του Πακέτου: Κύρια Υποσυστήματα</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>: Η κύρια σπονδυλική δομή. Καταγράφει τα IDs των διαφανειών, τις διαστάσεις του μεγέθους των διαφανειών, τις αναφορές στο master σημειώσεων και τις προεπιλεγμένες ρυθμίσεις γραμματοσειράς.</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>: Παλέτες χρωμάτων (τονισμός 1 έως 6, παραλλαγές σκούρο/ανοιχτό) και σχήματα γραμματοσειρών (κύριες/δευτερεύουσες γραμματοσειρές).</li>
<li><strong><code>media/</code></strong>: Ακατέργαστες εικόνες (PNG, JPEG, SVG), ήχος και αρχεία βίντεο.</li>
</ul>
<h2 id="3-ανάλυση-μιας-διαφάνειας-τα-διαλέκτους-presentationml-p--drawingml-a">3. Ανάλυση μιας Διαφάνειας: Τα Διαλέκτους PresentationML (<code>p:</code>) &amp; DrawingML (<code>a:</code>)</h2>
<p>Όταν ανοίγετε το <code>ppt/slides/slide1.xml</code>, συναντάτε δύο κύριους χώρους ονομάτων XML:</p>
<ol>
<li><strong>PresentationML (<code>p:</code>)</strong>: Διαχειρίζεται δομικά στοιχεία παρουσίασης (διαφάνειες, δέντρα σχημάτων, ομάδες καμβά).</li>
<li><strong>DrawingML (<code>a:</code>)</strong>: Διαχειρίζεται τυπογραφία, γεωμετρία, 2Δ συντεταγμένες, διαβαθμισμένα γεμίσματα και απόδοση διανυσματικών γραφικών.</li>
</ol>
<p>Ακολουθεί ένα απλοποιημένο παράδειγμα του πώς φαίνεται ένα τυπικό σχήμα κειμένου:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span><span style="color:#f92672">&lt;p:sp&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e">&lt;!-- 1. Non-visual shape properties (Identifiers, names) --&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;p:nvSpPr&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;p:cNvPr</span> <span style="color:#a6e22e">id=</span><span style="color:#e6db74">&#34;4&#34;</span> <span style="color:#a6e22e">name=</span><span style="color:#e6db74">&#34;Title Box 1&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;p:cNvSpPr&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&lt;a:spLocks</span> <span style="color:#a6e22e">noGrp=</span><span style="color:#e6db74">&#34;1&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/p:cNvSpPr&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;p:nvPr&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&lt;p:ph</span> <span style="color:#a6e22e">type=</span><span style="color:#e6db74">&#34;title&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/p:nvPr&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;/p:nvSpPr&gt;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e">&lt;!-- 2. Visual shape properties (Position, size, geometry) --&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;p:spPr&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;a:xfrm&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&lt;a:off</span> <span style="color:#a6e22e">x=</span><span style="color:#e6db74">&#34;1524000&#34;</span> <span style="color:#a6e22e">y=</span><span style="color:#e6db74">&#34;1143000&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&lt;a:ext</span> <span style="color:#a6e22e">cx=</span><span style="color:#e6db74">&#34;9144000&#34;</span> <span style="color:#a6e22e">cy=</span><span style="color:#e6db74">&#34;1828800&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/a:xfrm&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;a:prstGeom</span> <span style="color:#a6e22e">prst=</span><span style="color:#e6db74">&#34;rect&#34;</span><span style="color:#f92672">&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&lt;a:avLst/&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/a:prstGeom&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;a:solidFill&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&lt;a:schemeClr</span> <span style="color:#a6e22e">val=</span><span style="color:#e6db74">&#34;accent1&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/a:solidFill&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;/p:spPr&gt;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e">&lt;!-- 3. Text Body (Paragraphs, runs, styling) --&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;p:txBody&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;a:bodyPr</span> <span style="color:#a6e22e">rtlCol=</span><span style="color:#e6db74">&#34;0&#34;</span> <span style="color:#a6e22e">anchor=</span><span style="color:#e6db74">&#34;ctr&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;a:lstStyle/&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;a:p&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&lt;a:r&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&lt;a:rPr</span> <span style="color:#a6e22e">lang=</span><span style="color:#e6db74">&#34;en-US&#34;</span> <span style="color:#a6e22e">sz=</span><span style="color:#e6db74">&#34;3200&#34;</span> <span style="color:#a6e22e">b=</span><span style="color:#e6db74">&#34;1&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&lt;a:t&gt;</span>Mission Critical Architecture<span style="color:#f92672">&lt;/a:t&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&lt;/a:r&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/a:p&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;/p:txBody&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">&lt;/p:sp&gt;</span>
</span></span></code></pre></div><h3 id="κρίσιμες-μονάδες-μέτρησης-emus-και-εκατοστά-του-σημείου">Κρίσιμες Μονάδες Μέτρησης: EMUs και Εκατοστά του Σημείου</h3>
<p>Παρατηρήστε τους αριθμούς συντεταγμένων στο <code>&lt;a:xfrm&gt;</code>:</p>
<ul>
<li><code>x=&quot;1524000&quot;</code></li>
<li><code>cx=&quot;9144000&quot;</code></li>
</ul>
<p>Αυτές είναι <strong>Μονάδες Αγγλικού Μετρικού (EMUs)</strong>.</p>
<ul>
<li>$1 \text{ inch} = 914,400 \text{ EMUs}$</li>
<li>$1 \text{ cm} = 360,000 \text{ EMUs}$</li>
<li>$1 \text{ pt} = 12,700 \text{ EMUs}$</li>
</ul>
<p>Τα EMUs επιτρέπουν σε ακέραιους να αντιπροσωπεύουν ακριβή κλάσματα τόσο των ιντσών όσο και των χιλιοστών του χιλιομέτρου χωρίς σφάλματα στρογγυλοποίησης κινητής υποδιαστολής σε διαφορετικές αρχιτεκτονικές υλικού.</p>
<p>Παρατηρήστε επίσης το μέγεθος γραμματοσειράς:</p>
<ul>
<li><code>sz=&quot;3200&quot;</code> σημαίνει <strong>32,00 pt</strong>. Τα μεγέθη γραμματοσειράς στο DrawingML μετρώνται σε εκατοστά του σημείου.</li>
</ul>
<h2 id="4-η-αλυσίδα-κληρονομικότητας-γιατί-τα-σχήματα-κληρονομούν-αόρατα-στυλ">4. Η Αλυσίδα Κληρονομικότητας: Γιατί τα Σχήματα Κληρονομούν Αόρατα Στυλ</h2>
<p>Ένα από τα πιο κοινά λάθη κατά την αντίστροφη μηχανική αρχείων PPTX είναι η υπόθεση ότι η οπτική μορφοποίηση ενός σχήματος δηλώνεται πλήρως μέσα στο δικό του <code>slideX.xml</code>.</p>
<p>Στην πραγματικότητα, το OpenXML βασίζεται σε ένα αυστηρό <strong>μοντέλο κληρονομικότητας 4 επιπέδων</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>[Theme: ppt/theme/theme1.xml]
</span></span><span style="display:flex;"><span>              │
</span></span><span style="display:flex;"><span>              ▼
</span></span><span style="display:flex;"><span>[Slide Master: ppt/slideMasters/slideMaster1.xml]
</span></span><span style="display:flex;"><span>              │
</span></span><span style="display:flex;"><span>              ▼
</span></span><span style="display:flex;"><span>[Slide Layout: ppt/slideLayouts/slideLayout1.xml]
</span></span><span style="display:flex;"><span>              │
</span></span><span style="display:flex;"><span>              ▼
</span></span><span style="display:flex;"><span>[Slide: ppt/slides/slide1.xml]
</span></span></code></pre></div><p>Αν ένα πλαίσιο κειμένου στο <code>slide1.xml</code> περιέχει:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span><span style="color:#f92672">&lt;a:p&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;a:r&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;a:t&gt;</span>Revenue Projections<span style="color:#f92672">&lt;/a:t&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;/a:r&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">&lt;/a:p&gt;</span>
</span></span></code></pre></div><p>Δεν υπάρχει οικογένεια γραμματοσειράς, κανένα ρητό χρώμα και κανένα μέγεθος δηλωμένο στο τμήμα (<code>&lt;a:r&gt;</code>). Για να καταλάβετε πώς το PowerPoint αποδίδει αυτό το κείμενο, ο αναλυτής σας πρέπει:</p>
<ol>
<li>Αναγνωρίστε τον τύπο του κράτησης θέσης (<code>&lt;p:ph type=&quot;title&quot;/&gt;</code>).</li>
<li>Διαβάστε τη διάταξη που αναφέρεται στο <code>slide1.xml.rels</code>.</li>
<li>Ελέγξτε αν το <code>slideLayout1.xml</code> παρέχει παρακάμψεις στυλ για αυτήν την κράτηση θέσης.</li>
<li>Επιστρέψτε στο <code>slideMaster1.xml</code> για τα προεπιλεγμένα στυλ σώματος κειμένου τίτλου.</li>
<li>Ακολουθήστε τα διακριτικά χρώματος όπως <code>accent1</code> ή <code>tx1</code> στο <code>theme1.xml</code> για να βρείτε τον δεκαεξαδικό κωδικό χρώματος.</li>
</ol>
<p>Αν παραλείψετε αυτό το γράφημα κληρονομικότητας, ο αναλυτής σας θα διαβάσει λανθασμένα τα στυλ, λείπουν γραμματοσειρές, μεγέθη γραμματοσειράς και άγκυρες διάταξης.</p>
<h2 id="5-πρακτική-ροή-εργασίας-αντίστροφης-μηχανικής">5. Πρακτική Ροή Εργασίας Αντίστροφης Μηχανικής</h2>
<p>Όταν χρειάζεται να διερευνήσετε πώς λειτουργεί μια συγκεκριμένη δυνατότητα του PowerPoint στο παρασκήνιο (π.χ., μεταβάσεις morph, σύνθετοι πίνακες, διανυσματικές διαδρομές), ακολουθήστε αυτήν την εμπειρική προσέγγιση:</p>
<h3 id="βήμα-1-δημιουργία-ενός-ελάχιστου-diff-pair">Βήμα 1: Δημιουργία ενός Ελάχιστου &ldquo;Diff Pair&rdquo;</h3>
<ol>
<li>Ανοίξτε το PowerPoint και δημιουργήστε μια κενή διαφάνεια.</li>
<li>Αποθηκεύστε το ως <code>before.pptx</code>.</li>
<li>Εφαρμόστε την ακριβή μοναδική αλλαγή που θέλετε να ανασυνθέσετε (π.χ., προσθέστε σκιά πτώσης σε έναν κύκλο, αλλάξτε το στυλ κουκίδας, ενσωματώστε ένα ενσωματωμένο βίντεο).</li>
<li>Αποθηκεύστε το ως <code>after.pptx</code>.</li>
</ol>
<h3 id="βήμα-2-αποσυμπίεση-και-των-δύο-αρχείων">Βήμα 2: Αποσυμπίεση Και των Δύο Αρχείων</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>unzip before.pptx -d before/
</span></span><span style="display:flex;"><span>unzip after.pptx -d after/
</span></span></code></pre></div><h3 id="βήμα-3-μορφοποίηση-του-xml">Βήμα 3: Μορφοποίηση του XML</h3>
<p>Το ακατέργαστο XML μέσα σε αρχεία Office συνήθως αφαιρείται από εσοχές και χαρακτήρες νέας γραμμής. Πριν κάνετε diff, μορφοποιήστε τα αρχεία:</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-εκτέλεση-ενιαίου-diff">Βήμα 4: Εκτέλεση Ενιαίου Diff</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>diff -uNr before/ after/ &gt; changes.patch
</span></span></code></pre></div><p>Η εξέταση του <code>changes.patch</code> αποκαλύπτει το ακριβές όνομα ετικέτας, το χαρακτηριστικό χώρου ονομάτων και την ιεραρχία του δοχείου που εισήγαγε το PowerPoint. Αυτή είναι η πιο γρήγορη μέθοδος για να ανακαλύψετε ατεκμηριωμένες ή ασαφείς ιδιότητες σχήματος χωρίς να σκάβετε μέσα από χιλιάδες σελίδες τεκμηρίωσης ECMA-376.</p>
<h2 id="6-δημιουργία-προσαρμοσμένης-μικρο-μηχανής-αποσυμπίεση-τροποποίηση-επανασυμπίεση">6. Δημιουργία Προσαρμοσμένης Μικρο-Μηχανής: Αποσυμπίεση, Τροποποίηση, Επανασυμπίεση</h2>
<p>Μερικές φορές δεν θέλετε μια βαριά εξάρτηση επιχείρησης όπως το Apache POI ή το Microsoft OpenXML SDK—ιδιαίτερα σε ελαφριές serverless εκτελέσεις (AWS Lambda, Cloudflare Workers, edge nodes).</p>
<p>Ακολουθεί ένα αυτόνομο πρότυπο Python που δείχνει πώς να αποσυμπιέσετε με ασφάλεια ένα PPTX στη μνήμη, να ενθέσετε προσαρμοσμένα δεδομένα χρησιμοποιώντας εργαλεία της τυπικής βιβλιοθήκης και να το ξανασυσκευάσετε:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">import</span> zipfile
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> io
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> xml.etree.ElementTree <span style="color:#66d9ef">as</span> ET
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">modify_slide_title</span>(input_pptx_bytes: bytes, new_title: str) <span style="color:#f92672">-&gt;</span> bytes:
</span></span><span style="display:flex;"><span>    input_zip <span style="color:#f92672">=</span> zipfile<span style="color:#f92672">.</span>ZipFile(io<span style="color:#f92672">.</span>BytesIO(input_pptx_bytes))
</span></span><span style="display:flex;"><span>    output_buffer <span style="color:#f92672">=</span> io<span style="color:#f92672">.</span>BytesIO()
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">with</span> zipfile<span style="color:#f92672">.</span>ZipFile(output_buffer, <span style="color:#e6db74">&#34;w&#34;</span>, zipfile<span style="color:#f92672">.</span>ZIP_DEFLATED) <span style="color:#66d9ef">as</span> output_zip:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> item <span style="color:#f92672">in</span> input_zip<span style="color:#f92672">.</span>infolist():
</span></span><span style="display:flex;"><span>            content <span style="color:#f92672">=</span> input_zip<span style="color:#f92672">.</span>read(item<span style="color:#f92672">.</span>filename)
</span></span><span style="display:flex;"><span>            
</span></span><span style="display:flex;"><span>            <span style="color:#75715e"># Target slide 1</span>
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> item<span style="color:#f92672">.</span>filename <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;ppt/slides/slide1.xml&#34;</span>:
</span></span><span style="display:flex;"><span>                namespaces <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>                    <span style="color:#e6db74">&#39;p&#39;</span>: <span style="color:#e6db74">&#39;http://schemas.openxmlformats.org/presentationml/2006/main&#39;</span>,
</span></span><span style="display:flex;"><span>                    <span style="color:#e6db74">&#39;a&#39;</span>: <span style="color:#e6db74">&#39;http://schemas.openxmlformats.org/drawingml/2006/main&#39;</span>
</span></span><span style="display:flex;"><span>                }
</span></span><span style="display:flex;"><span>                
</span></span><span style="display:flex;"><span>                <span style="color:#75715e"># Register namespaces to preserve prefixes</span>
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">for</span> prefix, uri <span style="color:#f92672">in</span> namespaces<span style="color:#f92672">.</span>items():
</span></span><span style="display:flex;"><span>                    ET<span style="color:#f92672">.</span>register_namespace(prefix, uri)
</span></span><span style="display:flex;"><span>                    
</span></span><span style="display:flex;"><span>                root <span style="color:#f92672">=</span> ET<span style="color:#f92672">.</span>fromstring(content)
</span></span><span style="display:flex;"><span>                
</span></span><span style="display:flex;"><span>                <span style="color:#75715e"># Find title placeholder text run</span>
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">for</span> title_run <span style="color:#f92672">in</span> root<span style="color:#f92672">.</span>findall(<span style="color:#e6db74">&#34;.//p:sp[p:nvSpPr/p:nvPr/p:ph[@type=&#39;title&#39;]]//a:t&#34;</span>, namespaces):
</span></span><span style="display:flex;"><span>                    title_run<span style="color:#f92672">.</span>text <span style="color:#f92672">=</span> new_title
</span></span><span style="display:flex;"><span>                    <span style="color:#66d9ef">break</span>
</span></span><span style="display:flex;"><span>                
</span></span><span style="display:flex;"><span>                content <span style="color:#f92672">=</span> ET<span style="color:#f92672">.</span>tostring(root, encoding<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;utf-8&#34;</span>, xml_declaration<span style="color:#f92672">=</span><span style="color:#66d9ef">True</span>)
</span></span><span style="display:flex;"><span>            
</span></span><span style="display:flex;"><span>            output_zip<span style="color:#f92672">.</span>writestr(item, content)
</span></span><span style="display:flex;"><span>            
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> output_buffer<span style="color:#f92672">.</span>getvalue()
</span></span></code></pre></div><h3 id="κύρια-προβλήματα-κατά-την-τροποποίηση-αρχείων-σε-επίπεδο-ωμής-byte">Κύρια Προβλήματα Κατά την Τροποποίηση Αρχείων σε Επίπεδο Ωμής Byte:</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>: Πάντα ελέγξτε ότι το buffer του zip κλείνει και αδειάζει πλήρως πριν στείλετε τα bytes προς τα κάτω.</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. Σκέψεις για Απόδοση &amp; Ασφάλεια</h2>
<p>Η αντίστροφη μηχανική των αρχείων PPTX δεν αφορά μόνο την επεξεργασία διαφανειών· αφορά επίσης τον έλεγχο του τι εισέρχεται στα συστήματά σας.</p>
<h3 id="ασφάλεια-δισεκατομμύρια-γέλια--xxe">Ασφάλεια: Δισεκατομμύρια Γέλια &amp; XXE</h3>
<p>Επειδή τα αρχεία PPTX αναλύουν XML, οποιοδήποτε pipeline στο διακομιστή που επεξεργάζεται παρουσιάσεις που υποβάλλονται από χρήστες είναι ευάλωτο σε:</p>
<ul>
<li><strong>Ένεση Εξωτερικής Οντότητας XML (XXE)</strong>: Κακόβουλο XML που προσπαθεί να προσπελάσει το <code>/etc/passwd</code> ή να ερωτήσει εσωτερικά σημεία μεταδεδομένων του cloud (<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 parser σας (π.χ., χρησιμοποιώντας το <code>defusedxml</code> στην Python).</p>
<h3 id="ασφάλεια-μακροφόρτωση-και-κρυφές-ροές">Ασφάλεια: Μακροφόρτωση και Κρυφές Ροές</h3>
<p>Εξετάστε τα αρχεία για περιεχόμενο <code>.pptm</code> που προσποιείται ότι είναι <code>.pptx</code>. Προσέξτε το <code>ppt/vbaProject.bin</code>, το οποίο περιέχει μεταγλωττισμένο κώδικα Visual Basic. Στα τυπικά αρχεία <code>.pptx</code>, ο κώδικας VBA απαγορεύεται· η εύρεση αναφορών σε δυαδικά payload στα relationships θα πρέπει αμέσως να ενεργοποιεί σημαίες απομόνωσης.</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>Α1:</strong> Ναι, μπορείτε να εξάγετε το αρχείο, να επεξεργαστείτε το XML σε έναν επεξεργαστή όπως το VS Code, και να ξανασυμπιέσετε το περιεχόμενο του καταλόγου για να το ανοίξετε ξανά στο PowerPoint.</p>
<p>**Q: Γιατί το PowerPoint λέει ότι το χειροκίνητα τροποποιημένο αρχείο PPTX μου χρειάζεται επισκευή;</p>
<p><strong>A2:</strong> Αυτό συνήθως συμβαίνει εάν εισαγάγατε κατεστραμμένο XML, παραλείψατε ένα νέο στοιχείο από <code>[Content_Types].xml</code>, ή αφήσατε μια κρεμαστή αναφορά σε ένα συσχετισμένο αρχείο <code>.rels</code>.</p>
<p>**Q: Ποια μονάδα μέτρησης χρησιμοποιεί το PowerPoint για τις θέσεις και τα περιθώρια των σχημάτων;</p>
<p><strong>A3:</strong> Το PowerPoint χρησιμοποιεί τις Αγγλικές Μετρικές Μονάδες (EMUs), όπου 1 ίντσα ισούται με 914,400 EMUs και 1 σημείο ισούται με 12,700 EMUs.</p>
<p>**Q: Πώς μπορώ να <a href="https://products.fileformat.com/presentation/python/python-pptx/">προγραμματιστικά εξάγω</a> όλες τις εικόνες από μια παρουσίαση χωρίς εξωτερικές βιβλιοθήκες;</p>
<p><strong>A4:</strong> Απλώς ανοίξτε το αρχείο <code>.pptx</code> με οποιοδήποτε τυπικό εργαλείο zip και εξάγετε όλα τα δυαδικά αρχεία που βρίσκονται μέσα στον φάκελο <code>ppt/media/</code>.</p>
<p>**Q: Είναι ασφαλές να αναλύουμε αρχεία PPTX που ανεβάζουν χρήστες με τυπικούς αναλυτές XML;</p>
<p><strong>A5:</strong> Όχι, πρέπει να ενισχύσετε τον αναλυτή σας ή να χρησιμοποιήσετε ασφαλείς περιτυλίγματα όπως <code>defusedxml</code> για να εμποδίσετε επιθέσεις XML External Entity (XXE) και zip-bomb.</p>
<h2 id="δείτε-επίσης">Δείτε επίσης</h2>
<ul>
<li><a href="https://blog.fileformat.com/presentation/powerpoint-file-formats/">Μορφές Αρχείων Παρουσίασης στο FileFormat.com;</a></li>
<li><a href="https://blog.fileformat.com/presentation/apache-poi-api-to-access-powerpoint-file-formats/">Java API για Πρόσβαση σε Μορφές Αρχείων PowerPoint</a></li>
<li><a href="https://blog.fileformat.com/presentation/odp-vs-pptx-opendocument-vs-microsoft-powerpoint-format-comparison/">ODP vs PPTX: OpenDocument vs Microsoft PowerPoint Παρουσίαση – Σύγκριση Μορφής</a></li>
<li><a href="https://blog.fileformat.com/presentation/difference-between-ppt-and-pptx/">Διαφορά μεταξύ PPT και PPTX</a></li>
<li><a href="https://blog.fileformat.com/presentation/create-presentation-in-java-with-apache-poi-api/">Δημιουργία παρουσίασης PowerPoint σε Java με το API Apache POI</a></li>
</ul>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    
  </channel>
</rss>
