<?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>Ingeniería inversa de PPTX on File Format Blog</title>
    <link>https://blog.fileformat.com/es/tag/ingenier%C3%ADa-inversa-de-pptx/</link>
    <description>Recent content in Ingeniería inversa de PPTX on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>es</language>
    <lastBuildDate>Wed, 16 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.fileformat.com/es/tag/ingenier%C3%ADa-inversa-de-pptx/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Ingeniería inversa de PPTX: Comprendiendo los archivos de PowerPoint internamente</title>
      <link>https://blog.fileformat.com/es/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</link>
      <pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blog.fileformat.com/es/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</guid>
      <description>Descubre qué es lo que realmente se encuentra dentro de un archivo `.pptx`. Aprende cómo el empaquetado OpenXML, los gráficos de relaciones, las formas y el marcado de dibujo funcionan bajo el capó.</description>
      <content:encoded><![CDATA[<p><strong>Última actualización</strong>: 16 sept, 2026</p>
<figure class="align-center ">
    <img loading="lazy" src="images/pptx-reverse-engineering-understanding-powerpoint-files-internally.png#center"
         alt="PPTX Reverse Engineering: Understanding PowerPoint Files Internally"/> 
</figure>

<hr>
<h2 id="ingeniería-inversa-pptx4-archivos-guía-para-desarrolladores">Ingeniería inversa <a href="https://docs.fileformat.com/presentation/pptx/">PPTX</a> archivos: Guía para desarrolladores</h2>
<p>Los decks de presentaciones modernos impulsan todo, desde presentaciones a inversores hasta métricas internas trimestrales. Pero si alguna vez has tenido que extraer texto programáticamente, reemplazar plantillas en tiempo de ejecución, crear generadores automáticos de diapositivas o sanitizar presentaciones confidenciales, probablemente te hayas dado cuenta rápidamente de que las bibliotecas de presentación de alto nivel pueden sentirse como una caja negra impredecible.</p>
<p>Cuando bibliotecas como <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> alcanzan sus límites — o introducen errores de diseño no documentados — la única salida es atravesarlos. Necesitas entender qué es realmente una presentación de PowerPoint a nivel de bytes y de esquema.</p>
<p>En esta inmersión profunda, levantaremos el velo del formato <code>.pptx</code>, desentrañaremos su estructura interna, rastrearemos su grafo de relaciones, disecaremos sus jerarquías de dibujo y examinaremos estrategias prácticas para la ingeniería inversa, inspección y manipulación de presentaciones con código sin procesar.</p>
<h2 id="1-qué-es-realmente-un-archivo-pptx">1. ¿Qué es realmente un archivo <code>.pptx</code>?</h2>
<p>En su esencia, un archivo <code>.pptx</code> no es un binario propietario monolítico como el antiguo formato <code>.ppt</code> de los años 90. Desde que Microsoft introdujo Office Open XML (ECMA-376 y ISO/IEC 29500), los documentos modernos de Office son <strong>archivos de Open Packaging Conventions (OPC)</strong>.</p>
<p>En palabras simples: <strong>un archivo <code>.pptx</code> es simplemente un archivo zip que contiene documentos XML y recursos multimedia organizados en un árbol de directorios determinista.</strong></p>
<p>Puedes demostrarlo en segundos usando herramientas estándar de terminal:</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>El árbol de directorios resultante se ve notablemente consistente:</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>Cada activo visual, transición, herencia de la diapositiva maestra, coordenada de cuadro de texto y gráfico vectorial está codificado en esta jerarquía de archivos.</p>
<h2 id="2-anatomía-del-paquete-subsistemas-clave">2. Anatomía del paquete: subsistemas clave</h2>
<p>Para ingenierizar inversamente presentaciones de manera eficaz, debes comprender las responsabilidades de cada componente de nivel superior.</p>
<h3 id="content_typesxml"><code>[Content_Types].xml</code></h3>
<p>Este es el manifiesto de entrada para el lector OPC. Mapea extensiones de archivo y nombres internos explícitos de partes a tipos MIME/contenido estandarizados. Si creas una nueva diapositiva o añades una imagen y no la declaras en <code>[Content_Types].xml</code>, PowerPoint declarará la presentación como corrupta y solicitará recuperación.</p>
<p>Fragmento de ejemplo:</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="el-gráfico-de-relaciones-_rels">El gráfico de relaciones <code>_rels/</code></h3>
<p>Uno de los conceptos más cruciales en OpenXML es <strong>indirección a través de relaciones</strong>. Las partes rara vez apuntan directamente a rutas de archivo crudas. En su lugar, un archivo (p. ej., <code>slide1.xml</code>) tiene un archivo de relación asociado ubicado en una carpeta hermana <code>_rels</code> (p. ej., <code>_rels/slide1.xml.rels</code>).</p>
<p>Las relaciones definen:</p>
<ul>
<li>Hipervínculos (<code>r:id=&quot;rId2&quot;</code>, TargetMode=&ldquo;External&rdquo;)</li>
<li>Imágenes y pistas de audio almacenadas en <code>ppt/media/</code></li>
<li>Punteros de herencia de diseño (<code>slideLayout1.xml</code>)</li>
<li>Diapositivas de notas, comentarios y fuentes incrustadas</li>
</ul>
<h3 id="docprops-metadatos"><code>docProps/</code> (Metadatos)</h3>
<ul>
<li><strong><code>core.xml</code></strong>: Metadatos Dublin Core—autor, título, fecha de creación, marca de tiempo de modificación.</li>
<li><strong><code>app.xml</code></strong>: Estadísticas específicas de la aplicación—versión de PowerPoint, recuento total de diapositivas, recuentos de diapositivas ocultas, recuento de palabras, nombres de plantillas de presentación.</li>
</ul>
<h3 id="ppt-el-motor-de-presentación"><code>ppt/</code> (El motor de presentación)</h3>
<p>Aquí es donde se encuentra la presentación real:</p>
<ul>
<li><strong><code>presentation.xml</code></strong>: La columna vertebral maestra. Registra los IDs de diapositivas, las dimensiones del tamaño de la diapositiva, referencias al maestro de notas y la configuración de fuente predeterminada.</li>
<li><strong><code>slides/</code></strong>: Las diapositivas individuales (<code>slide1.xml</code>, <code>slide2.xml</code>, etc.).</li>
<li><strong><code>slideLayouts/</code></strong>: Preajustes estructurales maestros (Diapositiva de título, Dos columnas, Encabezado de sección).</li>
<li><strong><code>slideMasters/</code></strong>: Estilos globales, paletas predeterminadas, rellenos de fondo y herencia de marcadores de posición.</li>
<li><strong><code>theme/</code></strong>: Paletas de colores (acentos del 1 al 6, variaciones oscuras/claras) y esquemas de fuentes (fuentes principales/secundarias).</li>
<li><strong><code>media/</code></strong>: Imágenes sin procesar (PNG, JPEG, SVG), audio y archivos de video.</li>
</ul>
<h2 id="3-desglosando-una-diapositiva-los-dialectos-presentationml-p-y-drawingml-a">3. Desglosando una diapositiva: los dialectos PresentationML (<code>p:</code>) y DrawingML (<code>a:</code>)</h2>
<p>Cuando abres <code>ppt/slides/slide1.xml</code>, encuentras dos espacios de nombres XML principales:</p>
<ol>
<li><strong>PresentationML (<code>p:</code>)</strong>: Regula los elementos estructurales de presentación (diapositivas, árboles de formas, grupos de lienzo).</li>
<li><strong>DrawingML (<code>a:</code>)</strong>: Regula la tipografía, la geometría, coordenadas 2D, rellenos degradados y renderizado vectorial.</li>
</ol>
<p>Aquí hay un ejemplo simplificado de cómo se ve una forma de texto estándar:</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="unidades-de-medida-cruciales-emus-y-centésimas-de-punto">Unidades de medida cruciales: EMUs y centésimas de punto</h3>
<p>Observe los números de coordenadas en <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>Estas son <strong>Unidades Métricas Inglesas (EMUs)</strong>.</p>
<ul>
<li>$1 \text{ pulgada} = 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>Los EMU permiten que los enteros representen fracciones exactas tanto de pulgadas como de milímetros sin errores de redondeo de punto flotante en diferentes arquitecturas de hardware.</p>
<p>Observe también el tamaño de fuente:</p>
<ul>
<li><code>sz=&quot;3200&quot;</code> significa <strong>32,00 pt</strong>. Los tamaños de fuente en DrawingML se miden en centésimas de punto.</li>
</ul>
<h2 id="4-la-cadena-de-herencia-por-qué-las-formas-heredan-estilos-invisibles">4. La cadena de herencia: por qué las formas heredan estilos invisibles</h2>
<p>Uno de los errores más comunes al invertir la ingeniería de archivos PPTX es asumir que el estilo visual de una forma está completamente declarado dentro de su propio <code>slideX.xml</code>.</p>
<p>En realidad, OpenXML se basa en un estricto <strong>modelo de herencia en cascada de 4 niveles</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>Si un cuadro de texto en <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>No hay familia de fuentes, ni color explícito, ni tamaño declarado en la ejecución (<code>&lt;a:r&gt;</code>). Para averiguar cómo PowerPoint representa este texto, su analizador debe:</p>
<ol>
<li>Identifique el tipo de marcador de posición (<code>&lt;p:ph type=&quot;title&quot;/&gt;</code>).</li>
<li>Lea el diseño referenciado en <code>slide1.xml.rels</code>.</li>
<li>Verifique si <code>slideLayout1.xml</code> proporciona anulaciones de estilo para ese marcador de posición.</li>
<li>Recurra a <code>slideMaster1.xml</code> para los estilos predeterminados del cuerpo de texto del título.</li>
<li>Rastrear los tokens de color como <code>accent1</code> o <code>tx1</code> en <code>theme1.xml</code> para encontrar el código de color hexadecimal.</li>
</ol>
<p>Si omite este gráfico de herencia, su analizador leerá incorrectamente los estilos, fuentes faltantes, tamaños de fuente y anclajes de diseño.</p>
<h2 id="5-flujo-de-trabajo-práctico-de-ingeniería-inversa">5. Flujo de trabajo práctico de ingeniería inversa</h2>
<p>Cuando necesite investigar cómo funciona bajo el capó una característica particular de PowerPoint (p. ej., transiciones morph, tablas complejas, rutas vectoriales), siga este enfoque empírico:</p>
<h3 id="paso-1-crear-un-par-de-diferencias-mínimo">Paso 1: Crear un &ldquo;Par de diferencias&rdquo; mínimo</h3>
<ol>
<li>Abre PowerPoint y crea una diapositiva en blanco.</li>
<li>Guárdalo como <code>before.pptx</code>.</li>
<li>Aplica el cambio único exacto que deseas revertir (p. ej., agregar una sombra paralela a un círculo, cambiar el estilo de viñeta, insertar un video incrustado).</li>
<li>Guárdalo como <code>after.pptx</code>.</li>
</ol>
<h3 id="paso-2-descomprimir-ambos-archivos">Paso 2: Descomprimir ambos archivos</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="paso-3-formatear-el-xml">Paso 3: Formatear el XML</h3>
<p>El XML sin procesar dentro de los archivos de Office suele estar sin sangrías ni caracteres de nueva línea. Antes de comparar, formatea los archivos:</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="paso-4-ejecutar-un-diff-unificado">Paso 4: Ejecutar un diff unificado</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>Revisar <code>changes.patch</code> revela el nombre exacto de la etiqueta, el atributo de espacio de nombres y la jerarquía del contenedor que introdujo PowerPoint. Esta es la forma más rápida de descubrir propiedades de esquema no documentadas u oscuras sin tener que buscar entre miles de páginas de la documentación ECMA-376.</p>
<h2 id="6-construcción-de-un-micromotor-personalizado-descomprimir-modificar-volver-a-empaquetar">6. Construcción de un micro‑motor personalizado: descomprimir, modificar, volver a empaquetar</h2>
<p>A veces no deseas una dependencia empresarial pesada como Apache POI o el Microsoft OpenXML SDK, especialmente en entornos serverless ligeros (AWS Lambda, Cloudflare Workers, nodos de borde).</p>
<p>Aquí tienes un patrón de Python autocontenido que muestra cómo descomprimir de forma segura un PPTX en memoria, inyectar datos personalizados usando herramientas de la biblioteca estándar y volver a empaquetarlo:</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="aspectos-clave-a-tener-en-cuenta-al-modificar-archivos-a-nivel-de-byte-bruto">Aspectos clave a tener en cuenta al modificar archivos a nivel de byte bruto:</h3>
<ol>
<li><strong>Preservación de espacios de nombres</strong>: Los analizadores XML a menudo reescriben los prefijos (<code>xmlns:p</code> puede convertirse en <code>xmlns:ns0</code>). Aunque es XML válido, la validación estricta del esquema interno de PowerPoint a veces rechaza alias de prefijo no estándar. Registre los espacios de nombres explícitamente.</li>
<li><strong>Métodos de compresión ZIP</strong>: Asegúrese de escribir los archivos de nuevo usando la compresión deflate estándar (<code>zipfile.ZIP_DEFLATED</code>).</li>
<li><strong>Vaciado de flujo</strong>: Siempre verifique que su búfer zip se cierre y vacíe completamente antes de enviar los bytes aguas abajo.</li>
<li><strong>Preservar relaciones</strong>: Si elimina una diapositiva, también debe eliminar su entrada de <code>ppt/presentation.xml</code>, borrar su relación en <code>ppt/_rels/presentation.xml.rels</code> y limpiar su tipo de contenido de <code>[Content_Types].xml</code>.</li>
</ol>
<h2 id="7-consideraciones-de-rendimiento-y-seguridad">7. Consideraciones de rendimiento y seguridad</h2>
<p>Ingeniería inversa de archivos PPTX no se trata solo de editar diapositivas; también implica auditar lo que ingresa a sus sistemas.</p>
<h3 id="seguridad-billion-laughs-y-xxe">Seguridad: Billion Laughs y XXE</h3>
<p>Debido a que los archivos PPTX analizan XML, cualquier canal de procesamiento del lado del servidor que ingiera presentaciones enviadas por el usuario es vulnerable a:</p>
<ul>
<li><strong>Inyección de entidad externa XML (XXE)</strong>: XML malicioso que intenta acceder a <code>/etc/passwd</code> o consultar puntos finales de metadatos internos de la nube (<code>http://169.254.169.254/</code>).</li>
<li><strong>Ataques de expansión de entidades (Billion Laughs)</strong>: Bucles de entidades exponenciales que agotan la RAM del sistema.</li>
</ul>
<p><strong>Mitigación</strong>: Siempre desactive <code>resolve_entities</code>, <code>load_dtd</code> y la resolución de redes externas en su analizador XML (p. ej., usando <code>defusedxml</code> en Python).</p>
<h3 id="seguridad-cargas-de-macros-y-flujos-ocultos">Seguridad: Cargas de Macros y Flujos Ocultos</h3>
<p>Inspeccione los archivos en busca de contenido <code>.pptm</code> que se haga pasar por extensiones <code>.pptx</code>. Busque <code>ppt/vbaProject.bin</code>, que contiene código Visual Basic compilado. En los archivos <code>.pptx</code> estándar, el código VBA está prohibido; encontrar referencias a cargas útiles binarias en las relaciones debería activar inmediatamente las banderas de cuarentena.</p>
<h2 id="conclusión">Conclusión</h2>
<p>La ingeniería inversa de archivos <code>.pptx</code> desmitifica el software de presentaciones. Una vez que reconozca que los archivos de PowerPoint son simplemente paquetes zip estructurados llenos de coordenadas, referencias de esquemas y árboles de relaciones XML, ya no estará limitado por las abstracciones de terceros existentes.</p>
<p>Ya sea que esté optimizando el rendimiento de generación de diapositivas, escribiendo sanitizadores automáticos personalizados o solucionando fallos de renderizado, observar directamente la arquitectura subyacente de OpenXML le brinda un control total sobre la canalización de presentación.</p>
<h2 id="preguntas-frecuentes-faq">Preguntas frecuentes (FAQ)</h2>
<p>**Q: ¿Puede convertir un .pptx a una carpeta estándar y editar los archivos directamente en un IDE?</p>
<p><strong>A1:</strong> Sí, puede extraer el archivo, editar el XML en un editor como VS Code y volver a comprimir el contenido del directorio para abrirlo nuevamente en PowerPoint.</p>
<p>**Q: ¿Por qué PowerPoint dice que mi archivo PPTX modificado manualmente necesita reparación?</p>
<p><strong>A2:</strong> Esto suele ocurrir si introdujiste XML mal formado, omitiste un nuevo recurso de <code>[Content_Types].xml</code>, o dejaste una referencia colgante en un archivo <code>.rels</code> asociado.</p>
<p>**Q: ¿Qué unidad de medida usa PowerPoint para las posiciones y márgenes de las formas?</p>
<p><strong>A3:</strong> PowerPoint usa Unidades Métricas Inglesas (EMUs), donde 1 pulgada equivale a 914,400 EMUs y 1 punto equivale a 12,700 EMUs.</p>
<p>**Q: ¿Cómo puedo <a href="https://products.fileformat.com/presentation/python/python-pptx/">extraer programáticamente</a> todas las imágenes de una presentación sin bibliotecas externas?</p>
<p><strong>A4:</strong> Simplemente abre el archivo <code>.pptx</code> con cualquier utilidad zip estándar y extrae todos los archivos binarios ubicados dentro del directorio <code>ppt/media/</code>.</p>
<p>**Q: ¿Es seguro analizar archivos PPTX subidos por usuarios con analizadores XML estándar?</p>
<p><strong>A5:</strong> No, debes reforzar tu analizador o usar envoltorios seguros como <code>defusedxml</code> para bloquear ataques de Entidad Externa XML (XXE) y bombas zip.</p>
<h2 id="ver-también">Ver también</h2>
<ul>
<li><a href="https://blog.fileformat.com/presentation/powerpoint-file-formats/">¿Formatos de archivo de presentación en FileFormat.com?</a></li>
<li><a href="https://blog.fileformat.com/presentation/apache-poi-api-to-access-powerpoint-file-formats/">API Java para acceder a los formatos de archivo de 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 Comparación del Formato de Presentación de Microsoft PowerPoint</a></li>
<li><a href="https://blog.fileformat.com/presentation/difference-between-ppt-and-pptx/">Diferencia entre PPT y PPTX</a></li>
<li><a href="https://blog.fileformat.com/presentation/create-presentation-in-java-with-apache-poi-api/">Crear presentación de PowerPoint en Java con la API de Apache POI</a></li>
</ul>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    
  </channel>
</rss>
