
python-pptx vs PptxGenJS vs PaperJSX: PPTX compared 2026
python-pptx vs PptxGenJS vs PaperJSX: PowerPoint generation compared on charts, combo charts, maintenance, and multi-format output for 2026.
PptxGenJS is the best open-source library for generating PPTX files in JavaScript — it has ~4.6M weekly npm downloads as of July 2026, active maintenance, and the widest chart type support. python-pptx dominates the Python ecosystem but has been inactive since August 2024 and cannot create combo charts. PaperJSX is the only option that generates PPTX, DOCX, PDF, and XLSX from a single JSON schema.
Comparison table
No dedicated comparison of these three libraries exists anywhere on the web. This table covers every dimension that matters for choosing a PPTX generation tool in production.
| Dimension | python-pptx | PptxGenJS | PaperJSX |
|---|---|---|---|
| Language | Python | JavaScript / TypeScript | JavaScript / TypeScript |
| GitHub stars | ~3,400 | ~5,800 | New |
| Weekly downloads | ~13.6M (PyPI) | ~4.6M (npm) | New |
| Latest release | v1.0.2 (Aug 2024) | v4.0.1 (Jun 2025) | Active |
| Maintenance status | Inactive (Snyk) | Active | Active |
| Open issues | 439 | ~50 | — |
| License | MIT | MIT | Apache-2.0 lite / Proprietary Pro |
| Browser support | No | All modern browsers | Server-side only |
| Chart types | 8 element types | 10+ including combo, 3D | Native charts + Pro extensions |
| Combo charts | No (since 2017) | Yes | Yes |
| Slide animations | No | No (explicitly not planned) | Yes (Pro) |
| Input model | Imperative Python API | Imperative JS API | Declarative JSON schema |
| Output formats | PPTX only | PPTX only | PPTX, DOCX, PDF, XLSX |
| MCP server (AI agents) | No | No | Yes |
| HTML-to-PPTX | No | Yes (table conversion) | No |
| Slide Masters / layouts | Yes | Yes | Yes |
| SVG support | No | Yes | Yes |
| Dependencies | lxml, Pillow, XlsxWriter | JSZip only | Zero native deps |
| Pricing | Free (MIT) | Free (MIT) | Free / $79 single format / $199 all formats |
What is python-pptx
python-pptx is a Python library for creating and modifying PowerPoint (.pptx) files. It was created by Steve Canny and has been the default PPTX generation tool in the Python ecosystem for over a decade, accumulating ~3,400 GitHub stars
and ~13.6 million weekly PyPI downloads as of July 2026. According to the official documentation, it supports creating slides, text boxes, shapes, images, tables, and most chart types other than 3D.
The library's API is imperative — you construct a Presentation object, add slides, then add shapes and charts to each slide through method calls. This model mirrors the internal OOXML structure closely, which gives developers fine-grained control but produces verbose code for common tasks.
python-pptx has two critical limitations that surface repeatedly in production use:
- No combo charts. According to issue #338, opened in November 2017, python-pptx cannot create multi-plot charts (e.g., bar + line on the same axis). The documentation explicitly states it "doesn't yet support creating multi-plot charts." Workarounds involving XML manipulation frequently trigger PowerPoint's repair dialog.
- Inactive maintenance. According to Snyk's health analysis, python-pptx is classified as an inactive project. The last release was v1.0.2 in August 2024. According to a January 2026 dependency audit by the Swiss Federal Railways, the repository has 439 open issues and 77 open pull requests with no maintainer activity.
What is PptxGenJS
PptxGenJS is a JavaScript library for generating PowerPoint presentations in both browsers and Node.js. Created by Brent Ely, it has ~5,800 GitHub stars, ~4.6 million weekly npm downloads as of July 2026
, and is actively maintained with the latest release being v4.0.1 in June 2025.
PptxGenJS's key advantage is runtime flexibility. According to the official documentation, it works in every major modern browser, Node.js, React, Angular, Vite, Electron, and serverless environments including AWS Lambda and Cloudflare Workers. Its only dependency is JSZip.
The library supports the widest range of chart types among open-source PPTX generators — including combo charts and 3D charts, which python-pptx cannot create. It also provides a unique HTML-to-PPTX feature that converts HTML tables to slides with a single line of code.
PptxGenJS has two limitations worth noting:
- No slide animations. According to the project's README, animations are "not on the development roadmap." This also applies to importing existing presentations, outlines, and SmartArt.
- Repair dialog edge cases. According to the release notes for v4.0.1, hyperlinks in auto-paged tables caused repair dialogs in PowerPoint (issue #1392, fixed in v4.0.1). Earlier versions had similar issues with line chart data label positioning (issue #768).
What is PaperJSX
PaperJSX is an open-core document generation engine that converts a single JSON schema into PPTX, DOCX, PDF, and XLSX files. Unlike python-pptx and PptxGenJS, which use imperative APIs where you call methods to build slides, PaperJSX uses a declarative model — you describe the document as a JSON object and the engine produces the output file.
The Apache-2.0 PPTX lite engine is published as @paperjsx/json-to-pptx, alongside free lite engines for DOCX, PDF, and XLSX. Pro - Single ($79/mo) unlocks Pro features for one format; Pro - All Formats ($199/mo) covers all four formats.
When I built PaperJSX, the problem I kept hitting with both python-pptx and PptxGenJS was that every document format required a completely different library with a completely different API. A SaaS platform that generates investor decks (PPTX), contracts (DOCX), financial reports (PDF), and data exports (XLSX) would need four separate libraries, four separate codepaths, and four separate sets of data bindings. PaperJSX eliminates that by targeting all four formats from one schema.
The declarative JSON model also makes PaperJSX natively compatible with AI agents. An LLM can generate a document by producing JSON — no library-specific API knowledge required. PaperJSX ships an MCP server for direct integration with Claude, Cursor, and custom LLM pipelines.
Chart support: the critical differentiator
Charts are the single most contentious feature across PowerPoint generation libraries. The distinction between "chart support" and "native editable chart support" matters enormously — a chart rendered as an image cannot be edited by the recipient in PowerPoint, while a native chart preserves full data editability.
| Chart type | python-pptx | PptxGenJS | PaperJSX |
|---|---|---|---|
| Bar / column | Yes | Yes | Yes |
| Line | Yes | Yes | Yes |
| Pie | Yes | Yes | Yes |
| Scatter / XY | Yes | Yes | Yes |
| Area | Yes | Yes | Yes |
| Doughnut | Yes | Yes | Planned |
| Radar | Yes | Yes | Planned |
| Bubble | Yes | Yes | Planned |
| Combo (bar + line) | No | Yes | Yes (Pro) |
| 3D charts | No | Yes | Planned |
| Waterfall / treemap | No | No | Planned |
| Editable by recipient | Yes | Yes | Yes |
The combo chart gap in python-pptx is the most consequential missing feature across all three libraries. According to the python-pptx chart documentation, "python-pptx doesn't yet support creating multi-plot charts" — a statement unchanged since 2017. Developers who need a bar-and-line overlay in a generated slide cannot use python-pptx without resorting to fragile XML hacking.
PptxGenJS explicitly supports combo charts. According to PptxGenJS's chart documentation, "charts of almost any type can be added to slides, including combo and 3D charts."
Code comparison: the same slide, three ways
The task: generate a slide with a title and a clustered bar chart showing three data points.
from pptx import Presentation
from pptx.chart.data import ChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6])
# add title
txBox = slide.shapes.add_textbox(
Inches(1), Inches(0.5), Inches(8), Inches(0.8)
)
txBox.text_frame.text = "Q3 revenue by region"
# add chart
chart_data = ChartData()
chart_data.categories = ["NA", "EMEA", "APAC"]
chart_data.add_series("Revenue", (4200, 3100, 2800))
slide.shapes.add_chart(
XL_CHART_TYPE.COLUMN_CLUSTERED,
Inches(1), Inches(1.5), Inches(8), Inches(4.5),
chart_data
)
prs.save("report.pptx")
import pptxgen from "pptxgenjs";
const pres = new pptxgen();
const slide = pres.addSlide();
slide.addText("Q3 revenue by region", {
x: 1, y: 0.5, w: 8, h: 0.8,
fontSize: 24, bold: true
});
slide.addChart(pres.ChartType.bar, [
{
name: "Revenue",
labels: ["NA", "EMEA", "APAC"],
values: [4200, 3100, 2800]
}
], { x: 1, y: 1.5, w: 8, h: 4.5 });
await pres.writeFile({ fileName: "report.pptx" });
import { generate } from "@paperjsx/json-to-pptx";
const doc = {
slides: [{
elements: [
{
type: "text",
value: "Q3 revenue by region",
style: { fontSize: 24, bold: true }
},
{
type: "chart",
chartType: "bar",
data: {
categories: ["NA", "EMEA", "APAC"],
series: [{ name: "Revenue", values: [4200, 3100, 2800] }]
}
}
]
}]
};
const buffer = await generate(doc);
writeFileSync("report.pptx", buffer);
All three approaches produce a valid PPTX file with a native editable chart. The key difference is the input model: python-pptx and PptxGenJS require imperative method calls, while PaperJSX takes a JSON object. The JSON model has a distinct advantage for AI-generated documents — an LLM produces structured data, not method call sequences.
PptxGenJS's data structure is closest to PaperJSX's JSON approach (both use label/value arrays), while python-pptx's ChartData object requires calling add_series() imperatively. For simple slides, the ergonomic differences are minor. They compound at scale — a 30-slide investor deck with mixed chart types, data tables, and conditional layouts becomes significantly more maintainable as a JSON definition than as a sequence of imperative calls.
Maintenance and long-term risk
The maintenance question is the most practical concern for teams choosing a PPTX library in 2026. python-pptx's inactivity creates tangible risk: no bug fixes, no security patches, and no compatibility updates for future Python versions. The library's sole maintainer has not interacted with the repository since 2024.
PptxGenJS is actively maintained by Brent Ely, with the v4.0.1 release in June 2025 fixing several repair dialog issues. However, it is primarily a single-maintainer project. According to the v4.0 release notes, the library dropped IE11 support and rewrote table auto-paging from scratch — both signs of active, opinionated development.
PaperJSX uses an open-core model: the Apache-2.0 lite engines are open for audit and contribution, while advanced Pro features are commercially supported. This model aligns incentives — commercial revenue funds ongoing development, and the open core keeps baseline generation available without vendor lock-in.
When to choose python-pptx
- Your stack is Python and you cannot introduce a Node.js dependency. python-pptx remains the only mature Python-native PPTX generator.
- You need to read and modify existing PPTX files. python-pptx can open, parse, and modify slides in existing presentations. PptxGenJS and PaperJSX generate new files from scratch.
- Your chart needs are basic. If you only need bar, line, pie, and scatter charts — and never combo charts — python-pptx covers those cases adequately.
- You accept the maintenance risk. For internal tools or scripts where long-term support is not critical, python-pptx's inactive status may be acceptable.
When to choose PptxGenJS
- You need browser-side generation. PptxGenJS is the only library that generates PPTX directly in the browser, making it the right choice for client-side export features in web applications.
- You need the widest chart type support. PptxGenJS supports combo charts, 3D charts, and more chart configuration options than any other open-source PPTX library.
- You want a fully free, MIT-licensed solution with no commercial tiers and proven community adoption (~4.6M weekly downloads as of July 2026).
- You need HTML-to-PPTX conversion. PptxGenJS's
tableToSlides()function is a unique feature with no equivalent in the other libraries.
When to choose PaperJSX
- You need multiple output formats. If the same data needs to render as PPTX, PDF, DOCX, and XLSX, PaperJSX is the only library that handles all four from a single JSON definition. The alternative is maintaining four separate libraries with four separate codepaths.
- You're building AI agent workflows. PaperJSX's JSON-in, document-out model and MCP server are purpose-built for LLM-driven document generation. Neither python-pptx nor PptxGenJS has an AI integration path.
- You need slide animations. PaperJSX Pro supports slide transitions and element animations. PptxGenJS explicitly excludes animations from its roadmap. python-pptx does not support them.
- You want a declarative, data-driven approach. If your documents are generated from database queries or API responses, a JSON schema that describes the entire document is simpler to generate, test, version, and debug than imperative method call sequences.
