跳转到内容

快速开始 ​

本页介绍四种常见的完整操作流程。每个示例都独立使用项目的公共 API。更详细的参考文档见下一步。

1. 从零创建演示文稿 ​

使用 PptxHandler.create() 创建演示文稿,通过链式幻灯片构建器添加内容,再调用 save() 保存为字节数据。

ts
import { PptxHandler } from 'pptx-viewer-core';
import { writeFile } from 'node:fs/promises';

const { handler, data, createSlide } = await PptxHandler.create({
	title: 'My Presentation',
	creator: 'Author Name',
	theme: {
		name: 'Custom Theme',
		colors: { accent1: '4472C4', accent2: 'ED7D31' },
		fonts: { majorFont: 'Calibri Light', minorFont: 'Calibri' },
	},
});

// Build a slide with the fluent API
const slide = createSlide()
	.addText('Hello World', { x: 100, y: 100, width: 600, height: 80, fontSize: 36 })
	.addShape('rect', { x: 100, y: 250, width: 300, height: 200 })
	.addImage('https://example.com/photo.jpg', { x: 450, y: 250, width: 300, height: 200 })
	.build();

data.slides.push(slide);

// Save to .pptx (returns a Uint8Array)
const output = await handler.save(data.slides);
await writeFile('presentation.pptx', output);

2. 解析并编辑已有演示文稿 ​

创建 PptxHandler,调用 load() 加载 ArrayBuffer,遍历并修改数据模型,最后调用 save()。

ts
import { PptxHandler } from 'pptx-viewer-core';
import { readFile, writeFile } from 'node:fs/promises';

const handler = new PptxHandler();
const buffer = await readFile('presentation.pptx');
const data = await handler.load(
	buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength),
);

console.log(`Loaded ${data.slides.length} slides`);
console.log(`Theme: ${data.theme?.name}`);

// Access slide content - narrow on the `type` discriminant
for (const slide of data.slides) {
	for (const element of slide.elements) {
		if (element.type === 'text') {
			console.log(`Text: ${element.text}`);
		}
	}
}

// Modify and save
data.slides[0].elements[0].text = 'Updated Title';
const output = await handler.save(data.slides);
await writeFile('output.pptx', output);

缩小元素类型范围

slide.elements 是由 PptxElement 可辨识联合类型组成的数组。访问特定元素类型的字段前,始终先检查 element.type。

3. 转换为 Markdown ​

PptxMarkdownConverter 将解析后的 PptxData 转换为 Markdown,也可以按需将媒体文件提取到指定目录。

ts
import { PptxHandler, PptxMarkdownConverter } from 'pptx-viewer-core';
import { readFile } from 'node:fs/promises';

const handler = new PptxHandler();
const buffer = await readFile('presentation.pptx');
const data = await handler.load(
	buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength),
);

const converter = new PptxMarkdownConverter('./output', {
	sourceName: 'presentation.pptx',
	includeSpeakerNotes: true,
	mediaFolderName: 'media',
	includeMetadata: true,
	semanticMode: true, // Clean markdown vs positioned HTML
});

const markdown = await converter.convert(data);
console.log(markdown);

4. 使用 React 组件显示幻灯片 ​

PowerPointViewer 从 Uint8Array 读取演示文稿,支持启用编辑模式。演示文稿发生编辑时,onContentChange 回调会接收重新序列化后的 .pptx 字节数据。

包含功能区、缩略图和属性面板的可编辑预览界面

tsx
import { useState } from 'react';
import { PowerPointViewer } from 'pptx-react-viewer/viewer';

function App() {
	const [content, setContent] = useState<Uint8Array>();

	if (!content) return null;

	return (
		<PowerPointViewer
			content={content}
			canEdit
			onContentChange={(bytes) => {
				// `bytes` is the updated .pptx as a Uint8Array
				setContent(bytes);
			}}
		/>
	);
}

提示

完整的属性说明见组件属性,该参考文档与源码接口对应。组件接收 Uint8Array 类型的内容(不是 ArrayBuffer),onContentChange 返回序列化后的字节数据,而不是表示未保存修改的布尔值。

如果你使用 Vue、Angular、Svelte 或原生 JavaScript,可以查看 Vue、Angular、Svelte 或原生 JavaScript 的接入指南。

下一步 ​

基于 Apache-2.0 许可证发布