文多多aippt(AI自动生成PPT文档项目)开放API接口免费测试

开放接口

线上接口地址:https://docmee.cn (这个是线上正常运行的产品,API对接进入开放平台即可)

SDK

接口鉴权

创建接口 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"}'

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

相关推荐
九年义务漏网鲨鱼1 小时前
【推荐算法】推荐系统中的特征工程
人工智能·算法·机器学习·推荐算法·特征工程
剑盾云安全专家2 小时前
探索智能时代:如何利用AI一键生成PPT改变演示文稿的制作方式
人工智能·aigc·powerpoint·软件
DW_DROME2 小时前
gz中生成模型
人工智能·机器人·自动驾驶
GPT祖弘3 小时前
【模型对比】ChatGPT vs Kimi vs 文心一言那个更好用?数据详细解析,找出最适合你的AI辅助工具!
人工智能·chatgpt·文心一言
2301_821026953 小时前
3款在线抠图工具!效率嘎嘎高
图像处理·人工智能·语音识别
道友老李3 小时前
【OpenCV】基于分水岭算法的图像分割
人工智能·python·opencv·计算机视觉
Jason_zhao_MR3 小时前
基于米尔全志T527开发板的OpenCV进行手势识别方案
人工智能·mcu·opencv·计算机视觉·嵌入式
Geek极安网络安全3 小时前
2024年安徽省职业院校技能大赛水利工程BIM建模与应用
大数据·服务器·网络·人工智能·php·职业院校
ZHOU_WUYI3 小时前
HuggingGPT Solving AI Tasks with ChatGPT and its Friends in Hugging Face 论文解读
人工智能