Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

pptd_utils

Offline PPTD toolkit — full-spec .pptd → .pptx converter + slide image export (collage / single slide). Pure Python, no browser required.

Built against the PPTD v2 spec (skills/cowork-ppt/reference/pptd.md, relative to the repo root).

Install / dependencies

pip install python-pptx Pillow PyYAML

Optional (graceful fallback if missing):

Package Unlocks Fallback
latex2mathml + mathml2omml native equations (OMML) from \( ... \) literal text
fontTools customFonts (Google Fonts woff2 → embedded TTF) fonts skipped

Slide images additionally need LibreOffice (soffice on PATH).

CLI

Install from PyPI:

python -m pip install pptd-utils

Commands write beside the input path. all is the default; selections accept comma-separated 1-based slide numbers.

pptd check deck.pptd
pptd pptx deck.pptd
pptd png deck.pptd                 # all slides -> deck-png/
pptd png 1,2,3 deck.pptd           # selected slides -> deck-png/
pptd png collage deck.pptd         # contact sheet -> deck-collage.png
pptd pdf deck.pptd                 # all slides -> deck.pdf
pptd pdf 1,2,3 deck.pptd            # selected slides -> deck.pdf

PNG and PDF export require LibreOffice (soffice on PATH).

Python API

from pptd_utils import convert, build, verify
from pptd_utils import slides_image

convert("deck.pptd", "out.pptx")          # build + verify + print summary
build("deck.pptd", "out.pptx")            # -> (n_slides, n_fonts)
verify("deck.pptd", "out.pptx")           # structural self-check (asserts)

slides_image.render_collage("deck.pptd", "collage.png",
                            tile_w=480, gap=20, bg="#1F2430")
slides_image.render_slide("deck.pptd", 3, "slide3.png")
slides_image.render_slide_images("deck.pptd", "outdir/",
                                 slides=[1, 3, 5])   # -> [(n, Path), ...]

Supported features (PPTD v2)

Area Coverage
text full HTML tag set (strong/em/u/s/sup/sub/a/br/ul/ol/span style attrs), LaTeX runs, gradient + shadow text, letterSpacing, lineHeight / lineHeightPx, bullets/numbering, vertical text, hyperlinks, highlight
shapes all 130 preset shapeNames (adjustments), custom SVG paths (M/L/H/V/C/S/Q/A/Z, multi-subpath holes), rotation/flip/opacity, gradient/radial fills
lines sharp / smooth / round (fillet) curves, arrows (head/tail), dash styles
images fit cover/contain/fill, crop (inset + negative outset padding), cropShape (any preset or custom path), opacity, border, shadow
icons Font Awesome 6/7 free (fas/far/fab), solid + gradient fill, outline, shadow
tables rowSpan/colSpan merges, theme tableStyles + inline, per-cell style chains, BorderSpec (per-side / null-clear), gradient cell fills, fontSize auto-fit
charts — native (editable) bar (stacked/clustered/horizontal), line (smooth/dash/markers), area, scatter, bubble, pie/donut, radar, secondary axes, dataLabels + numberFormat, embedded workbooks
charts — raster (Pillow PNG) candlestick, waterfall, heatmap (linear/diverging + colorbar), treemap, sunburst, sankey, stream stacks, mixed scatter+cartesian
animations 21 effects (entrance/emphasis/exit incl. motion-path) → full p:timing tree, click/withPrevious/afterPrevious, repeat, easing
transitions fade
fonts customFonts embedding (see optional deps)
misc page backgrounds (solid/gradient/image), notes, themes ($refs), elementId → animation targeting

How it works

  • pptx generation: python-pptx + hand-built DrawingML for fills/effects/ordering; charts created via real chart parts (editable in PowerPoint) then plot XML rewritten; unsupported chart types rasterized at 2× and placed as pictures.
  • images: each slide isolated into a one-slide pptx, rendered by LibreOffice headless, composed by Pillow. (ponytail: one soffice run per slide — switch to single PDF + PyMuPDF for large decks.)

Test

python3 tests/run.py   # converts full-spec fixture + minimal + ml-smp, asserts structure

Fixture tests/fixtures/full/ exercises every feature area — use it as a syntax reference for your own decks.

Notes

  • Downloads (FA fonts, URL images/fonts) cache under ~/.cache/pptd_utils/.
  • Defaults follow the spec: MiSans font family, 18pt body, black text.

Metadata

Release files for pptd-utils 2026.10.2.dev4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pptd-utils 2026.10.2.dev4
File Size Uploaded
pptd_utils-2026.10.2.dev4.tar.gz 18.0 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for pptd-utils 2026.10.2.dev4
File Interpreter ABI Platform
pptd_utils-2026.10.2.dev4-py3-none-any.whl Python 3 none any Details

Total release size: 18.1 MB

Release files / pptd_utils-2026.10.2.dev4.tar.gz

Download URL pptd_utils-2026.10.2.dev4.tar.gz
Size 18.0 MB
Tags Source
SHA-256 checksum
How to use checksums
1eab679672a5a6a19e0bbe462b819dba50acf5d59f6415ab6b4926f60057febc
BLAKE2b-256 checksum
How to use checksums
db2562fd0ad95ef6596ba7ce074d227f3b335c9cfcf478dd70560305f1ec46bb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.16

Release files / pptd_utils-2026.10.2.dev4-py3-none-any.whl

Download URL pptd_utils-2026.10.2.dev4-py3-none-any.whl
Size 61.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
b11602d9a9754918f94fe34127573b5aa747bc8acff7f2ed8167edc388a4d446
BLAKE2b-256 checksum
How to use checksums
e3780751298deae5c51bb6368a51565a888dff57ed892d434d91bce4992fd6b3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.16
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page