Skip to content

Imperative Handle

PowerPointViewer is a forwardRef component. Attach a ref typed as PowerPointViewerHandle to call its imperative API.

tsx
import { PowerPointViewer } from 'pptx-react-viewer';
import type { PowerPointViewerHandle } from 'pptx-react-viewer';
import { useRef } from 'react';

function Editor({ content }: { content: Uint8Array }) {
	const ref = useRef<PowerPointViewerHandle>(null);

	async function save() {
		const bytes = await ref.current?.getContent();
		if (bytes) {
			// persist `bytes` (a Uint8Array)
		}
	}

	return (
		<>
			<button onClick={save}>Save</button>
			<button onClick={() => ref.current?.goNext()}>Next Slide</button>
			<button onClick={() => ref.current?.undo()}>Undo</button>
			<PowerPointViewer ref={ref} content={content} canEdit />
		</>
	);
}

Interface

PowerPointViewerHandle extends FileViewerHandle and implements the shared PowerPointViewerAPI contract (defined in pptx-viewer-shared). All three framework bindings (React, Vue, Angular) expose the same API surface.

ts
import type { ViewerMode, PowerPointViewerAPI } from 'pptx-react-viewer';

Methods

Serialization

MethodSignatureDescription
getContent() => Promise<Uint8Array>Serializes the current document to .pptx bytes on demand.
MethodSignatureDescription
goTo(slideIndex: number) => voidNavigate to a specific slide (zero-based).
goPrev() => voidNavigate to the previous slide.
goNext() => voidNavigate to the next slide.

Undo / Redo

MethodSignatureDescription
undo() => voidUndo the last editing action.
redo() => voidRedo the last undone action.
canUndo() => booleanWhether an undo action is available.
canRedo() => booleanWhether a redo action is available.

Zoom

MethodSignatureDescription
getZoom() => numberGet the current zoom level (1 = 100%).
setZoom(level: number) => voidSet the zoom level (clamped to 0.2 - 5.0).
zoomIn() => voidZoom in by one step (10%).
zoomOut() => voidZoom out by one step (10%).
zoomReset() => voidReset zoom to 100%.

Mode

MethodSignatureDescription
getMode() => ViewerModeGet the current viewer mode.
setMode(mode: ViewerMode) => voidSwitch mode ('preview', 'edit', 'present', 'master').

Read-only State

MethodSignatureDescription
getActiveSlideIndex() => numberGet the zero-based active slide index.
setActiveSlideIndex(index: number) => voidSet the active slide (alias of goTo).
getSlideCount() => numberGet the total number of slides.
isDirty() => booleanWhether the document has unsaved changes.

Slide Access

All slide methods return full PptxSlide objects from pptx-viewer-core with complete type information (elements, notes, transitions, animations, etc.).

MethodSignatureDescription
getSlides() => readonly PptxSlide[]Get all slides in the deck.
getSlide(index: number) => PptxSlide | undefinedGet a slide by zero-based index.
getActiveSlide() => PptxSlide | undefinedGet the currently active slide.

Slide Manipulation

MethodSignatureDescription
addSlide(afterIndex?: number) => voidAdd a blank slide (after active by default).
deleteSlides(indexes: number[]) => voidDelete slides at indexes (keeps at least one).
duplicateSlides(indexes: number[]) => voidDuplicate slides at indexes.
moveSlide(from: number, to: number) => voidMove a slide from one position to another.
toggleHideSlides(indexes: number[]) => voidToggle the hidden flag on slides.

Element Access

All element methods return full PptxElement objects (discriminated union of text, shape, image, table, chart, connector, group, etc.) with complete type-specific properties.

MethodSignatureDescription
getElements(slideIndex?: number) => readonly PptxElement[]Get elements (active slide by default).
getElementById(id: string, slideIndex?: number) => PptxElement | undefinedGet element by ID.

Element Manipulation

MethodSignatureDescription
updateElement(id: string, updates: Partial<PptxElement>) => voidPatch element properties.
deleteElements(ids: string[]) => voidDelete elements by ID.
duplicateElement(id: string) => string | undefinedDuplicate; returns new element ID.

Selection

MethodSignatureDescription
getSelectedElementIds() => string[]Get IDs of currently selected elements.
selectElements(ids: string[]) => voidProgrammatically select elements by ID.
clearSelection() => voidClear the current selection.

Example: external controls

tsx
function Toolbar({ viewerRef }: { viewerRef: React.RefObject<PowerPointViewerHandle> }) {
	const slide = viewerRef.current?.getActiveSlide();

	return (
		<div>
			<button onClick={() => viewerRef.current?.goPrev()}>Prev</button>
			<button onClick={() => viewerRef.current?.goNext()}>Next</button>
			<span>Slide {(viewerRef.current?.getActiveSlideIndex() ?? 0) + 1}</span>
			<span>{slide?.elements.length} elements</span>
			<button onClick={() => viewerRef.current?.zoomIn()}>Zoom In</button>
			<button onClick={() => viewerRef.current?.zoomOut()}>Zoom Out</button>
			<button onClick={() => viewerRef.current?.undo()} disabled={!viewerRef.current?.canUndo()}>
				Undo
			</button>
			<button onClick={() => viewerRef.current?.addSlide()}>Add Slide</button>
		</div>
	);
}

Example: reading slide data

tsx
function SlideInspector({ viewerRef }: { viewerRef: React.RefObject<PowerPointViewerHandle> }) {
	const slides = viewerRef.current?.getSlides() ?? [];

	return (
		<ul>
			{slides.map((slide, i) => (
				<li key={slide.id}>
					Slide {i + 1}: {slide.elements.length} elements
					{slide.hidden && ' (hidden)'}
				</li>
			))}
		</ul>
	);
}

getContent vs onContentChange

getContent() is a pull API: serialize on demand, e.g. when a Save button is clicked. onContentChange is a push callback that fires with fresh bytes as the document changes. Use whichever fits your save model; they return equivalent Uint8Array content.

Released under the Apache-2.0 License.