缘起于进行了一次在线 Office 解决方案的调研,对比了 Office365、可道云、WPS Office、PageOffice 等厂商,最终敲定了使用 Onlyoffice,故整理了一份 Onlyoffice 从零开始系列教程,这是第三篇。
Onlyoffice 具有强大的插件机制,并提供了完整的插件开发文档,可以完全根据业务定制插件。
Onlyoffice 插件基本结构
我们先来看下插件目录结构:
1 2 3 4 5 6 7 8
| . ├── config.json ├── icon.png ├── [email protected] ├── index.html ├── main.js └── translations └── zh-CN.json
|
如上图,插件结构非常简单,里面主要是 config.json
、index.html
和 main.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": "字体替换", "guid": "asc.{11700c35-1fdb-4e37-9edb-b31637139601}", "variations": [ { "description": "数字字体替换", "url": "index.html", "icons": [ "icon.png", "[email protected]" ], "isViewer": false, "EditorsSupport": [ "word" ], "isVisual": true, "isModal": false, "initDataType": "none", "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> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script> <script src="https://onlyoffice.github.io/sdkjs-plugins/v1/plugins.js"></script> <script src="main.js"></script> </head>
<body> <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) {
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.json
、index.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() { 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') }) })
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()
oParagraph.Push() oDocument.Push()
oRun.Select()
oRun.SetBold(true)
oRun.SetFontFamily('微软雅黑')
oRun.SetFontSize(30)
oRun.SetHighlight(255, 255, 0)
|
更多插件语法可移步 Onlyoffice 插件开发文档
公众号