html-to-pptx
v1.1.0
Published
Convert page elements to pptx. See README for more details.
Maintainers
Readme
HTML to PPTX
一个强大的前端库,用于将 HTML DOM 元素转换为可编辑的 PowerPoint (.pptx) 文件。
它不仅仅是截图,而是将 HTML 元素解析为原生的 PPT 形状、文本框、表格和图表,因此生成的 PPT 是清晰且可编辑的。
✨ 特性
- 所见即所得:基于 DOM 的
getBoundingClientRect计算坐标,高度还原网页布局。 - 可编辑文本:HTML 文本会被转换为独立的 PPT 文本框,支持字体、颜色、字号、加粗、斜体、下划线等样式。
- 原生表格:
<table>标签会被转换为 PPT 的原生表格,支持合并单元格 (rowspan/colspan)。 - 原生图表支持:通过
data-属性配置,可以将 HTML 元素渲染为可编辑的 PPT 图表。 - 动画支持:支持 CSS 动画(如
fadeIn,slideInUp)映射到 PPT 动画,也支持自定义动画属性。 - 样式还原:支持背景色、背景图、边框、圆角(自动识别矩形/圆角矩形/椭圆)、透明度、旋转角度等。
- 多页支持:通过指定类名,自动分割多页 PPT。
- Canvas & 图片:自动处理
<img>和<canvas>元素。
📦 安装
npm install html-to-pptx
# 或者
yarn add html-to-pptx注意:本项目依赖
pptxgenjs作为底层生成引擎。
🚀 快速开始
1. 准备 HTML 结构
在你的页面中,将每一页 PPT 的内容包裹在一个容器中,并赋予一个统一的类名(例如 h-ppt-page)。
<!-- 第一页 -->
<div
class="h-ppt-page"
style="width: 1000px; height: 562.5px; position: relative; background: white;"
>
<h1 style="color: red;">Hello World</h1>
<p style="font-size: 20px;">这是一个示例文本。</p>
</div>
<!-- 第二页 -->
<div
class="h-ppt-page"
style="width: 1000px; height: 562.5px; position: relative;"
>
<img src="image.png" />
</div>建议:为了获得最佳效果,建议将容器宽高比设置为 16:9 (例如 1000px * 562.5px),因为插件默认输出 16:9 的幻灯片。
2. 调用导出函数
在你的 JavaScript/TypeScript 代码中:
import { downloadHtmlToPpt } from "html-to-pptx";
const handleExport = async () => {
try {
// 传入类名和文件名
await downloadHtmlToPpt("h-ppt-page", "我的演示文稿");
console.log("下载成功!");
} catch (error) {
console.error("导出失败", error);
}
};📚 API 文档
downloadHtmlToPpt(pageClassName, fileName)
直接在浏览器中触发 PPT 文件下载。
| 参数 | 类型 | 默认值 | 描述 |
| :-------------- | :-------------- | :--------------- | :---------------------------------- |
| pageClassName | string | "page" | 标识每一页 PPT 的 DOM 类名 |
| fileName | string | "presentation" | 下载的文件名(不需要加 .pptx 后缀) |
| 返回 | Promise<void> | - | - |
exportHtmlToPpt(pageClassName, outputType)
生成 PPT 数据流,不自动下载,适合需要上传到服务器或自定义处理的场景。
| 参数 | 类型 | 默认值 | 描述 |
| :-------------- | :------------------------------- | :------- | :----------------------------------------------------------------- |
| pageClassName | string | "page" | 标识每一页 PPT 的 DOM 类名 |
| outputType | string | "blob" | 输出类型: "arraybuffer", "base64", "blob", "uint8array" 等 |
| 返回 | Promise<Blob \| string \| ...> | - | 返回对应格式的文件数据 |
🎨 高级功能
1. 原生图表 (Native Charts)
你可以通过在 DOM 元素上添加 data-pptx-chart-config 属性,让插件在 PPT 中生成可编辑的图表,而不是截图。
该属性的值必须是一个符合 JSON 格式的字符串,包含 type, data, 和 options。
<div
style="width: 400px; height: 300px;"
data-pptx-chart-config='{
"type": "bar",
"data": [
{
"name": "Series 1",
"labels": ["Category 1", "Category 2"],
"values": [10, 20]
}
],
"options": {
"chartColors": ["FF0000"]
}
}'
>
<!-- 这里可以放一个普通的 img 或 canvas 用于网页展示,PPT 导出时会被替换为原生图表 -->
</div>2. 动画支持 (Animations)
插件支持两种方式添加动画:
方式 A: 自动识别 CSS 动画
插件会自动解析元素的 animation-name 并映射到 PPT 动画。
支持的 CSS 动画名包括:fadeIn, fadeInUp, slideInUp, zoomIn, bounceIn 等。
方式 B: 使用 data- 属性(推荐)
显式指定 PPT 动画类型、持续时间和延迟。
<div
data-pptx-animation="flyInBottom"
data-pptx-duration="1500"
data-pptx-delay="500"
>
从底部飞入的文本
</div>data-pptx-animation: 动画类型 (参考 PptxGenJS 文档)data-pptx-duration: 持续时间 (毫秒)data-pptx-delay: 延迟时间 (毫秒)
3. 忽略元素
如果你希望某个元素在网页显示,但在导出 PPT 时被忽略,可以添加 data-html2pptx-ignore 属性(需在样式中配合 display: none 或在代码逻辑中自行扩展,目前核心代码逻辑会忽略 display: none, visibility: hidden, opacity: 0 的元素)。
⚠️ 注意事项 & 限制
- CORS 跨域图片:如果页面包含跨域图片(
<img>),请确保服务器配置了正确的 CORS 头,或者图片允许跨域访问,否则可能无法生成到 PPT 中。 - 布局依赖:插件通过
getBoundingClientRect计算位置。请确保在调用导出函数时,DOM 元素是可见的且已渲染。如果在display: none的容器中进行转换,坐标计算将失败。 - CSS 支持:虽然支持大部分常用 CSS,但复杂的 CSS 布局(如复杂的伪元素、复杂的
clip-path、滤镜等)可能无法完美还原,建议使用简单的 Flex/Grid/Absolute 布局。 - 字体:PPT 文件中引用的字体取决于用户系统是否安装了该字体。插件默认设置了 fallback 字体。
🛠 开发与贡献
欢迎提交 Issue 或 Pull Request 来改进此项目!
📄 License
MIT
