Metadata-Version: 2.4
Name: svg2ooxml
Version: 0.8.0
Summary: SVG-to-PowerPoint converter with native, editable PresentationML output.
Author: SVG2OOXML Contributors
License-Expression: AGPL-3.0-only
Project-URL: Homepage, https://github.com/BramAlkema/svg2ooxml
Project-URL: Documentation, https://github.com/BramAlkema/svg2ooxml/blob/main/docs/README.md
Project-URL: Repository, https://github.com/BramAlkema/svg2ooxml
Project-URL: Issues, https://github.com/BramAlkema/svg2ooxml/issues
Project-URL: Changelog, https://github.com/BramAlkema/svg2ooxml/releases
Project-URL: Commercial Licensing, https://github.com/BramAlkema/svg2ooxml/blob/main/LICENSE-COMMERCIAL.md
Keywords: svg,pptx,powerpoint,ooxml,drawingml
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Topic :: Multimedia :: Graphics :: Graphics Conversion
Classifier: Topic :: Office/Business :: Office Suites
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >=3.13
Description-Content-Type: text/markdown
License-File: LICENSE
License-File: LICENSE-COMMERCIAL.md
License-File: LICENSE-CONTENT
Requires-Dist: tinycss2>=1.2
Requires-Dist: click>=8.1
Requires-Dist: lxml>=4.9.0
Requires-Dist: pydantic>=2.5.3
Provides-Extra: dev
Requires-Dist: black>=24.0; extra == "dev"
Requires-Dist: httpx>=0.27; extra == "dev"
Requires-Dist: isort>=5.12; extra == "dev"
Requires-Dist: mypy>=1.8; extra == "dev"
Requires-Dist: pre-commit>=3.5; extra == "dev"
Requires-Dist: pytest>=7.4; extra == "dev"
Requires-Dist: ruff>=0.4.0; extra == "dev"
Requires-Dist: python-pptx>=0.6.23; extra == "dev"
Provides-Extra: accel
Requires-Dist: numpy>=1.24; extra == "accel"
Provides-Extra: color
Requires-Dist: numpy>=1.24; extra == "color"
Requires-Dist: colorspacious>=1.1.0; extra == "color"
Requires-Dist: Pillow>=10.0; extra == "color"
Provides-Extra: render
Requires-Dist: skia-python>=87.5; extra == "render"
Requires-Dist: Pillow>=10.0; extra == "render"
Requires-Dist: numpy>=1.24; extra == "render"
Provides-Extra: slides
Requires-Dist: cryptography>=41.0; extra == "slides"
Requires-Dist: fonttools>=4.43; extra == "slides"
Provides-Extra: api
Requires-Dist: fastapi>=0.109.0; extra == "api"
Requires-Dist: uvicorn[standard]>=0.27.0; extra == "api"
Requires-Dist: pydantic>=2.5.3; extra == "api"
Requires-Dist: python-multipart>=0.0.6; extra == "api"
Requires-Dist: PyJWT>=2.8.0; extra == "api"
Provides-Extra: cloud
Requires-Dist: google-cloud-firestore>=2.14.0; extra == "cloud"
Requires-Dist: google-cloud-storage>=2.14.0; extra == "cloud"
Requires-Dist: google-cloud-iam>=2.14.0; extra == "cloud"
Requires-Dist: google-cloud-tasks>=2.16.0; extra == "cloud"
Requires-Dist: google-api-python-client>=2.130; extra == "cloud"
Requires-Dist: google-auth>=2.26; extra == "cloud"
Requires-Dist: google-auth-oauthlib>=1.2.0; extra == "cloud"
Provides-Extra: payments
Requires-Dist: stripe>=8.0.0; extra == "payments"
Provides-Extra: visual-testing
Requires-Dist: scikit-image>=0.21.0; extra == "visual-testing"
Requires-Dist: Pillow>=10.0.0; extra == "visual-testing"
Provides-Extra: figma2gslides
Requires-Dist: fastapi>=0.109.0; extra == "figma2gslides"
Requires-Dist: uvicorn[standard]>=0.27.0; extra == "figma2gslides"
Requires-Dist: python-multipart>=0.0.6; extra == "figma2gslides"
Requires-Dist: PyJWT>=2.8.0; extra == "figma2gslides"
Requires-Dist: cryptography>=41.0; extra == "figma2gslides"
Requires-Dist: google-cloud-firestore>=2.14.0; extra == "figma2gslides"
Requires-Dist: google-cloud-storage>=2.14.0; extra == "figma2gslides"
Requires-Dist: google-api-python-client>=2.130; extra == "figma2gslides"
Requires-Dist: google-auth>=2.26; extra == "figma2gslides"
Requires-Dist: google-auth-oauthlib>=1.2.0; extra == "figma2gslides"
Dynamic: license-file

<p align="center">
  <img src="https://raw.githubusercontent.com/BramAlkema/svg2ooxml/main/assets/logo.png" alt="svg2ooxml" width="96">
</p>

<h1 align="center">svg2ooxml</h1>

<p align="center">
  <strong>SVG-to-PowerPoint converter with native, editable PresentationML output.</strong>
</p>

<p align="center">
  <a href="https://pypi.org/project/svg2ooxml/"><img src="https://img.shields.io/pypi/v/svg2ooxml" alt="PyPI"></a>
  <a href="https://pypi.org/project/svg2ooxml/"><img src="https://img.shields.io/pypi/dm/svg2ooxml" alt="Downloads"></a>
  <a href="https://pypi.org/project/svg2ooxml/"><img src="https://img.shields.io/pypi/pyversions/svg2ooxml" alt="Python"></a>
  <a href="https://github.com/BramAlkema/svg2ooxml/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-AGPL--3.0-blue.svg" alt="License: AGPL-3.0"></a>
</p>

---

svg2ooxml parses SVG markup, builds a typed intermediate representation, renders native DrawingML XML fragments, and packages them into valid `.pptx` files. Shapes, text, gradients, filters, masks, clipping paths, and SMIL animations are converted to editable PowerPoint objects — not rasterized images.

svg2ooxml is the converter package. PowerPoint behavior research, authored control decks, and durable oracle evidence are maintained in the companion repository `openxml-audit` so the package documentation can stay focused on conversion.

The same distribution also carries `figma2gslides`, a tool package built on top
of the converter for Figma and Google Slides workflows. It is intentionally
separate from the supported `svg2ooxml` converter API.

## Features

- **Native DrawingML output** — shapes, text, and paths render as editable PowerPoint objects
- **SMIL animation support** — entrance, emphasis, exit, and motion path animations
- **SVG filter effects** — blur, drop shadow, color matrix, and compositing
- **Gradients & patterns** — linear, radial, and pattern fills with correct coordinate transforms
- **Masks & clipping** — SVG clip paths and masks mapped to OOXML equivalents
- **Multi-slide export** — split multi-page SVGs into separate slides
- **Extensible pipeline** — service registry with dependency injection for custom providers

## Installation

Requires Python 3.13 or newer.

The base install does not depend on NumPy. NumPy is installed only through the
`render`, `color`, or `accel` extras for raster/filter/color workloads.

```bash
pip install svg2ooxml
```

Optional extras:

```bash
pip install svg2ooxml[render]    # Skia rendering + visual comparison
pip install svg2ooxml[color]     # Advanced color space support
pip install svg2ooxml[figma2gslides]  # Figma/Google Slides tool runtime
```

## Current Release

`0.8.0` is the fidelity policy, traceability, and converter-hardening release.
Fidelity tiers now come from one typed policy source, trace reports are typed
end to end, optional PPTX docProps trace embedding is behind an explicit switch,
and more shared geometry, color, filter, SVG reference, and policy helpers are
centralized to reduce duplicate conversion behavior.

## Quick Start

```python
from svg2ooxml import SvgToPptxExporter

exporter = SvgToPptxExporter()
exporter.export("input.svg", "output.pptx")
```

### CLI

```bash
svg2ooxml convert input.svg -o output.pptx
```

## How It Works

```
SVG text
  → SVGParser.parse()            → ParseResult (lxml tree + metadata)
  → convert_parser_output()      → IRScene (typed intermediate representation)
  → DrawingMLWriter.render()     → DrawingMLRenderResult (XML fragments + assets)
  → PPTXPackageBuilder.write()   → .pptx file
```

## Links

- [GitHub](https://github.com/BramAlkema/svg2ooxml)
- [Documentation guide](https://github.com/BramAlkema/svg2ooxml/blob/main/docs/README.md)
- [Testing guide](https://github.com/BramAlkema/svg2ooxml/blob/main/docs/testing.md)
- [Animation documentation map](https://github.com/BramAlkema/svg2ooxml/blob/main/docs/internals/animation-documentation-map.md)
- [Changelog](https://github.com/BramAlkema/svg2ooxml/releases)
- [openxml-audit](https://github.com/BramAlkema/openxml-audit)

## License

Dual-licensed: [AGPL-3.0](https://github.com/BramAlkema/svg2ooxml/blob/main/LICENSE) for open source, [Commercial License](https://github.com/BramAlkema/svg2ooxml/blob/main/LICENSE-COMMERCIAL.md) for proprietary use. Contact license@svg2ooxml.com.
