开放接口
线上接口地址:https://docmee.cn (这个是线上正常运行的产品,API对接进入开放平台即可)
SDK
-
iframe ui
-
js / html
-
vue2
-
vue3
-
react
-
java
-
python
-
go
-
.net / c#
-
php
-
c++
接口鉴权
创建接口 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
-
方案四: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"}'
自定义模板
上传用户自定义模板
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:
关于上面 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