Skill: PowerPoint to Page
Convert PowerPoint presentations to Obsidian Page notes with text extraction, tables, and images.
When to Use
This skill should be invoked when the user:
- •Asks to "convert a PowerPoint to a page note"
- •Mentions "/pptx-to-page" explicitly
- •Wants to import a presentation into the vault
- •Needs to extract slides as images for viewing in Obsidian
- •Has a .pptx or .ppt file to process
Parameters
- •PPTX Path: Path to the PowerPoint file (can be in Downloads, vault, or anywhere)
- •Page Title (optional): Custom title for the Page note (defaults to presentation filename)
- •Mode (optional):
quick(default) orvisual- •
quick: Fast docling extraction with text, tables, embedded images - •
visual: Full slide rendering as PNG images (requires LibreOffice)
- •
Process
Step 1: Locate the PowerPoint File
If the user provides a partial path or just a filename:
- •Check
~/Downloads/first - •Check vault
+Attachments/folder - •Ask user for full path if not found
Step 2: Choose Processing Mode
Ask the user (or infer from context):
Quick Mode (default - recommended for most uses):
- •Uses docling for fast text/table extraction
- •Uses python-pptx for speaker notes and embedded images
- •Processing time: ~1 second for 50 slides
- •Best for: searchable content, meeting notes, documentation
Visual Mode (when visual fidelity needed):
- •Uses LibreOffice to render full slide images
- •Processing time: 1-2 minutes for 50 slides
- •Best for: design reviews, exact visual reference
Step 3: Quick Mode Processing (Docling)
python
from pathlib import Path
from docling.document_converter import DocumentConverter
from pptx import Presentation
import os
def process_pptx_quick(pptx_path, output_dir, title):
"""Quick mode: docling + python-pptx extraction"""
# 1. Docling for text and tables
converter = DocumentConverter()
result = converter.convert(pptx_path)
doc = result.document
markdown_content = doc.export_to_markdown()
tables_count = len(doc.tables) if hasattr(doc, 'tables') else 0
pictures_count = len(doc.pictures) if hasattr(doc, 'pictures') else 0
# 2. python-pptx for speaker notes and embedded images
prs = Presentation(pptx_path)
speaker_notes = []
embedded_images = []
for slide_num, slide in enumerate(prs.slides, 1):
# Extract speaker notes
if slide.has_notes_slide:
notes = slide.notes_slide.notes_text_frame.text.strip()
if notes:
speaker_notes.append((slide_num, notes))
# Extract embedded images
for shape in slide.shapes:
if hasattr(shape, "image"):
img = shape.image
img_filename = f"{title} - Slide {slide_num:02d} - Image {len(embedded_images)+1}.{img.ext}"
img_path = output_dir / img_filename
with open(img_path, "wb") as f:
f.write(img.blob)
embedded_images.append((slide_num, img_filename))
return {
'markdown': markdown_content,
'tables_count': tables_count,
'pictures_count': pictures_count,
'speaker_notes': speaker_notes,
'embedded_images': embedded_images,
'slide_count': len(prs.slides)
}
Step 4: Visual Mode Processing (LibreOffice)
Only use if visual mode requested. Check dependencies first:
bash
# Check for LibreOffice (for PPTX to PDF conversion) which soffice || brew install --cask libreoffice # Check for poppler (for PDF to image conversion) which pdftoppm || brew install poppler # Check for Python libraries python3 -c "import pdf2image" 2>&1 || pip3 install pdf2image
Then convert PPTX → PDF → PNG images at 200 DPI.
Step 5: Create Page Note
Quick Mode Output Format:
markdown
--- type: Page title: <Presentation Title> created: YYYY-MM-DD modified: YYYY-MM-DD tags: - presentation - slides - pdf-import sourceType: PPTX processedWith: docling slides: <count> tables: <count> --- # <Presentation Title> > Extracted from `<original-filename.pptx>` using docling **Slides**: <count> | **Tables**: <count> | **Images**: <count> --- ## Content <docling markdown output - includes headings, text, tables> --- ## Speaker Notes ### Slide 3 <notes content> ### Slide 7 <notes content> --- ## Embedded Images ### Slide 1 ![[<title> - Slide 01 - Image 1.png]] ### Slide 4 ![[<title> - Slide 04 - Image 1.jpg]] ![[<title> - Slide 04 - Image 2.png]] --- ## Related - [[<linked meeting note if applicable>]]
Visual Mode Output Format:
markdown
--- type: Page title: <Presentation Title> created: YYYY-MM-DD modified: YYYY-MM-DD tags: - presentation - slides sourceType: PPTX processedWith: libreoffice slides: <count> --- # <Presentation Title> Source: `<original-pptx-filename>` Total Slides: <count> --- ## Slide 1 ![[<title> - Slide 01.png]] --- ## Slide 2 ![[<title> - Slide 02.png]] --- ...
Step 6: Link to Context (if applicable)
Ask the user if they want to link this page to:
- •A specific meeting note (most common for presentations)
- •A project note
- •An ADR (if it's architecture-related)
Suggest adding it to the meeting note's "Slides" section.
Mode Selection Guide
| Use Case | Recommended Mode |
|---|---|
| Meeting notes reference | Quick |
| Technical documentation | Quick |
| Searchable archive | Quick |
| Design review | Visual |
| Exact visual reference needed | Visual |
| Large presentations (50+ slides) | Quick |
| Offline/slow machine | Quick |
Success Message
Quick Mode:
code
✅ Page note created: `Page - <title>.md` 📊 Slides processed: <count> 📋 Tables extracted: <count> 🖼️ Embedded images saved: <count> to +Attachments/ 💬 Speaker notes captured: <count> slides ⚡ Processing time: <X.XX> seconds 🔗 Link in meeting notes with: `[[Page - <title>]]`
Visual Mode:
code
✅ Page note created: `Page - <title>.md` 📊 Total slides rendered: <count> 🖼️ Slide images saved to: +Attachments/ ⏱️ Processing time: <X> minutes 🔗 Link in meeting notes with: `[[Page - <title>]]`
Error Handling
Common errors and solutions:
- •PPTX not found: Ask user for correct path
- •Docling import error:
pip3 install docling - •python-pptx import error:
pip3 install python-pptx - •LibreOffice missing (visual mode):
brew install --cask libreoffice - •poppler missing (visual mode):
brew install poppler - •Corrupted PPTX: Inform user, suggest opening in PowerPoint first
- •Password-protected: Cannot process, ask user to remove password
Performance Comparison
| Presentation Size | Quick Mode | Visual Mode |
|---|---|---|
| 10 slides | ~0.2 sec | ~20 sec |
| 25 slides | ~0.4 sec | ~50 sec |
| 50 slides | ~0.8 sec | ~2 min |
| 100 slides | ~1.5 sec | ~4 min |
Examples
Example 1: Quick Mode (Default)
code
User: /pptx-to-page ~/Downloads/Project_Update.pptx
Example 2: Visual Mode
code
User: /pptx-to-page SAP_Architecture.pptx visual
Example 3: With Meeting Link
code
User: Convert the Datasphere presentation and add it to today's meeting note
Example 4: With Custom Title
code
User: Convert SAP_BTP_2026.pptx to a page called "SAP BTP Architecture 2026"
Integration with Other Skills
This skill works well with:
- •
/meeting- Add presentation to meeting notes - •
/project-status- Include project presentations - •
/adr- Attach architecture diagrams from slides - •
/weekly-summary- Reference key slides in summaries
Dependencies
Quick Mode (minimal):
- •
docling- Text and table extraction - •
python-pptx- Speaker notes and embedded images
Visual Mode (additional):
- •LibreOffice - PPTX to PDF conversion
- •poppler (pdftoppm) - PDF to PNG conversion
- •
pdf2image- Python wrapper for poppler
Notes
- •Quick mode is ~100x faster than visual mode
- •Quick mode extracts actual text (searchable, copyable)
- •Visual mode preserves exact slide appearance
- •Always copy the original PPTX to
+Attachments/for reference - •Speaker notes are only available via python-pptx (both modes can include them)
- •Consider using quick mode first, then visual mode for specific slides if needed