Nearly every PDF-to-PowerPoint converter gives you the same thing: a deck where each slide is a picture of a page. It looks right and it's useless — you can't fix a typo, retitle a section, or reuse a paragraph. This one rebuilds the text as text.
Pictures of slides vs. slides
The difference shows up the moment you click. A flattened deck gives you one image object per slide. Ours gives you a text box for every text element in the source, each carrying its own font family, size, colour, alignment, and rotation. Open it in PowerPoint and the text has a cursor.
Everything else is mapped rather than flattened too: images become embedded picture objects, simple shapes become native PowerPoint shapes, and only the parts PowerPoint genuinely cannot express — gradients, complex vector figures, filtered images — get rasterised, individually and at 2× supersampling.
How the conversion works
The PDF is parsed with @polotno/pdf-import, which walks the PDF operator stream using Mozilla's pdf.js and recovers text as text, shapes as paths, and embedded images as images. Each page becomes a Polotno design.
That design is then handed to @polotno/pptx-export, the same package SDK customers use, which walks the element tree and writes a real .pptx: one slide per page, text as text boxes with PowerPoint's native autofit, images as pictures, shapes as shapes. It runs entirely in your browser.
Where it works well, and where it doesn't
Vector PDFs from InDesign, Illustrator, Figma, or an export from another slide tool convert cleanly — the text layer is real, so it comes back real. Scanned PDFs are images with no text data at all, so those produce slides holding the page image and no text boxes; run OCR first if you need editable text out of a scan. Very heavily styled text with per-character effects will keep its words but lose some of its inline formatting.
The same conversion in code
This page is built on the public SDK, and the whole conversion is two calls:
import { pdfToJson } from "@polotno/pdf-import";
import { jsonToPPTXBlob } from "@polotno/pptx-export/browser";
const buffer = await file.arrayBuffer();
const json = await pdfToJson({ pdf: buffer });
// Straight to PowerPoint - one slide per page, text stays editable.
const blob = await jsonToPPTXBlob(json);
// Or write the file directly (downloads in the browser, writes to
// disk on Node):
// await jsonToPPTX(json, "deck.pptx");Full API reference: PDF Import, PPTX Export, and the Import & Export overview.
