缘起于进行了一次在线 Office 解决方案的调研,对比了 Office365、可道云、WPS Office、PageOffice 等厂商,最终敲定了使用 Onlyoffice,故整理了一份 Onlyoffice 从零开始系列教程,这是第三篇。

本篇文章提到的代码片段和预览效果均在 demo-onlyoffice Github,克隆后对照查看会有更好的阅读体验。

Onlyoffice 具有强大的插件机制,并提供了完整的插件开发文档,可以完全根据业务定制插件。

Onlyoffice 插件基本结构

我们先来看下插件目录结构:

1
2
3
4
5
6
7
8
.
├── config.json # 插件配置文件
├── icon.png # 插件图标
├── icon@2x.png
├── index.html # 插件入口文件
├── main.js # 插件主程序入口文件
└── translations # 国际化配置
└── zh-CN.json

如上图,插件结构非常简单,里面主要是 config.jsonindex.htmlmain.js

一个常规插件的 config.json 配置项如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
{
// 插件名称
"name": "字体替换",
// 插件 id,固定格式
"guid": "asc.{11700c35-1fdb-4e37-9edb-b31637139601}",
"variations": [
{
// 插件描述
"description": "数字字体替换",
// 这个是页面地址,外部如果不是 index.html,也需要在这里改一下
"url": "index.html",
// 插件图标,建议 1 倍图和 2 倍图都配置下
"icons": [
"icon.png",
"icon@2x.png"
],
// 仅预览模式时,插件是否要启用,默认值:false
"isViewer": false,
// 插件支持的文档类型,可选值:word、cell、slide
"EditorsSupport": [
"word"
],
// 插件是否具有 UI 视图
"isVisual": true,
// 插件是否以弹框形式打开
"isModal": false,
// 指定要从编辑器中传递的数据类型,可选值:text、html、ole、desktop、destop-external、none
"initDataType": "none",
// 插件启动时从编辑器传递的数据,与 initDataType 配合使用,如果 initDataType 设置 text 则插件启动时会收到当前编辑器所选中的文本
"initData": "",
// 插件可使用的按钮列表
"buttons": [],
// 需要用到的事件需要在这里先注册
"events" : [
"onClick"
]
}
]
}

一个常规插件的 index.html 结构内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title></title>
<!-- 可以引入外部的 js 脚本 -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
<!-- 这个是插件 js,基本是必须要引入的 -->
<script src="https://onlyoffice.github.io/sdkjs-plugins/v1/plugins.js"></script>
<!-- 这里的 main.js 就是插件结构里面的 main.js -->
<script src="main.js"></script>
</head>

<body>
<!-- 这里是 html 区域,H5 的标签都可以在这里使用,设置 id 然后到 main.js 里面绑定事件 -->
<!-- 操作 -->
<button id="button">按钮</button>
</body>
</html>

一个常规插件的 main.js 结构内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
(function(window, undefined) {
window.Asc.plugin.init = function(initData) {
// 自定义逻辑
// ...

// 在插件 iframe 之外释放鼠标按钮时调用的函数
window.Asc.plugin.onExternalMouseUp = function() {
var event = document.createEvent('MouseEvents')
event.initMouseEvent('mouseup', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null)
document.dispatchEvent(event)
}

window.Asc.plugin.button = function(id) {
// 被中断或关闭窗口
if (id === -1) {
this.executeCommand('close', '')
}
}
}
})(window, undefined)

以上是 Onlyoffice 插件的 JS 模板写法,每一个插件初始化都可以用这个结构,然后再补充自定义逻辑即可。

这里要注意,插件里面不建议直接写 ES6 的语法,可能会不兼容,除非是配置了 babel 来转换。

实现一个最简单的 Onlyoffice 插件

这里我们实现一个点击按钮向文档里面添加一个「Hello world」文本的插件。config.jsonindex.html 内容都比较简单,主要看下 JS 里面的实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
(function(window, undefined) {
window.Asc.plugin.init = function(initData) {
var me = this
$('#addText').click(function() {
// 官方提供的回调函数,所有操作文档的 API 都可以在这里面使用
me.callCommand(function() {
try {
// 获取文档对象
var oDocument = Api.GetDocument()
// 生成一个新的段落对象
var oParagraph = Api.CreateParagraph()
// 往段落里面添加一个字符串文本
oParagraph.AddText('Hello world')
// 最后往文档里面添加一个段落对象
oDocument.Push(oParagraph)
} catch (error) {
console.error(error)
}
}, false, true, function () {
console.log('ok')
})
})

// 在插件 iframe 之外释放鼠标按钮时调用的函数
window.Asc.plugin.onExternalMouseUp = function() {
var event = document.createEvent('MouseEvents')
event.initMouseEvent('mouseup', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null)
document.dispatchEvent(event)
}

window.Asc.plugin.button = function(id) {
// 被中断或关闭窗口
if (id === -1) {
this.executeCommand('close', '')
}
}
}
})(window, undefined)

然后将插件添加到 Onlyoffice 配置项:

1
2
3
4
editorConfig.plugins = {
autostart: [],
pluginsData: ['http://IP/static/plugins/plugin-hello/config.json']
}

最终实现效果如下:

当前示例页面访问路径:http://127.0.0.1:3001/onlyoffice/document/plugin

Onlyoffice 插件常用 API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 获取文档对象,几乎写插件都会用到
var oDocument = Api.GetDocument()

// 创建一个段落对象
var oParagraph = Api.CreateParagraph()

// 创建一个文本对象
var oRun = Api.CreateRun()

// 添加文本
oParagraph.AddText()
oDocument.AddText()

// 节点 Push 方法
oParagraph.Push()
oDocument.Push()

// 选中当前节点
oRun.Select()

// 字体加粗
oRun.SetBold(true)
// 设置字体
oRun.SetFontFamily('微软雅黑')
// 设置字体大小
oRun.SetFontSize(30)
// 设置背景色
oRun.SetHighlight(255, 255, 0)

// ...

更多插件语法可移步 Onlyoffice 插件开发文档

公众号

程序员未央