PPTX Format: Inside Microsoft PowerPoint's Open XML Presentation
PPTX (PowerPoint Open XML Presentation) is Microsoft's presentation format introduced with Office 2007, replacing the binary PPT format. Like DOCX and XLSX, PPTX is a ZIP archive containing XML files conforming to the Office Open XML (OOXML) standard (ECMA-376 / ISO/IEC 29500). Understanding PPTX's structure enables automated slide generation, content extraction, and accurate conversion to PDF, video, or other formats.
PPTX Internal Structure
presentation.pptx/
├── [Content_Types].xml
├── _rels/.rels
├── ppt/
│ ├── presentation.xml — master presentation structure (slide list, slide size)
│ ├── presProps.xml — presentation-level properties
│ ├── viewProps.xml — view state (normal, outline, slide show)
│ ├── tableStyles.xml — table style definitions
│ ├── theme/
│ │ └── theme1.xml — color theme, fonts, effects
│ ├── slides/
│ │ ├── slide1.xml — Slide 1 content
│ │ ├── slide2.xml — Slide 2 content
│ │ └── _rels/
│ │ ├── slide1.xml.rels — slide 1 relationships (layout, media, hyperlinks)
│ │ └── slide2.xml.rels
│ ├── slideLayouts/
│ │ ├── slideLayout1.xml — "Title Slide" layout
│ │ ├── slideLayout2.xml — "Title and Content" layout
│ │ └── ... — up to 11+ named layouts
│ ├── slideMasters/
│ │ └── slideMaster1.xml — master slide (global design, placeholder positions)
│ ├── notesSlides/
│ │ └── notesSlide1.xml — speaker notes for slide 1
│ ├── media/
│ │ ├── image1.png
│ │ └── video1.mp4 — embedded media files
│ └── charts/
│ └── chart1.xml
└── docProps/
├── app.xml — slide count, company, hidden slides
└── core.xml — title, author, created/modified dates
The Slide Master / Layout / Slide Inheritance Model
PPTX uses a three-tier inheritance model for slide design:
Slide Master (slideMaster1.xml)
└── Slide Layout (slideLayout1.xml, slideLayout2.xml, ...)
└── Individual Slide (slide1.xml, slide2.xml, ...)
Slide Master: Defines the base design — background, color scheme, default font sizes, and placeholder positions for the entire presentation. Changes here propagate to all slides.
Slide Layout: Refines the master for a specific layout type (Title Slide, Title and Content, Two Content, Comparison, etc.). Each layout inherits from the master but can override background and placeholder arrangements.
Individual Slide: Contains actual content. Inherits design from its assigned layout. Only needs to specify values that differ from the layout/master inheritance chain.
This cascade means a single theme change propagates through 100 slides automatically.
The slide.xml Structure
Each slide in ppt/slides/slideN.xml contains shape trees:
<p:sld>
<p:cSld> <!-- Common Slide Data -->
<p:spTree> <!-- Shape Tree -->
<!-- Text Box -->
<p:sp>
<p:nvSpPr> <!-- Non-Visual Properties -->
<p:nvPr>
<p:ph type="title"/> <!-- placeholder type: title/body/dt/ftr/sldNum -->
</p:nvPr>
</p:nvSpPr>
<p:spPr> <!-- Shape Properties: position, size, geometry -->
<a:xfrm>
<a:off x="457200" y="274638"/> <!-- position in EMUs -->
<a:ext cx="8229600" cy="1143000"/> <!-- size in EMUs -->
</a:xfrm>
<a:prstGeom prst="rect"><a:avLst/></a:prstGeom>
</p:spPr>
<p:txBody> <!-- Text Content -->
<a:bodyPr/>
<a:lstStyle/>
<a:p> <!-- Paragraph -->
<a:r> <!-- Run -->
<a:rPr lang="en-US" sz="4000" b="1"/> <!-- sz in hundredths of a point -->
<a:t>Slide Title</a:t>
</a:r>
</a:p>
</p:txBody>
</p:sp>
<!-- Image -->
<p:pic>
<p:nvPicPr>
<p:cNvPr id="4" name="Picture 3"/>
</p:nvPicPr>
<p:blipFill>
<a:blip r:embed="rId2"/> <!-- relationship ID → media/image1.png -->
<a:stretch><a:fillRect/></a:stretch>
</p:blipFill>
<p:spPr>
<a:xfrm>
<a:off x="1143000" y="1143000"/>
<a:ext cx="4572000" cy="3429000"/>
</a:xfrm>
<a:prstGeom prst="rect"><a:avLst/></a:prstGeom>
</p:spPr>
</p:pic>
</p:spTree>
</p:cSld>
<!-- Slide Transitions -->
<p:transition spd="med" advTm="3000">
<p:fade/>
</p:transition>
<!-- Slide Animations -->
<p:timing>
<p:tnLst>
<p:par>
<p:cTn id="1" dur="indefinite" restart="whenNotActive">
<p:childTnLst>
<!-- Animation sequences for each shape -->
</p:childTnLst>
</p:cTn>
</p:par>
</p:tnLst>
</p:timing>
</p:sld>
Transitions and Animations
PPTX stores transitions and animations as SMIL (Synchronized Multimedia Integration Language) timing trees:
Slide transitions (<p:transition>): Fade, Push, Wipe, Split, Reveal, Random Bars, Shape, Wheel, etc. Each has speed and advance timing attributes.
Object animations (<p:timing>): Enter/exit/emphasis/motion path effects for individual shapes. Animations reference shapes by ID and specify duration, delay, trigger (on click, after previous, with previous), and easing functions.
Embedded Video and Audio
PPTX can embed media files directly in ppt/media/:
<p:pic>
<p:nvPicPr>
<p:nvPr>
<p:ph/>
<p:nvPr>
<a:videoFile r:link="rId5"/> <!-- embedded video -->
</p:nvPr>
</p:nvPr>
</p:nvPicPr>
</p:pic>
Video formats supported: MP4 (H.264), WMV, AVI, MOV. Audio: MP3, WAV, WMA. Embedded media increases file size significantly — a 10-second MP4 clip can add 5–20 MB.
Programmatic PPTX Generation
Python — python-pptx
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
# Create presentation (16:9)
prs = Presentation()
prs.slide_width = Inches(13.33)
prs.slide_height = Inches(7.5)
# Get slide layout (Title and Content)
slide_layout = prs.slide_layouts[1]
slide = prs.slides.add_slide(slide_layout)
# Access placeholders
title = slide.placeholders[0]
content = slide.placeholders[1]
title.text = "Q4 2024 Results"
# Add formatted text to content
tf = content.text_frame
tf.text = "Revenue increased by 32%"
tf.paragraphs[0].font.size = Pt(24)
tf.paragraphs[0].font.bold = True
tf.paragraphs[0].font.color.rgb = RGBColor(0x4A, 0x72, 0xC4)
p = tf.add_paragraph()
p.text = "• New customers: 1,247"
p.level = 1 # indent level
# Add image
slide2 = prs.slides.add_slide(prs.slide_layouts[6]) # blank layout
pic = slide2.shapes.add_picture(
'chart.png',
left=Inches(1), top=Inches(1),
width=Inches(8), height=Inches(5)
)
# Add table
slide3 = prs.slides.add_slide(prs.slide_layouts[5])
table = slide3.shapes.add_table(
rows=4, cols=3,
left=Inches(1), top=Inches(2),
width=Inches(8), height=Inches(3)
).table
table.cell(0, 0).text = "Region"
table.cell(0, 1).text = "Revenue"
table.cell(0, 2).text = "Growth"
prs.save("output.pptx")
Converting PPTX
# Convert to PDF (LibreOffice)
libreoffice --headless --convert-to pdf presentation.pptx
# Convert to images (one image per slide)
libreoffice --headless --convert-to png presentation.pptx
# Convert to video using LibreOffice + ffmpeg
libreoffice --headless --convert-to png --outdir /tmp/slides/ presentation.pptx
ffmpeg -framerate 1/5 -i /tmp/slides/slide%d.png -c:v libx264 -r 30 output.mp4
# Extract all text content
python3 -c "
from pptx import Presentation
prs = Presentation('presentation.pptx')
for slide in prs.slides:
for shape in slide.shapes:
if shape.has_text_frame:
for para in shape.text_frame.paragraphs:
print(para.text)
"
PPTX vs. ODP vs. PDF vs. HTML
| Format | Editability | Animations | Offline | Open |
|---|---|---|---|---|
| PPTX | Full | ✅ Full | ✅ | ✅ OOXML |
| ODP | Full | ✅ Limited | ✅ | ✅ ODF |
| Read-only | ❌ | ✅ | ✅ | |
| HTML/Reveal.js | Limited | ✅ CSS/JS | ✅ | ✅ |
| Google Slides | Full | ✅ | ❌ (needs internet) | ❌ |
Summary
PPTX's three-tier master/layout/slide model enables consistent design across complex presentations while keeping individual slide XML minimal. Its ZIP+XML structure makes it straightforward to generate programmatically with python-pptx or Apache POI. Embedded media and animation data are the largest contributors to file size. For sharing, converting to PDF preserves visual fidelity without requiring PowerPoint. For web delivery, HTML-based presentation frameworks (Reveal.js) provide browser-native animation support. For any workflow requiring editable, animatable slides compatible with PowerPoint, PPTX is the definitive format.
Related conversions
Document conversions that follow this topic naturally: