<?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>Ingegneria inversa PPTX on File Format Blog</title>
    <link>https://blog.fileformat.com/it/tag/ingegneria-inversa-pptx/</link>
    <description>Recent content in Ingegneria inversa PPTX on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>it</language>
    <lastBuildDate>Wed, 16 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.fileformat.com/it/tag/ingegneria-inversa-pptx/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Ingegneria inversa PPTX: Comprendere internamente i file PowerPoint</title>
      <link>https://blog.fileformat.com/it/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</link>
      <pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blog.fileformat.com/it/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</guid>
      <description>Scopri cosa c&amp;#39;è davvero all&amp;#39;interno di un file `.pptx`. Impara come il packaging OpenXML, i grafici di relazione, le forme e il markup di disegno funzionano dietro le quinte.</description>
      <content:encoded><![CDATA[<p><strong>Ultimo Aggiornamento</strong>: 16 set, 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="ingegneria-inversa-pptx4-file-guida-per-sviluppatori">Ingegneria inversa <a href="https://docs.fileformat.com/presentation/pptx/">PPTX</a> File: Guida per sviluppatori</h2>
<p>Le moderne presentazioni alimentano tutto, dalle presentazioni per gli investitori alle metriche trimestrali interne. Ma se hai mai dovuto estrarre testo in modo programmatico, sostituire template a runtime, creare generatori di slide automatizzati o sanificare presentazioni riservate, probabilmente ti sei reso conto rapidamente che le librerie di presentazione di alto livello possono sembrare una scatola nera imprevedibile.</p>
<p>Quando librerie come <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> o <a href="https://products.fileformat.com/presentation/net/openxmlsdk/">OpenXML SDK</a> raggiungono i loro limiti—o introducono bug di layout non documentati—l&rsquo;unica via d&rsquo;uscita è attraverso. Devi capire cosa sia realmente una presentazione PowerPoint a livello di byte e di schema.</p>
<p>In questo approfondimento, tireremo le quinte del formato <code>.pptx</code>, ne sveleremo la struttura interna, tracceremo il suo grafo di relazioni, analizzeremo le gerarchie di disegno e esamineremo strategie pratiche per il reverse engineering, l&rsquo;ispezione e la manipolazione delle presentazioni con codice grezzo.</p>
<h2 id="1-che-cosè-davvero-un-file-pptx">1. Che cos&rsquo;è davvero un file <code>.pptx</code>?</h2>
<p>Nel suo nucleo, un file <code>.pptx</code> non è un binario proprietario monolitico come il vecchio formato <code>.ppt</code> degli anni &lsquo;90. Da quando Microsoft ha introdotto Office Open XML (ECMA-376 e ISO/IEC 29500), i documenti Office moderni sono <strong>archivi Open Packaging Conventions (OPC)</strong>.</p>
<p>In parole semplici: <strong>un file <code>.pptx</code> è semplicemente un archivio zip contenente documenti XML e risorse multimediali organizzate in un albero di directory deterministico.</strong></p>
<p>Puoi dimostrarlo in pochi secondi usando gli strumenti standard del terminale:</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>L&rsquo;albero di directory risultante appare notevolmente coerente:</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>Ogni singola risorsa visiva, transizione, ereditarietà del master della diapositiva, coordinata della casella di testo e grafica vettoriale è codificata in questa gerarchia di file.</p>
<h2 id="2-anatomia-del-pacchetto-sottosistemi-principali">2. Anatomia del pacchetto: sottosistemi principali</h2>
<p>Per ingegnerizzare al contrario le presentazioni in modo efficace, devi comprendere le responsabilità di ciascun componente di livello superiore.</p>
<h3 id="content_typesxml"><code>[Content_Types].xml</code></h3>
<p>Questo è il manifesto di ingresso per il lettore OPC. Mappa le estensioni dei file e i nomi delle parti interne esplicite ai tipi MIME/contenuto standardizzati. Se crei una nuova diapositiva o aggiungi un&rsquo;immagine e non la dichiari in <code>[Content_Types].xml</code>, PowerPoint segnalerà il deck corrotto e richiederà il recupero.</p>
<p>Esempio di frammento:</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="il-grafo-delle-relazioni-_rels">Il grafo delle relazioni <code>_rels/</code></h3>
<p>Uno dei concetti più cruciali in OpenXML è <strong>l&rsquo;indirezione tramite relazioni</strong>. Le parti raramente puntano direttamente a percorsi di file grezzi. Invece, un file (ad es., <code>slide1.xml</code>) ha un file di relazione associato situato in una cartella sorella <code>_rels</code> (ad es., <code>_rels/slide1.xml.rels</code>).</p>
<p>Le relazioni definiscono:</p>
<ul>
<li>Collegamenti ipertestuali (<code>r:id=&quot;rId2&quot;</code>, TargetMode=&ldquo;External&rdquo;)</li>
<li>Immagini e tracce audio memorizzate in <code>ppt/media/</code></li>
<li>Puntatori di ereditarietà del layout (<code>slideLayout1.xml</code>)</li>
<li>Diapositive note, commenti e caratteri incorporati</li>
</ul>
<h3 id="docprops-metadati"><code>docProps/</code> (Metadati)</h3>
<ul>
<li><strong><code>core.xml</code></strong>: metadati Dublin Core—autore, titolo, data di creazione, timestamp di modifica.</li>
<li><strong><code>app.xml</code></strong>: statistiche specifiche dell&rsquo;applicazione—versione PowerPoint, conteggio totale delle diapositive, conteggio delle diapositive nascoste, conteggio parole, nomi dei modelli di presentazione.</li>
</ul>
<h3 id="ppt-il-motore-di-presentazione"><code>ppt/</code> (Il motore di presentazione)</h3>
<p>Qui è dove si trova la presentazione effettiva:</p>
<ul>
<li><strong><code>presentation.xml</code></strong>: La spina dorsale principale. Registra gli ID delle diapositive, le dimensioni della diapositiva, i riferimenti al master delle note e le impostazioni predefinite dei caratteri.</li>
<li><strong><code>slides/</code></strong>: Le diapositive individuali (<code>slide1.xml</code>, <code>slide2.xml</code>, ecc.).</li>
<li><strong><code>slideLayouts/</code></strong>: Preset strutturali master (Diapositiva Titolo, Due Colonne, Intestazione Sezione).</li>
<li><strong><code>slideMasters/</code></strong>: Stili globali, palette predefinite, riempimenti di sfondo e ereditarietà dei segnaposti.</li>
<li><strong><code>theme/</code></strong>: Palette di colori (accento 1‑6, variazioni scure/chiari) e schemi di caratteri (font principali/minori).</li>
<li><strong><code>media/</code></strong>: Immagini grezze (PNG, JPEG, SVG), audio e file video.</li>
</ul>
<h2 id="3-analisi-di-una-diapositiva-i-dialetti-presentationml-p-e-drawingml-a">3. Analisi di una diapositiva: i dialetti PresentationML (<code>p:</code>) e DrawingML (<code>a:</code>)</h2>
<p>Quando apri <code>ppt/slides/slide1.xml</code>, trovi due namespace XML principali:</p>
<ol>
<li><strong>PresentationML (<code>p:</code>)</strong>: Governa gli elementi di presentazione strutturali (diapositive, alberi di forme, gruppi di canvas).</li>
<li><strong>DrawingML (<code>a:</code>)</strong>: Governa la tipografia, la geometria, le coordinate 2D, i riempimenti a gradiente e il rendering vettoriale.</li>
</ol>
<p>Ecco un esempio semplificato di come appare una forma di testo standard:</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="unità-di-misura-cruciali-emu-e-centesimi-di-punto">Unità di misura cruciali: EMU e centesimi di punto</h3>
<p>Nota i numeri delle coordinate in <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>Queste sono <strong>Unità Metriche Inglesi (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>Gli EMUs consentono agli interi di rappresentare frazioni esatte sia di pollici che di millimetri senza errori di arrotondamento in virgola mobile su diverse architetture hardware.</p>
<p>Nota anche la dimensione del carattere:</p>
<ul>
<li><code>sz=\&quot;3200\&quot;</code> significa <strong>32,00 pt</strong>. Le dimensioni dei caratteri in DrawingML sono misurate in centesimi di punto.</li>
</ul>
<h2 id="4-la-catena-di-ereditarietà-perché-le-forme-ereditano-stili-invisibili">4. La catena di ereditarietà: perché le forme ereditano stili invisibili</h2>
<p>Uno dei problemi più comuni durante il reverse engineering dei file PPTX è presumere che lo stile visivo di una forma sia dichiarato completamente all&rsquo;interno del proprio <code>slideX.xml</code>.</p>
<p>In realtà, OpenXML si basa su un rigido <strong>modello di ereditarietà a 4 livelli a cascata</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>Se una casella di testo su <code>slide1.xml</code> contiene:</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>Non c&rsquo;è alcuna famiglia di caratteri, nessun colore esplicito e nessuna dimensione dichiarata sull&rsquo;elemento (<code>&lt;a:r&gt;</code>). Per capire come PowerPoint rende questo testo, il tuo parser deve:</p>
<ol>
<li>Identifica il tipo di segnaposto (<code>&lt;p:ph type=&quot;title&quot;/&gt;</code>).</li>
<li>Leggi il layout a cui fa riferimento <code>slide1.xml.rels</code>.</li>
<li>Verifica se <code>slideLayout1.xml</code> fornisce sovrascritture di stile per quel segnaposto.</li>
<li>Ritorna a <code>slideMaster1.xml</code> per gli stili predefiniti del corpo del testo del titolo.</li>
<li>Traccia i token di colore come <code>accent1</code> o <code>tx1</code> in <code>theme1.xml</code> per trovare il codice colore esadecimale.</li>
</ol>
<p>Se salti questo grafo di ereditarietà, il tuo parser interpreterà erroneamente gli stili, mancheranno i caratteri, le dimensioni dei caratteri e gli ancoraggi del layout.</p>
<h2 id="5-flusso-di-lavoro-pratico-di-reverse-engineering">5. Flusso di lavoro pratico di reverse engineering</h2>
<p>Quando devi investigare come funziona internamente una particolare funzionalità di PowerPoint (ad esempio transizioni morph, tabelle complesse, percorsi vettoriali), segui questo approccio empirico:</p>
<h3 id="passo-1-crea-una-diff-pair-minima">Passo 1: Crea una &ldquo;Diff Pair&rdquo; minima</h3>
<ol>
<li>Apri PowerPoint e crea una diapositiva vuota.</li>
<li>Salvalo come <code>before.pptx</code>.</li>
<li>Applica la singola modifica esatta che desideri ingegnerizzare al contrario (ad esempio, aggiungi un&rsquo;ombreggiatura a una forma circolare, cambia lo stile di un elenco puntato, inserisci un video incorporato).</li>
<li>Salvalo come <code>after.pptx</code>.</li>
</ol>
<h3 id="passo-2-decomprimi-entrambi-gli-archivi">Passo 2: Decomprimi entrambi gli archivi</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="passo-3-formatta-lxml">Passo 3: Formatta l&rsquo;XML</h3>
<p>L&rsquo;XML grezzo all&rsquo;interno degli archivi Office è solitamente privo di rientri e caratteri di nuova riga. Prima di confrontare, formatta i file:</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="passo-4-esegui-un-diff-unificato">Passo 4: Esegui un diff unificato</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>Esaminare <code>changes.patch</code> rivela il nome esatto del tag, l&rsquo;attributo di spazio dei nomi e la gerarchia del contenitore introdotta da PowerPoint. Questo è il modo più rapido per scoprire proprietà di schema non documentate o oscure senza scavare tra migliaia di pagine della documentazione ECMA-376.</p>
<h2 id="6-creazione-di-un-micro-motore-personalizzato-decomprimi-modifica-ricomprimi">6. Creazione di un micro-motore personalizzato: decomprimi, modifica, ricomprimi</h2>
<p>A volte non vuoi una dipendenza aziendale pesante come Apache POI o il Microsoft OpenXML SDK—soprattutto in ambienti serverless leggeri (AWS Lambda, Cloudflare Workers, nodi edge).</p>
<p>Ecco un modello Python autonomo che dimostra come decomprimere in modo sicuro un PPTX in memoria, iniettare dati personalizzati usando gli strumenti della libreria standard e ricomprimerlo:</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="punti-critici-da-tenere-presente-quando-si-modificano-file-a-livello-di-byte-grezzo">Punti critici da tenere presente quando si modificano file a livello di byte grezzo:</h3>
<ol>
<li><strong>Preservazione dello spazio dei nomi</strong>: i parser XML spesso riscrivono i prefissi (<code>xmlns:p</code> potrebbe diventare <code>xmlns:ns0</code>). Sebbene XML valido, la rigorosa convalida dello schema interno di PowerPoint a volte rifiuta alias di prefisso non standard. Registra esplicitamente gli spazi dei nomi.</li>
<li><strong>Metodi di compressione ZIP</strong>: Assicurati di scrivere i file utilizzando la compressione deflate standard (<code>zipfile.ZIP_DEFLATED</code>).</li>
<li><strong>Svuotamento del flusso</strong>: Verifica sempre che il buffer zip si chiuda e venga svuotato completamente prima di inviare i byte a valle.</li>
<li><strong>Preservare le relazioni</strong>: Se rimuovi una diapositiva, devi anche rimuovere la sua voce da <code>ppt/presentation.xml</code>, eliminare la sua relazione in <code>ppt/_rels/presentation.xml.rels</code> e cancellare il suo tipo di contenuto da <code>[Content_Types].xml</code>.</li>
</ol>
<h2 id="7-considerazioni-su-prestazioni-e-sicurezza">7. Considerazioni su prestazioni e sicurezza</h2>
<p>Il reverse engineering dei file PPTX non riguarda solo la modifica delle diapositive; è anche una questione di audit di ciò che entra nei tuoi sistemi.</p>
<h3 id="sicurezza-billion-laughs--xxe">Sicurezza: Billion Laughs &amp; XXE</h3>
<p>Poiché i file PPTX analizzano XML, qualsiasi pipeline lato server che ingerisce presentazioni inviate dagli utenti è vulnerabile a:</p>
<ul>
<li><strong>Iniezione di entità XML esterne (XXE)</strong>: XML malevolo che tenta di accedere a <code>/etc/passwd</code> o di interrogare endpoint di metadati cloud interni (<code>http://169.254.169.254/</code>).</li>
<li><strong>Attacchi di espansione delle entità (Billion Laughs)</strong>: Loop di entità esponenziali che esauriscono la RAM del sistema.</li>
</ul>
<p><strong>Mitigazione</strong>: Disabilita sempre <code>resolve_entities</code>, <code>load_dtd</code> e la risoluzione di rete esterna nel tuo parser XML (ad esempio, usando <code>defusedxml</code> in Python).</p>
<h3 id="sicurezza-payload-macro-e-stream-nascosti">Sicurezza: Payload Macro e Stream Nascosti</h3>
<p>Ispeziona i file per contenuti <code>.pptm</code> mascherati sotto estensioni <code>.pptx</code>. Fai attenzione a <code>ppt/vbaProject.bin</code>, che contiene codice Visual Basic compilato. Nei file <code>.pptx</code> standard, il codice VBA è vietato; trovare riferimenti a payload binari nelle relazioni dovrebbe attivare immediatamente i flag di quarantena.</p>
<h2 id="conclusione">Conclusione</h2>
<p>Il reverse engineering dei file <code>.pptx</code> demistifica il software di presentazione. Una volta riconosciuto che i file PowerPoint sono semplici pacchetti zip strutturati, pieni di coordinate, riferimenti a schemi e alberi di relazioni XML, non sei più vincolato dalle astrazioni di terze parti esistenti.</p>
<p>Che tu stia ottimizzando il throughput di generazione delle diapositive, scrivendo sanitizzatori automatizzati personalizzati o risolvendo problemi di rendering, guardare direttamente all&rsquo;architettura OpenXML sottostante ti dà il controllo totale sul flusso di lavoro della presentazione.</p>
<h2 id="domande-frequenti-faq">Domande frequenti (FAQ)</h2>
<p>**Q: Puoi convertire un .pptx in una cartella standard e modificare i file direttamente in un IDE?</p>
<p><strong>A1:</strong> Sì, puoi estrarre l&rsquo;archivio, modificare l&rsquo;XML in un editor come VS Code e ricomprimere il contenuto della directory per aprirlo nuovamente in PowerPoint.</p>
<p>**Q: Perché PowerPoint dice che il mio file PPTX modificato manualmente necessita di riparazione?</p>
<p><strong>A2:</strong> Questo di solito accade se hai introdotto XML malformato, omesso una nuova risorsa da <code>[Content_Types].xml</code>, o lasciato un riferimento pendente in un file <code>.rels</code> associato.</p>
<p>**Q: Quale unità di misura utilizza PowerPoint per le posizioni e i margini delle forme?</p>
<p><strong>A3:</strong> PowerPoint utilizza le English Metric Units (EMUs), dove 1 pollice equivale a 914,400 EMU e 1 punto equivale a 12,700 EMU.</p>
<p>**Q: Come posso <a href="https://products.fileformat.com/presentation/python/python-pptx/">estrarre programmaticamente</a> tutte le immagini da una presentazione senza librerie esterne?</p>
<p><strong>A4:</strong> Basta aprire il file <code>.pptx</code> con qualsiasi utility zip standard ed estrarre tutti i file binari situati nella directory <code>ppt/media/</code>.</p>
<p>**Q: È sicuro analizzare file PPTX caricati dagli utenti con parser XML standard?</p>
<p><strong>A5:</strong> No, devi rafforzare il tuo parser o utilizzare wrapper sicuri come <code>defusedxml</code> per bloccare le vulnerabilità XML External Entity (XXE) e gli attacchi zip‑bomb.</p>
<h2 id="vedi-anche">Vedi anche</h2>
<ul>
<li><a href="https://blog.fileformat.com/presentation/powerpoint-file-formats/">Formati di file di presentazione su FileFormat.com?</a></li>
<li><a href="https://blog.fileformat.com/presentation/apache-poi-api-to-access-powerpoint-file-formats/">API Java per accedere ai formati di file 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 Formato di presentazione Microsoft PowerPoint – Confronto</a></li>
<li><a href="https://blog.fileformat.com/presentation/difference-between-ppt-and-pptx/">Differenza tra PPT e PPTX</a></li>
<li><a href="https://blog.fileformat.com/presentation/create-presentation-in-java-with-apache-poi-api/">Crea presentazione PowerPoint in Java con l&rsquo;API Apache POI</a></li>
</ul>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    
  </channel>
</rss>
