开放接口
线上接口地址:https://docmee.cn (这个是线上正常运行的产品,API对接进入开放平台即可)
SDK
-
iframe ui
github GitHub - veasion/aippt-ui-iframe: UI iframe 接入文多多AiPPT,通过主题/文件/网址等方式生成PPT,支持原生图表、动画、3D特效等复杂PPT的解析和渲染,支持用户自定义模板,支持智能添加动画。AI generates PowerPoint Presentation, Supports parsing and rendering of complex PPT features such as native charts, animations, and 3D effects.
gitee aippt-ui-iframe: UI iframe 接入文多多AiPPT
-
js / html
github GitHub - veasion/aippt-js: js/html 接入文多多AiPPT,通过主题/文件/网址等方式生成PPT,支持原生图表、动画、3D特效等复杂PPT的解析和渲染,支持用户自定义模板,支持智能添加动画。AI generates PowerPoint Presentation, Supports parsing and rendering of complex PPT features such as native charts, animations, and 3D effects.
gitee aippt-js: js/html for aippt demo
-
vue2
github GitHub - veasion/aippt-vue2: Vue2 接入文多多AiPPT,通过主题/文件/网址等方式生成PPT,支持原生图表、动画、3D特效等复杂PPT的解析和渲染,支持用户自定义模板,支持智能添加动画。AI generates PowerPoint Presentation, Supports parsing and rendering of complex PPT features such as native charts, animations, and 3D effects.
gitee aippt-vue2: vue2 for aippt demo
-
vue3
github GitHub - veasion/aippt-vue: Vue3 接入文多多AiPPT,通过主题/文件/网址等方式生成PPT,支持原生图表、动画、3D特效等复杂PPT的解析和渲染,支持用户自定义模板,支持智能添加动画。AI generates PowerPoint Presentation, Supports parsing and rendering of complex PPT features such as native charts, animations, and 3D effects.
gitee aippt-vue: vue3 for aippt demo
-
react
github GitHub - veasion/aippt-react: React 接入文多多AiPPT,通过主题/文件/网址等方式生成PPT,支持原生图表、动画、3D特效等复杂PPT的解析和渲染,支持用户自定义模板,支持智能添加动画。AI generates PowerPoint Presentation, Supports parsing and rendering of complex PPT features such as native charts, animations, and 3D effects.
gitee aippt-react: react for aippt demo
-
java
github GitHub - veasion/aippt-api-java-demo: Java 接入文多多AiPPT,通过主题/文件/网址等方式生成PPT,支持原生图表、动画、3D特效等复杂PPT的解析和渲染,支持用户自定义模板,支持智能添加动画。AI generates PowerPoint Presentation, Supports parsing and rendering of complex PPT features such as native charts, animations, and 3D effects.
gitee aippt-api-java-demo: java for aippt demo
-
python
github GitHub - veasion/aippt-api-python-demo: Python 接入文多多AiPPT,通过主题/文件/网址等方式生成PPT,支持原生图表、动画、3D特效等复杂PPT的解析和渲染,支持用户自定义模板,支持智能添加动画。AI generates PowerPoint Presentation, Supports parsing and rendering of complex PPT features such as native charts, animations, and 3D effects.
gitee aippt-api-python-demo: python for aippt demo
-
go
github GitHub - veasion/aippt-api-go-demo: GoLang 接入文多多AiPPT,通过主题/文件/网址等方式生成PPT,支持原生图表、动画、3D特效等复杂PPT的解析和渲染,支持用户自定义模板,支持智能添加动画。AI generates PowerPoint Presentation, Supports parsing and rendering of complex PPT features such as native charts, animations, and 3D effects.
gitee aippt-api-go-demo: go for aippt demo
-
.net / c#
github GitHub - veasion/aippt-api-dotnet-demo: .NET / C# 接入文多多AiPPT,通过主题/文件/网址等方式生成PPT,支持原生图表、动画、3D特效等复杂PPT的解析和渲染,支持用户自定义模板,支持智能添加动画。AI generates PowerPoint Presentation, Supports parsing and rendering of complex PPT features such as native charts, animations, and 3D effects.
gitee aippt-api-dotnet-demo: .net for aippt demo
-
php
github GitHub - veasion/aippt-api-php-demo: PHP 接入文多多AiPPT,通过主题/文件/网址等方式生成PPT,支持原生图表、动画、3D特效等复杂PPT的解析和渲染,支持用户自定义模板,支持智能添加动画。AI generates PowerPoint Presentation, Supports parsing and rendering of complex PPT features such as native charts, animations, and 3D effects.
gitee aippt-api-php-demo: php for aippt demo
-
c++
github GitHub - veasion/aippt-api-cpp-demo: C++ 接入文多多AiPPT,通过主题/文件/网址等方式生成PPT,支持原生图表、动画、3D特效等复杂PPT的解析和渲染,支持用户自定义模板,支持智能添加动画。AI generates PowerPoint Presentation, Supports parsing and rendering of complex PPT features such as native charts, animations, and 3D effects.
gitee aippt-api-cpp-demo: c++ for aippt demo
接口鉴权
创建接口 token
POST /api/user/createApiToken
请求 header
Api-Key 在开放平台获取 获取API-KEY
请求 body
{
// 用户ID(自定义用户ID,非必填,最大24位,超过会截取后24位)
// 贵司用户ID,不同uid创建的token数据会相互隔离,主要用于数据隔离
"uid": null,
// 限制 token 最大生成PPT次数(数字,为空则不限制,为0时不允许生成PPT,大于0时限制生成PPT次数)
// UI iframe 接入时强烈建议传 limit 参数,避免 token 泄露照成损失!
"limit": null
}
响应 body
{
"data": {
"token": "sk_xxx", // token (调用api接口鉴权用,请求头传token)
"expireTime": 7200 // 过期时间(秒)
},
"code": 0,
"message": "操作成功"
}
请求示例
curl -X POST --location 'https://docmee.cn/api/user/createApiToken' \ --header 'Content-Type: application/json' \ --header 'Api-Key: xxx' \ --data '{"uid": "xxx","limit": 10}'
注意:该接口请在服务端调用,同一个 uid 创建 token 时,之前通过该 uid 创建的 token 会在10秒内过期
场景说明:在UI集成中,为防止 token 滥用,limit 参数可以让第三方集成商维护自己平台用户的使用次数,未注册用户访问时可以创建 limit 为 0 的 token ,用户能使用但生成不了PPT,UI中监听次数用完的事件指导用户登录,登录用户访问时可以根据系统 vip 级别限制和维护系统用户 limit 次数
查询API信息
GET /api/user/apiInfo
请求 header
Api-Key 在开放平台获取 获取API-KEY
响应 body
{
"data": {
"availableCount": 100, // 可用次数
"usedCount": 0 // 已使用次数
},
"code": 0,
"message": "操作成功"
}
请求示例
curl -X GET --location 'https://docmee.cn/api/user/apiInfo' \ --header 'Api-Key: xxx'
查询所有PPT列表
POST /api/ppt/listAllPptx
请求 header
Api-Key 在开放平台获取 获取API-KEY
参数
{
"page": 1, // 分页
"size": 10, // 每页大小(最大不超过100)
"id": null, // ppt id(非必填)
"uid": null, // 第三方用户ID(非必填)
"templateId": null, // 模板ID(非必填)
"startDate": "2024-01-01 00:00:00", // 创建开始时间(非必填)
"endDate": "2025-01-01 23:59:59", // 创建结束时间(非必填)
"desc": true // 按时间倒序返回(非必填)
}
响应
{
"code": 0,
"total": 1,
"data": [
{
"id": "xxx", // ppt id
"subject": "xxx", // 主题
"coverUrl": "https://xxx.png", // 封面(需要拼接?token={API-KEY}访问)
"fileUrl": "https://xxx.pptx", // 文件(需要拼接?token={API-KEY}访问)
"templateId": "xxx", // 模板ID
"userId": "xxx", // 用户ID / uid
"companyId": 1000,
"createTime": "2024-01-01 10:00:00"
}
],
"message": "操作成功"
}
请求示例
curl -X POST --location 'https://docmee.cn/api/ppt/listAllPptx' \ --header 'Content-Type: application/json' \ --header 'Api-Key: {apiKey}' \ --data '{"page": 1, "size": 10}'
AI PPT
API 接口鉴权
请求 Header
token 通过 createApiToken 接口创建的 token,如果是服务端调用也可直接使用 API-KEY 作为 token
接口请求示例
curl --location 'https://docmee.cn/api/ppt/xxx' \ --header 'token: xxx'
封面图片资源访问,需要在 url 上拼接 ?token=xxx
接口调用说明
api 接口有很多种灵活搭配方案,具体取决于您的业务需求。
-
方案一:直接生成PPT(最简单对接方案)
- 调用 directGeneratePptx 直接生成PPT 接口,支持流式和非流式,PPT文件通过接口返回的 fileUrl 下载
-
方案二:实时流式生成PPT(用户体验最佳-文多多官方方案)
-
调用 generateOutline 生成大纲 接口,流式生成 PPT 大纲目录 markdown.
-
调用 generateContent 生成大纲内容同时异步生成PPT 接口,这个接口 asyncGenPptx 参数需要传 true,流式生成,根据第一步返回的大纲目录生成完整大纲内容 markdown,异步生成 PPT
-
在第二步 generateContent 接口中,接收实时流式 json 数据过程中判断 json 中是否有 pptId ,存在时调用 asyncPptInfo 查询异步生成PPT信息 接口,获取异步生成 PPT 的进度和数据(前端实时渲染)
-
-
方案三:同步流式生成PPT
- 调用 generateOutline 生成大纲 接口,流式生成 PPT 大纲目录 markdown.
- 调用 generateContent 生成大纲内容 接口,这个接口 asyncGenPptx 参数需要传 false,流式生成,根据第一步返回的大纲目录生成完整大纲内容 markdown
- 调用 generatePptx 生成 PPT 接口,通过完整 markdown 内容合成 PPT,通过 fileUrl 下载
-
方案四:openai chat 方式生成PPT
- 调用 /chat/completions OpenAi-对话生成PPT 接口,适用于接入支持 openai 接口的工具平台.
-
方案五:通过markdown生成PPT
-
集成方生成 markdown 内容,内容格式如下:
# 主题
## 章节
### 页面标题
#### 内容标题一
这是文本内容...
![图片一](https://xxx.png)
#### 内容标题二
这是文本内容...
![图片二](https://xxx.png)
示例下载:markdown.md (支持包含图片、表格)
-
调用 generatePptx 生成 PPT 接口,通过完整 markdown 内容合成 PPT,通过 fileUrl 下载
-
解析文件内容
POST /api/ppt/parseFileData
请求参数 (multipart/form-data)
参数 | 类型 | 是否必传 | 说明 |
---|---|---|---|
file | File | 否 | 文件(限制 50M 以内,最大解析8000个字) 支持格式:doc/docx/pdf/ppt/pptx/txt/md/xls/xlsx/csv/html/epub/mobi/xmind/mm |
content | string | 否 | 用户粘贴文本内容 |
fileUrl | string | 否 | 文件公网链接 |
website | string | 否 | 网址(http/https) |
websearch | string | 否 | 网络搜索关键词 |
响应:
{
"data": {
"dataUrl": "https://xxx" // 文件数据url(有效期:当天)
},
"code": 0,
"message": "操作成功"
}
请求示例
curl -X POST --location 'https://docmee.cn/api/ppt/parseFileData' \ --header 'Content-Type: multipart/form-data' \ --header 'token: {token}' \ --form 'file=@test.doc;filename=test.doc' \ --form 'content=文本内容' \ --form 'fileUrl=https://xxx.pdf' \ --form 'website=https://example.com' \ --form 'websearch=上海元符号智能科技有限公司'
生成大纲
POST /api/ppt/generateOutline
参数
{
"stream": true, // 是否流式生成(默认流式)
"length": "medium", // 篇幅长度:short/medium/long, 默认 medium, 分别对应: 10-15页/20-30页/25-35页
"lang": null, // 语言: zh/zh-Hant/en/ja/ko/ar/de/fr/it/pt/es/ru
"prompt": null, // 用户要求(小于50字)
// 方式一:通过主题创建
"subject": "xxx", // 主题(与dataUrl可同时存在)
// 方式二:通过文件内容创建
"dataUrl": "https://xxx" // 文件数据url,通过解析文件内容接口返回(与subject可同时存在)
}
响应 event-stream 流式生成
{
"text": "",
"status": 1 // 状态:-1异常 1解析文件 3生成中 4完成
}
{ "text": "# ", "status": 3 }
{ "text": " ", "status": 3 }
{ "text": "主题", "status": 3 }
...
{
"text": "",
"status": 4,
"result": {
"level": 1,
"name": "主题",
"children": [
{
"level": 2,
"name": "章节",
"children": [
{
"level": 3,
"name": "页面标题",
"children": [
{
"level": 4,
"name": "内容标题"
}
]
}
]
}
]
}
}
请求示例
curl -X POST --location 'https://docmee.cn/api/ppt/generateOutline' \ --header 'Content-Type: application/json' \ --header 'token: {token}' \ --data '{"subject": "AI未来的发展"}'
生成大纲内容
POST /api/ppt/generateContent
参数
{
"stream": true, // 是否流式生成(默认流式)
"outlineMarkdown": "# 主题\n## 章节\n### 页面标题\n#### 内容标题", // 大纲 markdown 文本
"asyncGenPptx": false, // 是否异步生成,这里为 false 同步,异步请见 "AI PPT (异步)" 菜单
"prompt": null, // 用户要求
"dataUrl": null // 文件数据url,调用解析文件内容接口返回
}
响应 event-stream 流式生成
{
"text": "",
"status": 3 // 状态:-1异常 1解析文件 3生成中 4完成
}
{ "text": "#", "status": 3 }
{ "text": " ", "status": 3 }
{ "text": "主题", "status": 3 }
...
{
"text": "",
"status": 4,
"result": {
"level": 1,
"name": "主题",
"children": [
{
"level": 2,
"name": "章节",
"children": [
{
"level": 3,
"name": "页面标题",
"children": [
{
"level": 4,
"name": "内容标题",
"children": [
{
"level": 0,
"name": "内容"
}
]
}
]
}
]
}
]
}
}
请求示例
curl -X POST --location 'https://docmee.cn/api/ppt/generateContent' \ --header 'Content-Type: application/json' \ --header 'token: {token}' \ --data '{"outlineMarkdown": "xxx"}'
获取模板过滤选项
GET /api/ppt/template/options
响应
{
"data": {
"category": [ // 类目筛选
{ "name": "全部", "value": "" },
{ "name": "年终总结", "value": "年终总结" },
{ "name": "教育培训", "value": "教育培训" },
{ "name": "医学医疗", "value": "医学医疗" },
{ "name": "商业计划书", "value": "商业计划书" },
{ "name": "企业介绍", "value": "企业介绍" },
{ "name": "毕业答辩", "value": "毕业答辩" },
{ "name": "营销推广", "value": "营销推广" },
{ "name": "晚会表彰", "value": "晚会表彰" },
{ "name": "个人简历", "value": "个人简历" }
],
"style": [ // 风格筛选
{ "name": "全部", "value": "" },
{ "name": "扁平简约", "value": "扁平简约" },
{ "name": "商务科技", "value": "商务科技" },
{ "name": "文艺清新", "value": "文艺清新" },
{ "name": "卡通手绘", "value": "卡通手绘" },
{ "name": "中国风", "value": "中国风" },
{ "name": "创意时尚", "value": "创意时尚" },
{ "name": "创意趣味", "value": "创意趣味" }
],
"themeColor": [ // 主题颜色筛选
{ "name": "全部", "value": "" },
{ "name": "橙色", "value": "#FA920A" },
{ "name": "蓝色", "value": "#589AFD" },
{ "name": "紫色", "value": "#7664FA" },
{ "name": "青色", "value": "#65E5EC" },
{ "name": "绿色", "value": "#61D328" },
{ "name": "黄色", "value": "#F5FD59" },
{ "name": "红色", "value": "#E05757" },
{ "name": "棕色", "value": "#8F5A0B" },
{ "name": "白色", "value": "#FFFFFF" },
{ "name": "黑色", "value": "#000000" }
]
},
"code": 0,
"message": "ok"
}
分页查询 PPT 模板
POST /api/ppt/templates
参数
{
"page": 1,
"size": 10,
"filters": {
"type": 1, // 模板类型(必传):1系统模板、4用户自定义模板
"category": null, // 类目筛选 ['年终总结', '教育培训', '医学医疗', '商业计划书', '企业介绍', '毕业答辩', '营销推广', '晚会表彰', '个人简历']
"style": null, // 风格筛选 ['扁平简约', '商务科技', '文艺清新', '卡通手绘', '中国风', '创意时尚', '创意趣味']
"themeColor": null // 主题颜色筛选 ['#FA920A', '#589AFD', '#7664FA', '#65E5EC', '#61D328', '#F5FD59', '#E05757', '#8F5A0B', '#FFFFFF', '#000000']
}
}
响应
{
"code": 0,
"total": 1,
"data": [
{
"id": "xxx", // 模板ID
"type": 1, // 模板类型:1大纲完整PPT、4用户模板
"coverUrl": "https://xxx.png", // 封面(需要拼接?token=${token}访问)
"category": null, // 类目
"style": null, // 风格
"themeColor": null, // 主题颜色
"subject": "", // 主题
"num": 20, // 模板页数
"createTime": "2024-01-01 10:00:00"
}
],
"message": "操作成功"
}
请求示例
curl -X POST --location 'https://docmee.cn/api/ppt/templates' \ --header 'Content-Type: application/json' \ --header 'token: {token}' \ --data '{"page": 1, "size":10, "filters": { "type": 1 }}'
封面图片资源访问,需要在 url 上拼接 ?token=xxx
模板接口支持国际化,在请求 URL 上传 lang 参数,示例:/api/ppt/templates?lang=zh-CN
国际化语种支持:zh,zh-Hant,en,ja,ko,ar,de,fr,it,pt,es,ru
随机 PPT 模板
POST /api/ppt/randomTemplates
参数
{
"size": 30,
"filters": {
"type": 1, // 模板类型(必传):1系统模板、4用户自定义模板
"category": null, // 类目 ['年终总结', '教育培训', '医学医疗', '商业计划书', '企业介绍', '毕业答辩', '营销推广', '晚会表彰', '个人简历']
"style": null, // 风格 ['扁平简约', '商务科技', '文艺清新', '卡通手绘', '中国风', '创意时尚', '创意趣味']
"themeColor": null, // 主题颜色 ['#FA920A', '#589AFD', '#7664FA', '#65E5EC', '#61D328', '#F5FD59', '#E05757', '#8F5A0B', '#FFFFFF', '#000000']
"neq_id": [] // 排查ID集合(把之前查询返回的id排除)
}
}
响应
{
"code": 0,
"total": 1,
"data": [
{
"id": "xxx", // 模板ID
"type": 1, // 模板类型:1大纲完整PPT、4用户模板
"coverUrl": "https://xxx.png", // 封面(需要拼接?token=${token}访问)
"category": null, // 类目
"style": null, // 风格
"themeColor": null, // 主题颜色
"subject": "", // 主题
"num": 20, // 模板页数
"createTime": "2024-01-01 10:00:00"
}
],
"message": "操作成功"
}
请求示例
curl -X POST --location 'https://docmee.cn/api/ppt/randomTemplates' \ --header 'Content-Type: application/json' \ --header 'token: {token}' \ --data '{"size":10, "filters": { "type": 1 }}'
封面图片资源访问,需要在 url 上拼接 ?token=xxx
模板接口支持国际化,在请求 URL 上传 lang 参数,示例:/api/ppt/randomTemplates?lang=zh-CN
国际化语种支持:zh,zh-Hant,en,ja,ko,ar,de,fr,it,pt,es,ru
生成 PPT
POST /api/ppt/generatePptx
参数
{
"templateId": "xxx", // 模板ID(非必填)
"pptxProperty": false, // 是否返回PPT数据结构
"outlineContentMarkdown": "# 主题\n## 章节\n### 页面标题\n#### 内容标题\n- 内容", // 大纲内容markdown
"notes": null // 备注(PPT页面备注,非必填,数组 ["内容页面一备注", "内容页面二备注"])
}
响应
{
"code": 0,
"data": {
"pptInfo": {
// ppt信息
"id": "xxx", // ppt id
"subject": "xxx", // 主题
"coverUrl": "https://xxx.png", // 封面
"fileUrl": "https://xxx.pptx", // PPT文件
"templateId": "xxx", // 模板ID
"pptxProperty": "xxx", // PPT数据结构(json 数据通过 gzip 压缩 base64 编码返回,具体解码和数据结构请见【PPT前端渲染】部分讲解)
"userId": "xxx", // 用户ID
"userName": "xxx", // 用户名称
"companyId": 1000,
"updateTime": null,
"createTime": "2024-01-01 10:00:00"
}
},
"message": "操作成功"
}
请求示例
curl -X POST --location 'https://docmee.cn/api/ppt/generatePptx' \ --header 'Content-Type: application/json' \ --header 'token: {token}' \ --data '{"outlineContentMarkdown": "xxx", "pptxProperty": false}'
直接生成PPT
POST /api/ppt/directGeneratePptx
参数
{
"stream": false, // 是否流式生成
"templateId": "xxx", // 模板ID(非必填,为空则随机模板)
"pptxProperty": false, // 是否返回PPT数据结构
"length": "medium", // 篇幅长度:short/medium/long, 默认 medium, 分别对应: 10-15页/20-30页/25-35页
"lang": null, // 语言: zh/zh-Hant/en/ja/ko/ar/de/fr/it/pt/es/ru
"prompt": null, // 用户要求(小于50字)
// 方式一:通过主题创建
"subject": "xxx", // 主题(与dataUrl可同时存在)
// 方式二:通过文件内容创建
"dataUrl": "https://xxx" // 文件数据url,调用解析文件内容接口返回(与subject可同时存在)
}
非流式-响应(application/json)
{
"code": 0,
"data": {
"pptInfo": {
// ppt信息
"id": "xxx", // ppt id
"subject": "xxx", // 主题
"coverUrl": "https://xxx.png", // 封面
"fileUrl": "https://xxx.pptx", // PPT文件
"templateId": "xxx", // 模板ID
"pptxProperty": "xxx", // PPT数据结构(json 数据通过 gzip 压缩 base64 编码返回,具体解码和数据结构请见【PPT前端渲染】部分讲解)
"userId": "xxx", // 用户ID
"userName": "xxx", // 用户名称
"companyId": 1000,
"updateTime": null,
"createTime": "2024-01-01 10:00:00"
}
},
"message": "操作成功"
}
请求示例
curl -X POST --location 'https://docmee.cn/api/ppt/directGeneratePptx' \ --header 'Content-Type: application/json' \ --header 'token: {token}' \ --data '{"stream": false, "subject": "AI未来的发展", "pptxProperty": false}'
流式-响应(event-stream)
{
"text": "",
"status": 3 // 状态:-1异常 1解析文件 3生成中 4完成
}
{ "text": "#", "status": 3 }
{ "text": " ", "status": 3 }
{ "text": "主题", "status": 3 }
...
{ "text": "", "status": 3, "pptId": "xxx" }
{
"text": "",
"status": 4,
"result": {
// ppt信息
"id": "xxx", // ppt id
"subject": "xxx", // 主题
"coverUrl": "https://xxx.png", // 封面
"fileUrl": "https://xxx.pptx", // PPT文件
"templateId": "xxx", // 模板ID
"pptxProperty": "xxx", // PPT数据结构(json 数据通过 gzip 压缩 base64 编码返回,具体解码和数据结构请见【PPT前端渲染】部分讲解)
"userId": "xxx", // 用户ID
"userName": "xxx", // 用户名称
"companyId": 1000,
"updateTime": null,
"createTime": "2024-01-01 10:00:00"
}
}
请求示例
curl -X POST --location 'https://docmee.cn/api/ppt/directGeneratePptx' \ --header 'Content-Type: application/json' \ --header 'token: {token}' \ --data '{"stream": true, "subject": "AI未来的发展", "pptxProperty": false}'
获取 PPT 列表
POST /api/ppt/listPptx
参数
{
"page": 1,
"size": 10
}
响应
{
"code": 0,
"total": 1,
"data": [
{
"id": "xxx", // ppt id
"subject": "xxx", // 主题
"coverUrl": "https://xxx.png", // 封面
"templateId": "xxx", // 模板ID
"userId": "xxx", // 用户ID
"userName": "xxx", // 用户名称
"companyId": 1000,
"updateTime": null,
"createTime": "2024-01-01 10:00:00"
}
],
"message": "操作成功"
}
请求示例
curl -X POST --location 'https://docmee.cn/api/ppt/listPptx' \ --header 'Content-Type: application/json' \ --header 'token: {token}' \ --data '{"page": 1, "size": 10}'
加载 PPT 数据
GET /api/ppt/loadPptx?id=
响应
{
"code": 0,
"data": {
"pptInfo": {
// ppt信息
// 数据同 generatePptx 生成PPT 接口结构...
"id": "xxx", // ppt id
"subject": "xxx", // 主题
"coverUrl": "https://xxx.png", // 封面
"templateId": "xxx", // 模板ID
"pptxProperty": "xxx", // PPT数据结构(json 数据通过 gzip 压缩 base64 编码返回,具体解码和数据结构请见【PPT前端渲染】部分讲解)
"userId": "xxx", // 用户ID
"userName": "xxx", // 用户名称
"companyId": 1000,
"updateTime": null,
"createTime": "2024-01-01 10:00:00"
}
},
"message": "操作成功"
}
请求示例
curl -X GET --location 'https://docmee.cn/api/ppt/loadPptx?id=xxx' \ --header 'token: {token}'
加载 PPT 大纲内容
POST /api/ppt/loadPptxMarkdown
请求
{
"id": "xxx", // pptId
"format": "tree", // 输出格式:text 大纲文本; tree 大纲结构树
}
响应
{
"code": 0,
"data": {
"markdownText": "# 主题\n## 章节标题\n### 页面标题\n#### 内容标题\n- 文本内容...", // 大纲markdown文本(当 format 为 text 时返回)
"markdownTree": { // 大纲结构树(当 format 为 tree 时返回)
"level": 1,
"name": "主题",
"children": [
{
"level": 2,
"name": "章节",
"children": [
{
"level": 3,
"name": "页面标题",
"children": [
{
"level": 4,
"name": "内容标题",
"children": [
{
"level": 0,
"name": "文本内容..."
}
]
}
]
}
]
}
]
}
},
"message": "操作成功"
}
请求示例
curl -X POST --location 'https://docmee.cn/api/ppt/loadPptxMarkdown' \ --header 'Content-Type: application/json' \ --header 'token: {token}' \ --data '{"id": "xxx", "format": "tree"}'
下载 PPT
POST /api/ppt/downloadPptx
请求
{
"id": "xxx"
}
响应
{
"code": 0,
"data": {
"id": "xxx",
"name": "xxx",
"subject": "xxx",
"fileUrl": "https://xxx" // 文件链接(有效期:2小时)
},
"message": "操作成功"
}
请求示例
curl -X POST --location 'https://docmee.cn/api/ppt/downloadPptx' \ --header 'Content-Type: application/json' \ --header 'token: {token}' \ --data '{"id":"xxx"}'
下载-智能动画PPT
GET /api/ppt/downloadWithAnimation?type=1&id=xxx
URL请求
参数 | 类型 | 描述 |
---|---|---|
type | number | 动画类型,1依次展示(默认);2单击展示 |
id | string | PPT ID |
响应(application/octet-stream)
文件数据流
请求示例
curl -X GET --location 'https://docmee.cn/api/ppt/downloadWithAnimation?type=1&id=xxx' \ --header 'token: {token}'
该接口会在原有的PPT元素对象上智能添加动画效果(元素入场动画 & 页面切场动画)
动画类型介绍:
1 依次展示,表示上一个元素动画结束后立马展示下一个元素动画
2 单击展示,表示在内容页,上一项内容展示完成后需要单击才会展示下一项内容,其他页面效果同依次展示。
更换 PPT 模板
POST /api/ppt/updatePptTemplate
参数
{
"pptId": "xxx", // ppt id
"templateId": "xxx", // 模板ID
"sync": false // 是否同步更新PPT文件(默认 false 异步更新,速度快)
}
响应
{
"code": 0,
"data": {
"pptId": "xxx",
"templateId": "xxx",
"pptxProperty": { // 更换后的pptx结构数据(json)
// ...
}
}
}
更新 PPT 属性
POST /api/ppt/updatePptxAttr
参数
{
"id": "xxx",
// 下面字段不能为空则修改
"name": null,
"subject": null
}
响应
{
"code": 0,
"message": "操作成功"
}
请求示例
curl -X POST --location 'https://docmee.cn/api/ppt/updatePptxAttr' \ --header 'Content-Type: application/json' \ --header 'token: {token}' \ --data '{"id":"xxx","name":"xxx"}'
设置 Logo
POST /api/ppt/setPptLogo
请求参数 (multipart/form-data)
参数 | 类型 | 是否必传 | 说明 |
---|---|---|---|
image | File | 是 | Logo图片文件(png / jpg) |
pptId | string | 是 | PPT ID |
width | integer | 否 | logo 宽度 px,默认 48 |
height | integer | 否 | logo 高度 px, 默认 48 |
响应:
{
"data": {
"fileUrl": "https://xxx.pptx" // pptx 文件下载地址
},
"code": 0,
"message": "操作成功"
}
请求示例
curl -X POST --location 'https://docmee.cn/api/ppt/setPptLogo' \ --header 'Content-Type: multipart/form-data' \ --header 'token: {token}' \ --form 'image=@test.png;filename=test.png' \ --form 'pptId=12354768'
保存 PPT
POST /api/ppt/savePptx
参数
{
"id": "xxx", // ppt id
"drawPptx": true, // 是否重新渲染PPT文件并上传
"drawCover": true, // 是否重新渲染PPT封面并上传
"pptxProperty": {
// 修改过后的 pptx 页面数据结构树
}
}
响应
{
"code": 0,
"data": {
"pptInfo": {
// ppt信息
// 数据同 generatePptx 生成PPT 接口结构...
}
},
"message": "操作成功"
}
请求示例
curl -X POST --location 'https://docmee.cn/api/ppt/savePptx' \ --header 'Content-Type: application/json' \ --header 'token: {token}' \ --data '{"id":"xxx","drawPptx":true,"drawCover":true,"pptxProperty":{}}'
删除 PPT
POST /api/ppt/delete
参数
{
"id": "xxx" // ppt id
}
响应
{
"code": 0,
"message": "操作成功"
}
请求示例
curl -X POST --location 'https://docmee.cn/api/ppt/delete' \ --header 'Content-Type: application/json' \ --header 'token: {token}' \ --data '{"id":"xxx"}'
修改大纲
POST /ppt/updateOutline
参数
{
"outlineMarkdown": "# 主题\n## 章节\n### 页面标题\n#### 内容标题", // 大纲markdown内容
"length": "medium", // 篇幅长度:short/medium/long, 默认 medium, 分别对应: 10-15页/20-30页/25-35页
// 用户修改建议
// 系统内置:用金字塔原理优化、强化大纲结构和过渡、突出大纲主题、让大纲更专业
// 用户自定义:比如 “帮我把大纲改成金字塔结构”
"question": null
}
响应 event-stream,结构同 generateOutline 生成大纲,该接口用来修改调整大纲结构
AI PPT (异步)
Ai 异步流式生成 PPT,只需在调用生成大纲接口后调用下面的 generateContent 接口即可生成PPT,无需再次调用生成PPT接口
生成大纲内容同时异步生成PPT
POST /api/ppt/generateContent
参数
{
"templateId": "xxx", // 模板ID(非必填)
"outlineMarkdown": "# 主题\n## 章节\n### 页面标题\n#### 内容标题", // 大纲 markdown 文本
"asyncGenPptx": true, // 异步生成PPT(这里必须为 true 才会流式生成)
"prompt": null, // 用户要求
"dataUrl": null // 文件数据url,调用解析文件内容接口返回
}
响应 event-stream 流式生成
{
"text": "",
"status": 3, // 状态:-1异常 0模型重置 1解析文件 2搜索网页 3生成中 4完成
// 下面为异步生成PPT时返回的数据,可以每出现一次就调用 asyncPptInfo 接口获取最新的PPT数据
"pptId": "xxx", // 异步生成pptId
"total": 23, // 总页数
"current": 1 // 当前已生成页数
}
{ "text": "#", "status": 3 }
{ "text": " ", "status": 3 }
{ "text": "主题", "status": 3 }
...
{
"text": "",
"status": 4,
"result": {
"level": 1,
"name": "主题",
"children": [
{
"level": 2,
"name": "章节",
"children": [
{
"level": 3,
"name": "页面标题",
"children": [
{
"level": 4,
"name": "内容标题",
"children": [
{
"level": 0,
"name": "内容"
}
]
}
]
}
]
}
]
}
}
请求示例
curl -X POST --location 'https://docmee.cn/api/ppt/generateContent' \ --header 'Content-Type: application/json' \ --header 'token: {token}' \ --data '{"outlineMarkdown":"xxx","asyncGenPptx":true}'
查询异步生成PPT信息
GET /api/ppt/asyncPptInfo?pptId=
参数
pptId 为 generateContent 接口流式返回的pptId
响应
{
"code": 0,
"data": {
"total": 23, // 总页数
"current": 1, // 当前已生成页数(如果current >= total时表示PPT生成完成)
"pptxProperty": "xxx" // PPT数据结构(json gzip base64)
}
}
说明:该接口不需要轮询,在 generateContent 接口流式返回 pptId 数据时调用,每出现一次 pptId 就调用一次获取最新的 PPT 信息
注意:这个接口只有在流式生成过程中能查询到数据(临时缓存数据),在PPT生成完成的30秒内过期(查不到数据),此时需要调用 loadPptx 加载 PPT 数据 接口查询。
请求示例
curl -X GET --location 'https://docmee.cn/api/ppt/asyncPptInfo?pptId=xxx' \ --header 'token: {token}'
OpenAI
兼容 openai chat 接口 生成 PPT,鉴权支持请求头 Api-Key 和 Authorization Bearer 两种方式。
对话生成PPT
POST /api/ppt-openai/v1/chat/completions
参数
{
"stream": true, // 是否流式
"model": "direct-generate-pptx", // 模型(固定)
"messages": [ // 消息体:不支持连续对话(多个时默认取最后一个user)
{
"role": "user",
"content": "AI未来的发展" // 支持:主题、文档内容、文件链接(公网可访问)
}
]
// 其他扩展参数
// appendLink: true 大纲内容生成完成后是否在文本后面追加封面图片和下载链接(默认true)
// templateId: null 模板ID(默认为 null,系统随机)
// lang: null 语言: zh/zh-Hant/en/ja/ko/ar/de/fr/it/pt/es/ru
// prompt: null // 用户要求(不超过50字)
}
非流式-响应(application/json)
{
"id": "1833839690764124160",
"model": "direct-generate-pptx",
"choices": [
{
"index": 0,
"finish_reason": "stop",
"message": {
"role": "assistant",
"content": "# AI未来的发展\n## 1 技术进步\n### 1.1 算法优化\n#### 1.1.1 深度学习\n- 深度学习模型不断优化,提高准确性和效率...|\n\n[封面图片]\n\n[点击下载]" // PPT大纲内容 & 封面和下载链接,请通过markdown渲染
},
"ppt_data": { // PPT数据(扩展属性)
"id": "1833839690764124160", // id
"subject": "AI未来的发展", // 主题
"templateId": "xxx", // 模板ID
"coverUrl": "https://xxx.png", // 封面(可直接访问,有效期8小时)
"fileUrl": "https://xxx.pptx" // PPT文件(可直接访问,有效期8小时)
}
}
],
"object": "chat.completion",
"created": 1726056513,
"usage": {
"completion_tokens": 10000,
"prompt_tokens": 2000,
"total_tokens": 12000
}
}
流式-响应(event-stream)
data: {"id":"1833839690764124160","choices":[{"delta":{"content":"#","role":"assistant"},"finish_reason":null,"index":0}],"created":1726056518,"model":"direct-generate-pptx","object":"chat.completion.chunk"}
data: {"id":"1833839690764124160","choices":[{"delta":{"content":" ","role":"assistant"},"finish_reason":null,"index":0}],"created":1726056518,"model":"direct-generate-pptx","object":"chat.completion.chunk"}
data: {"id":"1833839690764124160","choices":[{"delta":{"content":"AI","role":"assistant"},"finish_reason":null,"index":0}],"created":1726056518,"model":"direct-generate-pptx","object":"chat.completion.chunk"}
data: {"id":"1833839690764124160","choices":[{"delta":{"content":"未来","role":"assistant"},"finish_reason":null,"index":0}],"created":1726056518,"model":"direct-generate-pptx","object":"chat.completion.chunk"}
...
data: {"id":"1833839690764124160","choices":[{"delta":{"content":null,"role":"assistant"},"finish_reason":"stop","index":0,"ppt_data":{"companyId":1000,"coverUrl":"https://xxx.png","createTime":1726056519624,"fileUrl":"https://xxx.pptx","id":"1833839690764124160","name":"AI未来的发展","subject":"AI未来的发展","templateId":"1815308477845987328","updateTime":1726056519624,"userId":"xxx","userName":"xxx"}}],"created":1726056529,"model":"direct-generate-pptx","object":"chat.completion.chunk"}
请求示例(python):
import json
from openai import OpenAI
if __name__ == '__main__':
# 通过 openai 库直接请求
client = OpenAI(base_url='{域名}/api/ppt-openai/v1', api_key='sk-xxx')
# 是否流式请求
stream = True
response = client.chat.completions.create(
timeout=120,
stream=stream,
model='direct-generate-pptx',
messages=[
{
'role': 'user',
'content': 'AI未来的发展'
}
]
)
if stream:
# 流式
for trunk in response:
choice = trunk['choices'][0]
print(choice['delta']['content'], end='')
if 'ppt_data' in choice:
print(json.dumps(choice['ppt_data']))
else:
# 非流式
choice = response['choices'][0]
print(choice['message']['content'])
if 'ppt_data' in choice:
print(json.dumps(choice['ppt_data']))
JSON
ppt转json
POST /api/pptjson/ppt2json
请求参数 (multipart/form-data)
参数 | 类型 | 说明 |
---|---|---|
file | File | PPTX 文件(必传) |
uploadImage | boolean | 图片是否上传到服务器,false 时返回base64图片数据 |
响应
{
"width": 960,
"height": 540,
"pages": [], // 页面结构数据
"font": [], // 字体数据
"slideMasters": [], // 母版结构数据
"version": "1.0"
}
请求示例
curl -X POST --location 'https://docmee.cn/api/pptjson/ppt2json' \ --header 'Content-Type: multipart/form-data' \ --header 'token: {token}' \ --form 'file=@test.pptx' \ --form 'uploadImage=false'
json转ppt
POST /api/pptjson/json2ppt
请求参数
{
"width": 960,
"height": 540,
"pages": [], // 页面结构数据
"font": [], // 字体数据
"slideMasters": [], // 母版结构数据
"version": "1.0"
}
响应(文件流) application/octet-stream
请求示例
curl -X POST --location 'https://docmee.cn/api/pptjson/json2ppt' \ --header 'Content-Type: application/json' \ --header 'token: {token}' \ --data '{"width":960,"height":540,"pages": [],"font": [],"slideMasters": [],"version": "1.0"}'
前端渲染 demo 示例: GitHub - veasion/ppt2json: PPT 文件解析为 JSON,并在前端渲染,支持修改 JSON 后反渲染为PPT文件。The PPT file is parsed into JSON and rendered on the front end, supporting modifications to the JSON and re-rendering it back into a PPT file.
自定义模板
上传用户自定义模板
POST /api/ppt/uploadTemplate
请求参数 (multipart/form-data)
参数 | 类型 | 是否必传 | 说明 |
---|---|---|---|
type | int | 是 | 类型,用户自定义模板传 4(写死) |
file | File | 是 | 文件(仅支持 pptx,幻灯片大小 960x540) |
templateId | string | 否 | 模板ID(更新时传,会覆盖该模板) |
响应:
{
"code": 0,
"data": {
"id": "xxx", // 模板ID
"type": 4, // 模板类型:4用户模板
"coverUrl": "https://xxx.png", // 封面(需要拼接token才能访问)
"subject": "", // 主题
"pptxProperty": "xxx", // PPT数据结构(json gzip base64)
"num": 20, // 页码
"createTime": "2024-01-01 10:00:00"
},
"message": "操作成功"
}
请求示例
curl -X POST --location 'https://docmee.cn/api/ppt/uploadTemplate' \ --header 'Content-Type: multipart/form-data' \ --header 'token: {token}' \ --form 'type=4' \ --form 'file=@test.doc;filename=test.doc'
模板标准幻灯片大小(16:9)960x540 (33.867x19.05厘米) ,如果尺寸非标准大小,可在 microsoft office 中修改步骤:设计 > 幻灯片大小 > 自定义幻灯片大小 => 33.867x19.05厘米
上传用户自定义模板后,AI会自动标注学习,如果您觉得生成效果有问题,对不上,可以访问下面链接手动纠正 AI 标注结果: https://docmee.cn/marker/{templateId}?token={apiKey} 请把 {templateId} 替换成真实的模板ID,{apiKey} 替换成你的 api-key,示例:文多多 AiPPT | 一键搞定PPT
下载自定义模板
POST /api/ppt/downloadTemplate
请求
{
"id": "xxx" // 模板ID
}
响应
{
"code": 0,
"data": {
"id": "xxx", // 模板ID
"subject": "", // 主题
"type": 4, // 模板类型:4用户模板
"coverUrl": "https://xxx.png", // 封面(需要拼接token才能访问)
"fileUrl": "https://xxx.pptx?xxx", // 模板下载地址(可直接访问)
"createTime": "2024-01-01 10:00:00"
},
"message": "操作成功"
}
请求示例
curl -X POST --location 'https://docmee.cn/api/ppt/downloadTemplate' \ --header 'Content-Type: application/json' \ --header 'token: {token}' \ --data '{"id": "xxx"}'
删除自定义模板
POST /api/ppt/delTemplateId
请求
{
"id": "xxx" // 模板ID
}
响应
{
"code": 0,
"message": "操作成功"
}
请求示例
curl -X POST --location 'https://docmee.cn/api/ppt/delTemplateId' \ --header 'Content-Type: application/json' \ --header 'token: {token}' \ --data '{"id": "xxx"}'
设置为公共模板
注意:这里的公共模板是指API-KEY账号级别的公共模板,并非平台公共模板。
POST /api/ppt/updateUserTemplate
请求 header
Api-Key 在开放平台获取 获取API-KEY
参数
{
"templateId": "xxx", // 模板ID
"isPublic": true // 是否公开(true 公开,API-KEY下创建的所有token可以看到)
}
响应
{
"code": 0,
"message": "操作成功"
}
请求示例
curl -X POST --location 'https://docmee.cn/api/ppt/updateUserTemplate' \ --header 'Content-Type: application/json' \ --header 'Api-Key: {apiKey}' \ --data '{"templateId": "xxx", "isPublic": true}'
常见错误码
接口 application/json 错误
{
"code": 0, // 错误码:0 代表成功;其他为失败
"message": "操作成功" // 错误提示
}
错误码 | 说明 |
---|---|
0 | 操作成功(正常) |
-1 | 操作失败(未知错误) |
88 | 功能受限(积分已用完 或 非VIP) |
98 | 认证失败(检查token是否过期) |
99 | 登录过期 |
1001 | 数据不存在 |
1002 | 数据访问异常 |
1003 | 无权限访问 |
1006 | 内容涉及敏感信息 |
1009 | AI服务异常 |
1010 | 参数错误 |
1012 | 请求太频繁,限流 |
SEE 流式请求错误分两种
初始化流式调用时发生错误会返回 application/json 错误信息
{
"code": 1010,
"message": "参数错误:name 不能为空"
}
流式过程中遇到错误,会在流中返回 text/event-stream 流式错误信息:
data: {"status":-1, "error":"AI模型执行异常"}
PPT 前端渲染
渲染说明
关于 ppt 数据结构在前端渲染问题,我们已经把前端代码开源到 github:
GitHub - veasion/aippt-js: js/html 接入文多多AiPPT,通过主题/文件/网址等方式生成PPT,支持原生图表、动画、3D特效等复杂PPT的解析和渲染,支持用户自定义模板,支持智能添加动画。AI generates PowerPoint Presentation, Supports parsing and rendering of complex PPT features such as native charts, animations, and 3D effects.
GitHub - veasion/aippt-vue-all: Vue 接入文多多AiPPT,通过主题/文件/网址等方式生成PPT,支持原生图表、动画、3D特效等复杂PPT的解析和渲染,支持用户自定义模板,支持智能添加动画。AI generates PowerPoint Presentation, Supports parsing and rendering of complex PPT features such as native charts, animations, and 3D effects.
GitHub - veasion/aippt-react: React 接入文多多AiPPT,通过主题/文件/网址等方式生成PPT,支持原生图表、动画、3D特效等复杂PPT的解析和渲染,支持用户自定义模板,支持智能添加动画。AI generates PowerPoint Presentation, Supports parsing and rendering of complex PPT features such as native charts, animations, and 3D effects.
关于上面 pptxProperty 数据解码,为了减少带宽占用,我们在服务端对 pptxProperty 做了压缩和编码(json 字符串数据通过 gzip 压缩 base64 编码),通过 js 解码:
// 依赖js库
// https://github.com/veasion/aippt-js/blob/main/static/base64js.js
// https://github.com/veasion/aippt-js/blob/main/static/pako.js
let pptxProperty = 'xxx'
let gzip = base64js.toByteArray(pptxProperty)
let json_str = pako.ungzip(gzip, { to: 'string' })
let pptxObj = JSON.parse(json_str)
数据结构说明
pptxProperty 解压后的 json 数据结构简易说明
{
"width": 960, // PPT宽度
"height": 540, // PPT高度
"font": [ // 嵌入字体
{
"typeface": "HarmonyOS Sans", // 字体
"eotUrl": "https://xxx.eot" // embedding open type font
}
],
"version": "1.0",
"slideMasters": [ // PPT母版&版式(包含主题、版式等)
{
"background": { // 母版背景
"strokeStyle": {},
"realType": "Background",
"anchor": [0, 0, 960, 540], // x,y,width,height
"fillStyle": { // 填充方式
"type": "color", // 类型:color/gradient/texture/pattern/groupFill/bgFill/noFill
"color": {
"color": -1, // 颜色(32bit ARGB) color = (A & 255) << 24 | (R & 255) << 16 | (G & 255) << 8 | (B & 255) << 0, R => (color >> 16) & 255
"realColor": -1 // 真实颜色(根据hsv等偏移计算的真实颜色)
}
}
},
"theme": { // 母版主题
"name": "Office 主题", // 主题名称
"colors": { // 主题颜色
"accent1": -12291388, // 主题颜色1
"accent2": -1213135, // 主题颜色2...
"accent3": -5921371,
"accent4": -16384,
"accent5": -10773547,
"accent6": -9392825,
"lt1": -1,
"dk2": -12299158,
"dk1": -16777216,
"lt2": -1579290,
"bg1": -1,
"tx2": -12299158,
"tx1": -16777216,
"bg2": -1579290,
"hlink": -16423999,
"folHlink": -6992014
},
"majorFontMap": { // 主要字体
"latin": "Calibri",
"ea": "",
"Hans": "等线"
},
"minorFontMap": { // 次要字体
"latin": "Calibri",
"ea": "",
"Hans": "等线"
}
},
"clrMap": { // 颜色映射
"bg1": "lt1",
"bg2": "lt2",
"tx1": "dk1",
"tx2": "dk2"
},
"children": [], // 元素树(数据结构跟page中的children一致)
"slideLayouts": [ // 母版版式
{
"type": "CUST",
"name": "标题幻灯片",
"children": [], // 元素树(数据结构跟page中的children一致)
"background": {
"strokeStyle": {},
"realType": "Background",
"anchor": [0, 0, 960, 540],
"fillStyle": {
"color": {
"color": -1,
"realColor": -1
},
"type": "color"
}
}
}
]
}
],
"pages": [ // PPT页面结构
{
"page": 1, // 第几页
"extInfo": { // 数据信息
"slideMasterIdx": 0, // 对应母版下标
"slideLayoutIdx": 0, // 对应母版下的版式下标
"notes": "这是一个备注", // PPT页面备注
"background": { // 背景
"strokeStyle": {},
"realType": "Background",
"anchor": [0, 0, 960, 540], // x,y,width,height
"fillStyle": { // 填充样式
"type": "color", // color/gradient/texture/pattern/groupFill/bgFill/noFill
"color": { // 颜色
"scheme": "accent1", // 对应主题色
"color": -12291388, // 颜色(32bit ARGB) color = (A & 255) << 24 | (R & 255) << 16 | (G & 255) << 8 | (B & 255) << 0, R => (color >> 16) & 255
"realColor": -12291388 // 真实颜色(32bit ARGB)
}
}
},
"transition": { // 场景动画(具体见 animation.js 中 transitionList)
"blinds": {
"dir": "horz"
},
"spd": "slow"
},
"animationExt": [ // 元素动画(具体见 animation.js 中 animationList)
{
"animation": "弹跳", // 动画名称
"elementId": "1", // 元素ID
"startType": 1, // 开始类型:1单击时(clickEffect);2与上一动画同时(withEffect);3在上一动画之后(afterEffect)
"presetClass": "entr", // entr 进场动画;emph 强调动画;exit 出场动画
"presetId": 26, // 动画ID
"presetSubtype": 0, // 动画子类型
"duration": 1000, // 持续时间(毫秒)
"attr": {} // 其他属性
}
],
"animation": null // 动画原生属性(如果改动了 animationExt 请把当前 animation 属性设置为 null)
},
"children": [ // 元素结构树
{
"id": "1", // id
"type": "text", // 类型:text/freeform/image/container/diagram/connector/table/graphicFrame
"point": [397.09094488188978, 124.36362204724409, 87.24377952755906, 29.081259842519687], // 真实位置(根据缩放偏移等数据计算过的真实位置)[x,y,width,height]
"depth": 1, // 深度
"extInfo": { // 扩展信息
"property": { // 属性
"realType": "TextBox", // 真实类型
"textDirection": "HORIZONTAL", // 文本方向 => HORIZONTAL,VERTICAL,EA_VERTICAL,VERTICAL_270,STACKED
"shapeType": "rect",
"textWordWrap": false, // 是否自动换行
"anchor": [397.09094488188978, 124.36362204724409, 87.24377952755906, 29.081259842519687], // 相对位置 [x,y,width,height]
"textVerticalAlignment": "TOP", // 文本垂直对齐 => TOP,MIDDLE,BOTTOM,JUSTIFIED,DISTRIBUTED
"fillStyle": { // 填充
"type": "color",
"color": {
"scheme": "accent6", // 对应主题色
"color": -9392825, // 颜色(32bit ARGB) color = (A & 255) << 24 | (R & 255) << 16 | (G & 255) << 8 | (B & 255) << 0, R => (color >> 16) & 255
"realColor": -9392825 // 真实颜色(32bit ARGB)
}
},
"geometry": { // 行状
"name": "rect", // 形状,custom 为自定义形状,其他都为系统预置形状
"data": null, // custom 自定义形状 paths 数据
"avLst": null // 调整参数
},
"textAutofit": "SHAPE",
"textInsets": [3.6, 7.2, 3.6, 7.2] // 文本形状调整边距 [top,left,bottom,right]
}
},
"children": [ // 子元素结构树
{
"id": "2", // id
"pid": "1", // pid
"type": "p", // 类型:text 下为 p 段落,p 段落下为 r 字符
"extInfo": {
"property": {
"textAlign": "LEFT", // 段落文本对齐 LEFT,CENTER,RIGHT,JUSTIFY,JUSTIFY_LOW,DIST,THAI_DIST
"fontAlign": null, // 字体对齐 AUTO,TOP,CENTER,BASELINE,BOTTOM
"indent": 0, // 缩进
"bullet": null, // 项目符合
"bulletStyle": null, // 项目符合样式
"leftMargin": null, // 左边距
"rightMargin": null, // 右边距
"lineSpacing": null, // 段落-间距-行距:1.5倍行距为 150, 2倍行距为 200
"spaceBefore": null, // 段落-间距-段前:文本段落之前的行距
"spaceAfter": null // 段落-间距-段后:文本段落之后的行距
}
},
"depth": 2,
"children": [
{
"id": "3",
"pid": "2",
"type": "r", // 类型 r 字符
"text": "文本数据", // 文本数据
"depth": 3,
"extInfo": {
"property": {
"fontSize": 18, // 字体大小
"lang": "zh-CN",
"fontColor": { // 字体颜色填充,结构同 fillStyle
"type": "color", // color/gradient/texture/pattern/groupFill/bgFill/noFill
"color": {
"scheme": null, // 主题色
"color": -16777216, // 颜色(32bit ARGB) color = (A & 255) << 24 | (R & 255) << 16 | (G & 255) << 8 | (B & 255) << 0, R => (color >> 16) & 255
"realColor": -16777216, // 真正颜色(计算后的颜色)
"alpha": null, // 透明度,alpha / 100000.0 * 255
"hueMod": null, // hsv 色相
"hueOff": null, // 偏移
"satMod": null, // hsv 饱和度
"satOff": null, // 偏移
"lumMod": null, // hsv 亮度 lumMod / 100000 => 85000=0.85; 95000=0.95; 50000=0.5
"lumOff": null, // 偏移
"shade": null,
"tint": null
}
}
}
}
}
]
}
]
},
{
"id": "4",
"type": "text",
"point": [267.6364566929134, 240.72732283464567, 98.15283464566929, 98.90913385826772],
"depth": 1,
"extInfo": {
"property": {
"strokeStyle": { // 线条样式
"lineCap": "FLAT", // 线端类型(平/圆/方)
"lineJoin": "ROUND", // 连接类型(圆角/斜角/棱台)ROUND|MITER|BEVEL
"miterLimit": null, // 连接类型-斜角:最大斜接长度
"lineDash": "SOLID", // 短划线类型(线、点、短线、长短交替等)
"lineCompound": "SINGLE", // 复合类型(单线、双线、三线等)
"lineHeadDecoration": null, // 开始箭头类型
"lineTailDecoration": null, // 结尾箭头类型
"lineWidth": 1, // 线条宽度
"paint": { // 画笔样式,结构同 fillStyle
"type": "color",
"color": {
"scheme": "accent1",
"color": -12291388,
"shade": 15000,
"realColor": -15258543
}
}
},
"textDirection": "HORIZONTAL", // 文本方向
"anchor": [267.6364566929134, 240.72732283464567, 98.15283464566929, 98.90913385826772],
"textVerticalAlignment": "MIDDLE",
"fillStyle": {
"color": {
"scheme": "accent2",
"color": -1213135,
"realColor": -1213135
},
"type": "color"
},
"geometry": {
"name": "triangle"
},
"textAutofit": "NORMAL",
"realType": "Auto",
"shapeType": "triangle",
"textInsets": [3.6, 7.2, 3.6, 7.2]
}
},
"children": [
{
"pid": "4",
"id": "5",
"text": "",
"type": "p",
"extInfo": {
"property": {
"leftMargin": 0,
"textAlign": "CENTER"
}
},
"depth": 2,
"children": []
}
]
},
{
"id": "6",
"type": "image", // 图片
"point": [ 535.9091338582678, 238.72732283464567, 127.36362204724409, 127.36362204724409],
"depth": 1,
"extInfo": {
"property": {
"image": "data:image/jpeg;base64,xxx", // 图片数据 url/base64
"fileName": "image1.jpg", // 图片文件名
"extension": ".jpg", // 图片文件后缀
"realType": "Picture",
"shapeType": "rect",
"anchor": [535.9091338582678,238.72732283464567,127.36362204724409,127.36362204724409], // 相对位置 [x,y,width,height]
"fillStyle": { // 填充
"type": "texture", // 类型:蒙版填充
"texture": { // 蒙版
"insets": [0, 0, 0, 0], // 图片裁剪 [top,left,bottom,right]
"stretch": [0, 0, 0, 0], // 图片拉伸 [top,left,bottom,right]
"flipMode": "NONE", // X,Y,XY,NONE
"imageData": "data:image/jpeg;base64,xxx", // 蒙版图片数据,在image类型中数据等于 extInfo.property.image 图片数据
"alpha": 100000, // 透明度 => alpha / 100000
"contentType": "image/jpeg", // 图片内容类型
"alignment": null // TOP/TOP_LEFT/TOP_RIGHT/LEFT/BOTTOM/BOTTOM_LEFT/BOTTOM_RIGHT/RIGHT/CENTER
}
},
"geometry": {
"name": "rect"
},
"contentType": "image/jpeg"
}
},
"children": []
}
]
}
]
}
颜色填充说明
形状填充 fillStyle 和 线条画笔 paint 、文字 fontColor 都是同样填充数据结构
-
无填充
{
"type": "noFill"
}
-
颜色填充
{
"type": "color",
"color": {
"scheme": null, // 主题色,对应母版主题颜色中的 accent1/accent2/...
"color": -16777216, // 颜色(32bit ARGB) color = (A & 255) << 24 | (R & 255) << 16 | (G & 255) << 8 | (B & 255) << 0, R => (color >> 16) & 255
"realColor": -16777216, // 真正颜色(计算后的颜色)
"alpha": null, // 透明度,alpha / 100000.0 * 255
"hueMod": null, // hsv 色相
"hueOff": null, // 偏移
"satMod": null, // hsv 饱和度
"satOff": null, // 偏移
"lumMod": null, // hsv 亮度 lumMod / 100000 => 85000=0.85; 95000=0.95; 50000=0.5
"lumOff": null, // 偏移
"shade": null,
"tint": null
}
}
注意:上面颜色渲染是用 realColor 字段即可,修改也是改 realColor 字段,同时把其他字段设置为 null
颜色是按位或计算得出来的整数类型,转换方式如下:
int32 颜色转 rgba 前端颜色:
let color = -16777216 // ARGB
let r = (color >> 16) & 255 // 红 0-255
let g = (color >> 8) & 255 // 绿 0-255
let b = (color >> 0) & 255 // 蓝 0-255
let a = ((color >> 24) & 255) / 255 // 透明度 0-255 转小数 0-1
let rgba = `rgba(${r}, ${g}, ${b}, ${a})`
rgba转int32
let r = 255
let g = 255
let b = 255
let a = 255
let color = (a & 255) << 24 | (r & 255) << 16 | (g & 255) << 8 | (b & 255) << 0
-
渐变颜色
{
"type": "gradient",
"gradient": {
"gradientType": "linear", // 类型:linear,circular,rectangular,shape
"colors": [ // 渐变颜色 color-stop
{
"type": "color",
"color": {
"scheme": null, // 主题色
"color": -16777216, // 颜色(32bit ARGB)
"realColor": -16777216 // 真正颜色(计算后的颜色)
}
},
{
"type": "color",
"color": {
"scheme": null, // 主题色
"color": -14787035, // 颜色(32bit ARGB)
"realColor": -14787035 // 真正颜色(计算后的颜色)
}
}
],
"fractions": [0.5, 0.5], // offset比例 0-1
"angle": null, // 角度(确定方向)
"insets": null // 射线中所在访问占比 [1,0.5,0.5,1]
}
}
-
蒙版
{
"type": "texture",
"texture": {
"imageData": "data:image/jpeg;base64,xxx", // 图片数据(URL/base64)
"contentType": "image/png", // 图片类型
"alpha": 100000, // 透明度 => alpha / 100000
"insets": [0, 0, 0, 0], // 图片裁剪 [top,left,bottom,right]
"stretch": [0, 0, 0, 0], // 图片拉伸 [top,left,bottom,right]
"flipMode": "NONE", // X,Y,XY,NONE
"alignment": null // TOP/TOP_LEFT/TOP_RIGHT/LEFT/BOTTOM/BOTTOM_LEFT/BOTTOM_RIGHT/RIGHT/CENTER
}
}
-
图案
{
"type": "pattern",
"pattern": {
"prst": "vert", // 预置图案类型
"bgColor": { // 背景色
"type": "color",
"color": {
"scheme": null,
"color": -16777216,
"realColor": -16777216
}
},
"fgColor": { // 前景色
"type": "color",
"color": {
"scheme": null,
"color": -14787035,
"realColor": -14787035
}
}
}
}
-
容器颜色
{
"type": "groupFill" // 使用父元素容器 container 中的 groupFillStyle 颜色进行填充
}
-
背景颜色
{
"type": "bgFill" // 使用背景颜色填充
}
容器嵌套说明
容器 container 嵌套后子元素中的位置使用的是相对位置,偏移和缩放取决于父容器中的 interiorAnchor 属性
容器对象结构属性示例:
{
"anchor": [10, 20, 100, 200], // 容器位置 [x,y,width,height]
"interiorAnchor": [5, 10, 200, 400], // 内部位置 [x,y,width,height]
"flipHorizontal": false, // 水平翻转
"flipVertical": false, // 垂直翻转
"rotation": 0, // 旋转角度
"groupFillStyle": null // 容器填充颜色,给子元素 groupFill 用
}
子元素位置计算方式
// scaleX = anchor[2] / interiorAnchor[2]
// scaleY = anchor[3] / interiorAnchor[3]
// 元素真实x = 元素x * scaleX + 容器x - 容器内部偏移x * scaleX
// 元素真实y = 元素y * scaleY + 容器y - 容器内部偏移y * scaleY
// 元素真实w = 元素w * scaleX
// 元素真实h = 元素h * scaleY