Skip to content

Limitations

Read this before adopting

pptx-viewer covers a large surface of the OpenXML specification, but some things are approximated, read-only, or bounded by the browser platform. This page lists what you cannot do, or can only do partially.

Core engine (pptx-viewer-core)

FeatureStatusNotes
Legacy binary .pptNot supportedload() rejects non-ZIP input with an explicit error ("Legacy .ppt is not supported."). Convert to .pptx first.
OLE objectsRead-onlyEmbedded Excel/Word/PDF/Visio content renders as its preview image; the embedded file can be downloaded or opened in a new tab, but not edited in place: a browser cannot run the native application that owns the object.
SmartArt layoutApproximate without cached drawingDiagrams are decomposed into positioned shapes. When the file carries PowerPoint's own pre-computed drawing part, that exact layout is used; otherwise an algorithmic layout engine approximates it, so complex custom layouts may not match PowerPoint pixel-for-pixel.
EncryptionDecrypt both schemes, encrypt Agile onlyDecryption handles ECMA-376 Standard (Office 2007) and Agile (Office 2010+) encryption. Encryption writes the Agile scheme with AES-128 or AES-256 (the default).
Element coordinatesRounded to whole pixelsPositions and sizes are converted from EMU to pixels (9,525 EMU per pixel) and rounded on load, so sub-pixel EMU offsets are quantized. Presentation-level dimensions keep their exact EMU values (widthEmu / heightEmu).
Archive sizeGuarded, configurableLoading enforces a zip-bomb guard: 500 MiB total uncompressed budget by default (raise it via the maxUncompressedBytes load option) and a hard cap of 65,536 archive entries. Exceeding either throws ZipBombError.

What does round-trip

Everything else survives load, edit, and save: SmartArt text and structural edits, chart data and formatting, animations, unknown vendor extensions (preserved verbatim), VBA macros, embedded fonts, and Strict OOXML files (normalised to Transitional on load, converted back to Strict on save by default). See OpenXML conformance.

Detecting gaps at runtime

You do not have to guess whether a file hit a limitation. The load pipeline reports every unsupported or approximated construct it encounters on data.warnings, typed as PptxCompatibilityWarning:

ts
interface PptxCompatibilityWarning {
	code: string; // stable machine-readable code
	message: string;
	severity: 'info' | 'warning';
	scope: 'presentation' | 'slide' | 'element' | 'save';
	slideId?: string; // present for slide/element-scoped warnings
	elementId?: string;
	xmlPath?: string; // where in the package the construct lives
}

Check data.warnings after load() (and after save()) if your application needs to surface fidelity notices to users or gate features per file.

Runtime environments

EnvironmentWorksCaveats
BrowserYesThe full feature set: parsing, rendering, editing, export, collaboration.
Node.js (and serverless)Core onlypptx-viewer-core (load, edit, save, Markdown/SVG conversion, encryption) is DOM-free. The UI bindings, raster export (html2canvas), and EMF/WMF conversion are browser features.
Web WorkerCore onlySame scope as Node.js: the engine has no DOM dependency.

Framework viewers (React, Vue 3, Angular, Svelte 5, Vanilla JS)

CSS-based rendering trades some visual effects for fidelity elsewhere

Slides render as HTML/CSS rather than Canvas, giving sharp text at any zoom, native accessibility, and DOM interactivity. The tradeoff is that a few PowerPoint effects have no exact CSS equivalent and are approximated.

Visual effect approximations

EffectRendered as
backdrop-filter-style effectsSemi-transparent background fallback
Blend modes (mix-blend-mode)Opacity-based fallbacks
3D rotations (rotateX / rotateY)Flattened to 2D
3D extrusion / bevel / contour / material (a:sp3d)CSS box-shadow / filter approximation, not true geometry or lighting; extrusionClr / contourClr colours are honoured
Reflections (a:effectLst reflection)-webkit-box-reflect: renders in Chromium / WebKit only, not Firefox
Soft edges (a:softEdge)SVG alpha-feather filter (feathers the edge, not a whole-element blur)
Path gradientsApproximated as elliptical radial gradients
WordArt envelope warps (inflate / deflate / can / slant / ...)CSS transform approximation; path warps (arch / circle / wave) use true SVG textPath
Cinematic 3-D transitions (cube, flip, rotate, pageCurl, origami, ...)Animated via CSS keyframes (perspective / rotate / curl), not a true 3-D render

Platform-bound behaviour

AreaLimitationNotes
FontsBrowser font availabilityText uses fonts available in the browser; missing fonts fall back to system defaults, which can shift text metrics and layout. Fonts embedded in the PPTX are injected when present.
Media codecsBrowser codec supportAudio/video playback depends on the browser (WMV and legacy codecs may not play); DRM-protected media will not play.
Morph transitionsPartialElements with no counterpart on the next slide crossfade instead of morphing.
Chart direct manipulationVaries by chart kindBar, line, scatter, and bubble marks can be dragged to new values on the canvas (click a mark to select, double-click the title to rename). Pie, radar, and stacked marks are click-to-select with values edited in the inspector. Map and 3D surface charts render as static SVG.
Raster exporthtml2canvas fidelityPNG/JPEG/PDF export rasterizes the DOM through html2canvas, which cannot reproduce backdrop-filter, CSS custom properties, or CSS 3D transforms; approximations are applied and some fidelity is lost. Use the SVG export for a vector alternative.
Export resolutionBrowser canvas capCanvas exports are capped by the browser's maximum canvas size (typically 16,384 or 32,768 pixels per side).
Small screensDense panels need spaceThe UI adapts down to ~360px phones, but the most data-dense panels (for example the full chart editor) are best used on a tablet or larger.

EMF/WMF metafiles (emf-converter dependency)

Canvas API required

Metafile conversion needs OffscreenCanvas or HTMLCanvasElement. Pure Node.js without a canvas polyfill is not supported for EMF/WMF images (the rest of the core engine runs fine in Node).

FeatureStatusNotes
Gradient brushesSimplifiedGDI+ linear and path gradients render with their primary colour only.
Raster operationsNot appliedGDI ROP blending modes (XOR, NOT, AND, ...) are ignored.
ClippingSingle path onlyCombined GDI region operations (union/intersect/exclude) are not supported.
Output sizeClampedOutput is clamped to 4096 x 4096 pixels.
TextBrowser font engineGlyph metrics can differ from Windows GDI.

Released under the Apache-2.0 License.