.pptxPresentationMLBeta
PowerPoint in the browser
A fixed canvas, which is why it can get very close.
A slide has no pagination to disagree about: every shape carries absolute coordinates in EMU. That removes the single hardest problem in document rendering, and it is why the presentation renderer is measured against PowerPoint’s own PDF export — ink against ink, not words against words.
sample.pptx
0 requests · nothing uploadedLoading the viewer…
format—statusidleopened in—rendered bythis browser
Everything below is parsed from the file, not approximated
Slides and layouts
The master → layout → slide inheritance chain, placeholders resolved through it, slide size and orientation, speaker notes, and hidden slides.
Shapes and text
Preset geometries, fills, outlines, grouped shapes, text bodies with paragraph and run properties, bullets and autonumbered lists, and text set on its side.
Tables and charts
Table styles with their conditional blocks, and DrawingML charts drawn by the shared @apertura/chart package — the chart part is identical in Word, Excel and PowerPoint, and so is the code that draws it.
Theme
Colour maps and overrides, the theme font slots, and the effect and format schemes shapes refer to.
What we get wrong, published rather than discovered
A viewer that claims perfection loses the deal the moment somebody drops in their worst file. This list is the alternative.
- SmartArt without a cached drawing falls back to the text of its data model.
- WordArt warping (a:prstTxWarp) renders as straight text at the declared size.
- Three-dimensional scenes (a:scene3d, a:sp3d) render flat, in place.
- Animations and transitions are ignored — this is a viewer, not a player.
Found another one?
Send the file. It joins the corpus, which is the difference between a fix and a fix that stays.
The viewer, and the parser on its own
The parser produces a model that knows nothing about CSS or the DOM, so the same call runs in Node for extraction, search and conversion.
import { DocumentViewer } from '@apertura/react';
<DocumentViewer file={file} fit="width" />;