跳转到内容

导出与打印 ​

Svelte 查看器可以将幻灯片转换为多种格式,也可以将文档保存回 .pptx。所有功能都能通过内置工具栏的导出菜单使用,带有进度弹窗和取消操作;也可以通过组件实例编程调用。

支持的格式 ​

格式处理流程
PNGhtml2canvas-pro 栅格化,首次使用时动态导入
PDFjspdf(动态导入)加栅格化,生成多页文档,每页一张幻灯片
GIF对栅格化图像帧使用动态 GIF 帧编码器
WebM对画布捕获流使用 MediaRecorder,编码格式从共享的 WebM 候选列表中选择
SVG通过独立函数直接从解析后的数据模型导出矢量图,不进行栅格化
打印在隐藏的同源 iframe 中打开共享打印文档,支持幻灯片、讲义、备注和大纲
JSON核心模型序列化器 exportToJson,生成可完整重新导入的可移植 JSON 文档
PPTX通过 save(format)、downloadAs、downloadPptx 使用核心序列化器('pptx' | 'ppsx' | 'pptm')

延迟加载依赖

html2canvas-pro 和 jspdf 采用动态导入,首次栅格图或 PDF 导出有一次性加载开销;从不导出的应用不会将它们发送到客户端。

栅格图与视频导出 ​

所有方法都位于组件实例上,通过 bind:this 获取:

svelte
<script lang="ts">
	import { PowerPointViewer, type PowerPointViewerApi } from 'pptx-svelte-viewer';

	let { bytes }: { bytes: Uint8Array } = $props();
	let viewer = $state<PowerPointViewerApi>();
	let progress = $state('');

	async function exportPdf() {
		await viewer?.exportPdf({
			onProgress: (current, total) => (progress = `${current}/${total}`),
		});
	}
</script>

<PowerPointViewer source={bytes} bind:this={viewer} />
<button onclick={() => viewer?.exportSlidePng()}>PNG (current slide)</button>
<button onclick={() => viewer?.copySlideAsImage()}>Copy as image</button>
<button onclick={exportPdf}>PDF {progress}</button>

ExportPdfOptions ​

选项类型默认值说明
onProgress(current: number, total: number) => void-捕获阶段进度回调。
signalAbortSignal-提前中止导出,在幻灯片之间检查。

ExportGifOptions ​

选项类型默认值说明
slideDurationMsnumber2000每张幻灯片的显示时长。
slideTimingsMsnumber[]-逐张覆盖显示时长,索引与幻灯片索引对应。
maxDimensionnumber960允许的输出最长边,单位为像素;帧按比例缩小。
onProgress(current: number, total: number) => void-捕获阶段进度回调。
signalAbortSignal-提前中止导出。

ExportVideoOptions ​

选项类型默认值说明
slideDurationMsnumber3000每张幻灯片的显示时长。
slideTimingsMsnumber[]-逐张覆盖幻灯片时长。
fpsnumber30录制帧率。
videoBitsPerSecondnumber5_000_000录制码率。
onProgress(current: number, total: number) => void-捕获阶段进度回调。
onRecordProgress(current: number, total: number) => void-录制阶段进度回调。
signalAbortSignal-在幻灯片之间和图像帧之间检查中止。

renderToCanvas ​

从包根入口导出的独立工具,无需组件实例,可将任意 DOM 元素栅格化到 Canvas:

ts
import { renderToCanvas } from 'pptx-svelte-viewer';

const canvas: HTMLCanvasElement = await renderToCanvas(element, { scale: 2 });
const dataUrl = canvas.toDataURL('image/png');
ts
function renderToCanvas(
	element: HTMLElement,
	options?: Partial<Html2CanvasOptions>, // the html2canvas-pro Options type
): Promise<HTMLCanvasElement>;

这是 React、Vue、Angular 和原生 JavaScript 绑定也导出的同一个 html2canvas-pro 包装函数。建议使用它,不要直接调用 html2canvas:它在 onclone 阶段执行共享 CSS 预处理,将现代颜色函数(oklch / oklab / lch / lab / color())转换为 sRGB,并展平处理 backdrop-filter、mix-blend-mode 和 CSS 三维变换。查看器主题令牌使用 oklch,html2canvas 本身无法解析。

打印 ​

print(options) 组装共享打印文档并打开浏览器打印对话框。默认打印载体是隐藏的同源 iframe,不涉及弹出窗口。打印载体打开后,Promise 解析为 true。

ts
await viewer?.print({ printWhat: 'handouts', slidesPerPage: 6, colorMode: 'grayscale' });
await viewer?.print({
	printWhat: 'slides',
	slideRange: 'custom',
	customRangeFrom: 2,
	customRangeTo: 5,
});

PrintOptions 可以是共享打印设置的任意子集:

选项类型默认值说明
printWhat'slides' | 'handouts' | 'notes' | 'outline''slides'打印内容。
orientation'landscape' | 'portrait''landscape'页面方向。
colorMode'color' | 'grayscale' | 'blackAndWhite''color'颜色处理方式。
frameSlidesbooleanfalse在每张幻灯片周围绘制边框。
slidesPerPage讲义每页幻灯片数量6讲义布局密度。
slideRange'all' | 'current' | 'custom''all'要包含的幻灯片。
customRangeFromnumber1自定义范围起点,从 1 开始。
customRangeTonumber1自定义范围终点,从 1 开始。

弹窗拦截器

默认 iframe 载体不受弹窗拦截器影响。在控制器层注入自定义的 window.open 打开方式时则可能被拦截,被拦截后 Promise 解析为 false。

保存文档 ​

方法签名说明
save(format?: PptxSaveFormat) => Promise<Uint8Array>通过核心处理器序列化幻灯片,包括编辑后的内容。
getContent() => Promise<Uint8Array>共享查看器约定中 save() 的别名。
downloadAs(format: PptxSaveFormat, fileName?: string) => Promise<void>保存并以 pptx、ppsx 或 pptm 格式触发浏览器下载。
downloadPptx(fileName?: string) => Promise<void>保存并使用默认名称下载 .pptx。
packageForSharing(fileName?: string) => Promise<void>组装并下载共享包。

SVG:独立函数 ​

SVG 导出直接从解析后的数据模型生成矢量输出,以普通函数形式从包根入口导出,无需组件实例:

ts
import { exportSlideToSvg, exportSlideToSvgBlob, exportSlideAsSvg } from 'pptx-svelte-viewer';
函数签名返回值
exportSlideToSvg(slide, width, height, options?)SVG 标记 string
exportSlideToSvgBlob(slide, width, height, options?)Blob (image/svg+xml)
exportSlideAsSvg(slide, slideIndex, width, height, options?)触发下载
exportAllSlidesToSvg(data, options?)string[]
exportAllSlidesToSvgBlobs(data, options?)Blob[]

slide 是 PptxSlide,可以从实例的 getSlides() / getActiveSlide() 获取;width / height 是 onload 载荷中以像素表示的画布尺寸。exportAll* 变体接受来自 pptx-viewer-core 处理器的完整解析结果 PptxData。

选项(SvgExportSingleSlideOptions / SvgExportAllOptions):

选项类型默认值说明
includeHiddenbooleanfalse批量导出时包含隐藏页。
slideIndicesnumber[]全部要导出的幻灯片索引,从 0 开始。
defaultFontFamilystring-元素未指定字体族时使用的回退字体。
defaultFontSizenumber-回退字号,单位为磅。
ts
const slide = viewer?.getActiveSlide();
if (slide) {
	const svg = exportSlideToSvg(slide, canvasSize.width, canvasSize.height);
	// e.g. inline it, upload it, or hand it to a design tool
}

导出流程的限制 ​

栅格导出受 html2canvas-pro 的限制,参见已知限制:部分 CSS 功能(backdrop-filter、CSS 三维变换)在捕获时会损失保真度,mix-blend-mode 采用近似实现,画布尺寸受浏览器上限约束,从而限制导出分辨率。SVG 流程完全避开栅格化,但覆盖的是数据模型,无法复现任意 DOM 样式。

基于 Apache-2.0 许可证发布