演示文稿发给外部时,PPT 的版式依赖对方机器上的 Office 和字体,实际打开常常走形。转成 PDF 后版式就固定了。桌面软件能手动另存为 PDF,却接不进 Web 系统的批量流程。放到服务端转换,文件又得先传出去。
本文介绍用 Spire.Presentation for JavaScript 将 PowerPoint 转换为 PDF,覆盖整份演示文稿与指定幻灯片两种输出。它基于 WebAssembly 在浏览器端加载、转换与保存文件,全过程在本地完成,通过虚拟文件系统(VFS)读写,不需要后端配合。
本文介绍两个核心功能点:
有关安装和项目配置,请参考 React 项目中集成 Spire.Presentation for JavaScript。下面的示例假定 Spire.Presentation 已安装、WebAssembly 模块已初始化。
将 PowerPoint 转换为 PDF
Spire.Presentation for JavaScript 提供 Presentation.SaveToFile() 方法,用于把整份演示文稿转换为 PDF。fileFormat 取 FileFormat.PDF,转换按幻灯片顺序逐页输出。
具体操作步骤如下:
- 获取 Spire.Presentation 的 WASM 模块,确认已就绪。
- 读入示例演示文稿与字体,创建
Presentation对象并加载该文件。 - 使用
Presentation.SaveToFile()方法,将fileFormat设为FileFormat.PDF,保存为 PDF 文件。 - 从 VFS 读出结果文件并触发浏览器下载。
将 PowerPoint 转换为 PDF 的代码如下:
function App() {
const convertToPdf = async () => {
// 获取 Spire.Presentation WASM 模块
const pptModule = window.wasmModule?.spirepresentation;
// 检查模块是否就绪
if (!pptModule) {
alert('Spire.Presentation is not ready yet');
return;
}
// 载入示例演示文稿与字体
await window.spire.FetchFileToVFS('数据简报.pptx', "", `${process.env.PUBLIC_URL}/data/`);
await window.spire.FetchFileToVFS('ARIALUNI.TTF', "/Library/Fonts/", `${process.env.PUBLIC_URL}/font/`);
// 创建 Presentation 实例并加载演示文稿
const ppt = new pptModule.Presentation();
ppt.LoadFromFile('数据简报.pptx');
// 将整份演示文稿保存为 PDF
const outputFileName = '转换结果.pdf';
ppt.SaveToFile({ file: outputFileName, fileFormat: pptModule.FileFormat.PDF });
ppt.Dispose();
// 从 VFS 读取生成的文件,触发下载
const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([fileArray], { type: 'application/pdf' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = outputFileName;
a.click();
URL.revokeObjectURL(url);
};
return (
<div style={{ textAlign: 'center', height: '300px' }}>
<h1>将 PowerPoint 转换为 PDF</h1>
<button onClick={convertToPdf}>
转换为 PDF
</button>
</div>
);
}
export default App;
整份演示文稿转换后的 PDF 文件:

将指定幻灯片转换为 PDF
Slide.SaveToFile() 只处理一张幻灯片,适合把某一页单独发出去或插进别的报告。
具体操作步骤如下:
- 获取 Spire.Presentation 的 WASM 模块,确认已就绪。
- 读入示例演示文稿与字体,创建
Presentation对象并加载该文件。 - 使用
Slides.get_Item()方法取出要转换的幻灯片。 - 使用
Slide.SaveToFile()方法将该幻灯片保存为 PDF。 - 从 VFS 读出结果文件并触发浏览器下载。
将指定幻灯片转换为 PDF 的代码如下:
function App() {
const convertSpecificSlide = async () => {
// 获取 Spire.Presentation WASM 模块
const pptModule = window.wasmModule?.spirepresentation;
// 检查模块是否就绪
if (!pptModule) {
alert('Spire.Presentation is not ready yet');
return;
}
// 载入示例演示文稿与字体
await window.spire.FetchFileToVFS('数据简报.pptx', "", `${process.env.PUBLIC_URL}/data/`);
await window.spire.FetchFileToVFS('ARIALUNI.TTF', "/Library/Fonts/", `${process.env.PUBLIC_URL}/font/`);
// 创建 Presentation 实例并加载演示文稿
const ppt = new pptModule.Presentation();
ppt.LoadFromFile('数据简报.pptx');
// 取出第二张幻灯片,单独保存为 PDF
const slide = ppt.Slides.get_Item(1);
const outputFileName = '第二张幻灯片.pdf';
slide.SaveToFile(outputFileName, pptModule.FileFormat.PDF);
ppt.Dispose();
// 从 VFS 读取生成的文件,触发下载
const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([fileArray], { type: 'application/pdf' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = outputFileName;
a.click();
URL.revokeObjectURL(url);
};
return (
<div style={{ textAlign: 'center', height: '300px' }}>
<h1>将指定幻灯片转换为 PDF</h1>
<button onClick={convertSpecificSlide}>
转换指定幻灯片
</button>
</div>
);
}
export default App;
第二张幻灯片单独转换出的 PDF:

常见问题
转换出来的 PDF 里中文或日文显示成方框怎么办
原因:浏览器端的 WASM 环境找不到演示文稿用到的字体,缺字只能显示成方框。
解决:把字体文件读进 VFS 的 /Library/Fonts/ 目录再转换。示例用 ARIALUNI.TTF 覆盖中日文,其他字体按同样方式补:
// 将字体载入 VFS 的字体目录
await window.spire.FetchFileToVFS('ARIALUNI.TTF', "/Library/Fonts/", `${process.env.PUBLIC_URL}/font/`);
隐藏的幻灯片会一起转换吗
用 Presentation.SaveToPdfOption.ContainHiddenSlides 控制。设为 false 时只输出可见的幻灯片,设为 true 时隐藏页也进入 PDF:
// 不转换隐藏幻灯片
ppt.SaveToPdfOption.ContainHiddenSlides = false;
只想转换其中几页,要一张张导出吗
Slide.SaveToFile() 一次只处理一页,多页就循环取出分别保存。要让它们合进同一个 PDF,先在 Presentation 上删掉不需要的页,再整份转换。
// 每页单独导出一个 PDF
for (let i = 0; i < ppt.Slides.Count; i++) {
ppt.Slides.get_Item(i).SaveToFile(`第${i + 1}页.pdf`, pptModule.FileFormat.PDF);
}
转换后 PDF 的页面尺寸能改吗
PDF 页面按幻灯片的 SlideSize 输出。幻灯片是 16:9,PDF 就是对应的宽幅页面。需要固定纸张尺寸时,转换前设置 SlideSize.Type 与 SlideSize.Orientation:
// 转换前把幻灯片设为 A4 横向
ppt.SlideSize.Type = pptModule.SlideSizeType.A4;
ppt.SlideSize.Orientation = pptModule.SlideOrienation.Landscape;
获取免费许可证
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。







