onlyoffice基础环境搭建+部署+demo可直接运行 最简单的入门

news2025/1/16 15:53:04

office这个体系分为四个大教程

        1、【document server文档服务器基础搭建】

        2、【连接器(connector)或者jsApi调用操作office】-进阶

        3、【document builder文档构造器使用】-进阶

        4、【Conversion API(文档转化服务)】-进阶

         如果需要连接器,可以查看:onlyofficeV7.5.1 jsApi调用 进阶开发 二次开发 连接器(connector)开发 - 知乎 (zhihu.com)

1、onlyoffice软件本身的部署

        这里主要介绍docker版本,因为在学习过程中发现,onlyoffice本身很大,最好还是独立部署一台服务器,避免和其他资源冲突,所以结合当前的技术路线,docker是比较好的选择。

2、拉取docker镜像,并启动

        2.1、首先我们拉取docker镜像,推荐先用7.3.3进行测试,从7.5之后启动需要带有token标识,太麻烦,图例用的是windows下的docker desktop,linux下同理,可以使用docker的web界面管理工具进行操作比如:macrozheng:吊炸天的 Docker 图形化工具 Portainer,必须推荐给你!

图1、拉取镜像

        2.2、等着镜像拉取完成,我们来启动它,点击右边的启动按钮

图2、准备启动

        2.3、之后会打开一个配置框,这里就看个人了,我习惯映射一个端口。【注意】7.3之后,最好加上JWT_ENABLED这个配置,不然会有问题,毕竟官方开始收费了。

图3、启动配置

        2.4、接下来等着启动完成就可以了,日志大概是这样的

图4、启动日志图例

------------------------------------以上为office软件本身的部署-------------------------------

3、集成html或者vue

        3.1、这里使用html原生最为直观,vue也一样,只是封装了几个方法。

        3.2、onlyoffice编辑器需要如下几个必须配置才可以正常使用

1、config配置
config的完整文档:https://api.onlyoffice.com/editors/config/
我们下面使用【必要参数】的简化做讲解

2、callback回调
回调的最要说明,status:https://api.onlyoffice.com/editors/callback
回调是后端的实现,只有一个目的,接受office保存文件通知,然后你就可以拿到前端保存文件进行操作
    比如:上传minio、保存到本地等等

        3.3、config样例,这个样例可以直接使用不用调整

var config = {
        "documentType": "word",
        "document": {
            "title": "【经营】通用合同模板.docx",
            "url": "https://d2nlctn12v279m.cloudfront.net/assets/docs/samples/zh/demo.docx",
            // 当前用户对于当前文档的操作权限
            "permissions": {
                "print": false,
                "download": true
            },
            "fileType": "docx",
            onlyoffice用key做文件缓存索引,推荐每次都随机生成一下,不然总是读取缓存
            "key": "e932e7bb1e4d449aa9a7d8ss517"
        },
        "editorConfig": {
            // 编辑器常规配置
            "customization": {
                // 自动保存可以关闭,常规ctrl+s更好用
                "autosave": false,
                "compactToolbar": true,
                "forcesave": true,
                "toolbarNoTabs": true,
                "help": false,
                "compactHeader": true,
                "hideRightMenu": true,
            },
            "mode": "edit",
            这个回调及其的重要
            "callbackUrl": "https://www.onlyoffice.com/post.ashx?type=editor-callback",
            // 菜单显示语言
            "lang": "zh-CN",
            // 当前操作用户信息
            "user": {
                "name": "曹瑞剑雄",
                "id": "103"
            }
        }
    };

        【url】一定使用真实的IP或者域名,不要使用127.0.0.1或者localhost

        因为office容器/服务器,不是你的localhost,它需要读取你电脑上的文件,只能有真实IP/域名。

        【callbackUrl】,开放所有方法,不要指定只能用get或者post。

        前期调试的时候,直接返回{"error":0}就可以,等调通后再考虑逻辑处理。

        3.4、后端样例,包含:status说明和接收信息流实现

public enum OnlyOfficeCallBackStatus {
    SUCCESS(0, "通用"),
    EDIT(1, "正在编辑文档"),
    READY_TO_SAVE(2, "文档已准备好保存"),
    SAVE_ERROR(3, "发生文档保存错误"),
    CLOSE_NO_CHANGE(4, "文档已关闭,没有任何更改"),
    SAVE(6, "保存"),
    FORCE_SAVE_ERROR(7, "强制保存文档时发生错误"),

    ;

    private final Integer code;
    private final String message;

    OnlyOfficeCallBackStatus(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    public boolean equals(Integer code) {
        return this.code.equals(code);
    }
}

service实现,仅供参考,用什么语言都行。

/**
     * 回调
     */
    @Override
    public String callback(HttpServletRequest request, HttpServletResponse response) throws IOException {
        log.info("传入的参数:" + request.getParameterMap());
        String body = "";
        try {
            Scanner scanner = new Scanner(request.getInputStream());
            scanner.useDelimiter("\\A");
            body = scanner.hasNext() ? scanner.next() : "";
            scanner.close();
        } catch (Exception ex) {
            return "";
        }

        if (body.isEmpty()) {
            throw new IOException("ONLYOFFICE回调保存请求体未空");
        }

        JSONObject jsonObj = JSONUtil.parseObj(body);
        log.info("body数据:" + jsonObj);
        int status = jsonObj.getInt("status");

        if (status == 2 || status == 3 || status == 6){
            String serverFielUrl = jsonObj.getStr("url");
            HttpResponse res = HttpRequest.get(serverFielUrl).execute();
            InputStream in = res.bodyStream();

            // 模板路径
            String fileName = cn.hutool.core.lang.UUID.randomUUID().toString().replace("-", "") + "_create." + jsonObj.getStr("filetype");
            String templatePath = getClass().getClassLoader().getResource("").getPath();
            templatePath += fileName;
            log.info("文件保存地址:" + templatePath);
            File tempFile = new File(templatePath);
            try {
                FileUtils.copyInputStreamToFile(in, tempFile);


            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return "{\"error\":0}";
    }

4、前端的demo,可以直接运行,我这边搭建了体验服务器版本为:7.5.1

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title></title>
    <script type="text/javascript" src="http://47.94.91.67:10100/web-apps/apps/api/documents/api.js"></script>
    <style>
        body {
            width: 100%;
            height: 90vh;
            display: flex;
            flex-direction: column;
        }
        
        #placeholder {
            width: 100%;
            height: 100vh;
        }
    </style>
</head>

<body>
    <div id="placeholder" class="nav" style="width: 100%; height: 100vh;"></div>

</body>
<script>

    var onDocumentReady = function () {
        console.log("文档准备好了");
    };


    var config = {
        "documentType": "word",
        "historyList": {
            "history": [],
            "currentVersion": "1"
        },
        "document": {
            "title": "【经营】通用合同模板.docx",
            "url": "https://d2nlctn12v279m.cloudfront.net/assets/docs/samples/zh/demo.docx",
            "permissions": {
                "print": false,
                "download": true
            },
            "attachId": "e932e7bb1e4d449aa9a7d8b403b4b517",
            "fileType": "docx",
            "key": "e932e7bb1e4d449aa9a7d8ss517"
        },
        "editorConfig": {
            "customization": {
                "autosave": false,
                "compactToolbar": true,
                "forcesave": true,
                "toolbarNoTabs": true,
                "help": false,
                "compactHeader": true,
                "hideRightMenu": true,
            },
            "mode": "edit",
            "callbackUrl": "https://www.onlyoffice.com/post.ashx?type=editor-callback",
            "lang": "zh-CN",
            "user": {
                "name": "曹瑞剑雄",
                "id": "103"
            }
        }
    };


    var docEditor;
    initDocEditor();
    

    /**
     * 初始化编辑器
     */
    function initDocEditor() {
        // 初始化配置
        config['events'] = {
            onDocumentReady: onDocumentReady
        };
        docEditor = new DocsAPI.DocEditor("placeholder", config);
    }


</script>

</html>

整个代码的核心就是:docEditor =newDocsAPI.DocEditor("placeholder", config);这句话, 包含两个参数: 第一个参数是需要使用的渲染容器ID,比如div 第二个就是初始化编辑器所需要的配置信息

----------------------------------以上是先跑起来的步骤------------------------------------

5、onlyoffice基础原理讲解

        5.1、office本身有:DOCUMENT SERVER(文档服务器)、DOCUMENT BUILDER(文档生成器)、 Conversion API(转化API)

        对于绝大部分公司的业务,目前只用到DOCUMENT SERVER(文档服务器)就可以了,其他的进阶教程【后续补充】

1、DOCUMENT SERVER(文档服务器) 
  用于web页面编辑office文件,也就是最最基础的功能。上面的实例就是DOCUMENT SERVER(文档服务器) 
2、DOCUMENT BUILDER(文档生成器) 
  用于通过代码生成或者操作office文件,比如后端常用的:poi等框架,onlyoffice本身也提供了这个功能【进阶】 
3、Conversion API(转化API) 
  部分公司业务上会需要对文件进行转化,onlyoffice也提供了这样的功能,比如word->html、word->pdf等等【进阶】

5.2、DOCUMENT SERVER(文档服务器)前后端如何进行交互,这里借用一个图

交互流程

简单来说就是:前端操作->onlyoffice->你的后端callback 如果你有做过微信之类的回调就会比较清晰,office服务器作为中介,用于处理前端与后端的连通。 除此之外,再无其他。

6、结语

        如果你看到了这里,发现想调用前端API操作word等等,那么你需要看进阶教程了。

比如:

        jsAPi操作office文档,官方叫做connector(链接器)

        替代poi、easyExcel、phpExcel等后端操作office文档等

        有word、excel、pdf、html等相互转化需求的

7、进阶教程正在编写,包含上面所关心的内容

        2、【连接器(connector)或者jsApi调用操作office】-进阶

        3、【document builder文档构造器使用】-进阶

        4、【Conversion API(文档转化服务)】-进阶

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1458833.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SpringBoot3】Spring Security 常用注解

注&#xff1a;本文基于Spring Boot 3.2.1 以及 Spring Security 6.2.1 Spring Security 6 的常用注解包括以下几种&#xff0c;通过这些注解可以更加方便的控制资源权限。 Secured &#xff1a;方法执行前检查&#xff0c;直接判断有没有对应的角色PreAuthorize&#xff1a;方…

Jmeter实现阶梯式线程增加的压测

安装相应jmeter 插件 1&#xff1a;安装jmeter 管理插件&#xff1a; 下载地址&#xff1a;https://jmeter-plugins.org/install/Install/&#xff0c;将下载下来的jar包放到jmeter文件夹下的lib/ext路径下&#xff0c;然后重启jmeter。 2&#xff1a;接着打开 选项-Plugins Ma…

【FastAPI】P3 请求与响应

目录 请求路径参数查询参数 响应JSON 响应文本响应返回 Pydantic 模型 在网络通讯中&#xff0c;请求&#xff08;Request&#xff09; 与 响应&#xff08;Response&#xff09; 扮演着至关重要的角色&#xff0c;它们构成了客户端与服务器间互动的根本理念。 请求&#xff0…

PMP考完之后考什么,NPDP值得考吗?

PMP考完之后可以考虑考一个NPDP证书&#xff0c;从事新产品开发相关工作的学习下NPDP是很有必要的~参与新产品开发相关的中高层管理人员&#xff0c;产品团队成员等非常适合学习NPDP。 一、什么是NPDP&#xff1f; NPDP 是产品经理国际资格认证&#xff0c;美国产品开发与管理…

【MySQL初阶】索引

1. 索引基本概念 1.1 索引介绍 索引(index)&#xff1a;是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或者多列创建索引&#xff0c;并指定索引的类型&#xff0c;各类索引有各自的数据结构实现。&#xff08;具体细节在MySQL进阶章节详…

如何使用IP代理解决亚马逊账号IP关联问题?

亚马逊账号IP关联问题是指当同一个IP地址下有多个亚马逊账号进行活动时&#xff0c;亚马逊会将它们关联在一起&#xff0c;从而可能导致账号被封禁或限制。 为了避免这种情况&#xff0c;许多人选择使用IP代理。 IP代理为什么可以解决亚马逊IP关联问题&#xff1f; IP代理是…

3d模型渲染了是白色的什么原因?怎么解决?--模大狮模型网

3D模型渲染成白色的原因可能有几种情况&#xff1a; 一&#xff1a;材质设置问题 检查模型的材质设置&#xff0c;确保正确指定了颜色或纹理。有时候&#xff0c;默认的材质颜色可能是白色&#xff0c;您可以尝试修改材质属性来改变渲染结果。 二&#xff1a;光照设置问题 检…

点餐|外卖订餐小程序|基于微信小程序的外卖订餐系统设计与实现(源码+数据库+文档)

点餐|外卖订餐小程序目录 目录 基于微信小程序的外卖订餐系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户微信端功能模块 2、管理员服务端功能模块 3、商家务端功能模块 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设…

【Java多线程】线程安全问题与解决方案

目录 1、线程安全问题 1.2、线程安全原因 2、线程加锁 2.1、synchronized 关键字 2.2、完善代码 2.3、对同一个线程的加锁操作 3、内容补充 3.1、内存可见性问题 3.2、指令重排序问题 3.3、解决方法 3.4、总结 volatile 关键字 1、线程安全问题 某个代码&#xff…

雷卯有多种封装3.3V的ESD DIODE供您选择

一&#xff0e;3.3V ESD型号如下 二&#xff0e;多种多路封装 三&#xff0e;3.3V保护方案 方案优点&#xff1a;用于满足IC VCC 3.3V的静电浪涌保护&#xff0c;根据电源所处环境选择合适保护电流的ESD器件&#xff1b;高速传输接口选择超低电容ULC0511CDN&#xff0c;保证信…

友点CMS GetSpecial SQL注入漏洞复现

0x01 产品简介 友点CMS是一款高效且灵活的网站管理系统,它为用户提供了简单易用的界面和丰富的功能。无论是企业还是个人,都能通过友点CMS快速搭建出专业且美观的网站。该系统支持多种内容类型和自定义模板,方便用户按需调整。同时,它具备强大的SEO功能,能提升网站在搜索…

高并发系统中常见的问题

在当今的高并发系统中&#xff0c;常见的问题是多种多样的&#xff0c;这些问题往往会对系统的稳定性和性能产生重大影响。本文将详细介绍高并发系统中常见的问题&#xff0c;并探讨其产生原因和解决方案。 一、高并发系统概述 高并发系统是指在同一时间内有大量用户同时访问…

Sui在Dacade推出Move课程,完成学习奖励SUI

Dacade推出了一门Sui开发者课程&#xff0c;通过一系列引人入胜的挑战&#xff0c;为开发者提供了一个沉浸式的Move技术之旅。在这门课程中&#xff0c;Dacade的教育材料将引导用户利用Sui强大的DeFi原生功能&#xff08;包括DeepBook和zkLogin&#xff09;构建DeFi应用。此外&…

Tofu5m 高速实时推理Yolov8

Tofu5m 是高性价比目标识别跟踪模块&#xff0c;支持可见光视频或红外网络视频的输入&#xff0c;支持视频下的多类型物体检测、识别、跟踪等功能。 实测视频链接&#xff1a;Tofu5m识别跟踪模块_哔哩哔哩_bilibili 产品支持视频编码、设备管理、目标检测、深度学习识别、跟踪…

c++类和对象新手保姆级上手教学(中)

前言&#xff1a; 类和对象中篇&#xff0c;这里讲到的前4个默认成员函数&#xff0c;是类和对象中的重难点&#xff0c;许多资料上的讲法都非常抽象&#xff0c;难以理解&#xff0c;所以我作出这篇总结&#xff0c;分享学习经验&#xff0c;以便日后复习。 目录 6个默认成员…

基于uniapp微信小程序的汽车租赁预约系统

随着现代汽车租赁管理的快速发展&#xff0c;可以说汽车租赁管理已经逐渐成为现代汽车租赁管理过程中最为重要的部分之一。但是一直以来我国传统的汽车租赁管理并没有建立一套完善的行之有效的汽车租赁管理系统&#xff0c;传统的汽车租赁管理已经无法适应高速发展&#xff0c;…

【lesson59】线程池问题解答和读者写者问题

文章目录 线程池问题解答什么是单例模式什么是设计模式单例模式的特点饿汉和懒汉模式的理解STL中的容器是否是线程安全的?智能指针是否是线程安全的&#xff1f;其他常见的各种锁 读者写者问题 线程池问题解答 什么是单例模式 单例模式是一种 “经典的, 常用的, 常考的” 设…

MySQL多实例部署:从概念到实操的全面指南

目录 MySQL多实例管理 单实例 什么是多实例 多实例的好处 多实例的弊端 MySQL多实例用在哪些场景 资金紧张的公司 用户并发访问量不大的业务 大型网站也有用多实例 部署MySQL多实例 rpm和源码的优缺点 二进制方式安装mysql 准备二进制mysql运行所需的环境 准备多…

ENG-2 AM,绿色钠离子探针,能够与常用的显微镜和光谱仪兼容

文章关键词&#xff1a;ENG-2 AM&#xff0c;钠离子荧光探针ENG-2&#xff0c;绿色钠离子探针 一、基本信息 产品简介&#xff1a;Enhanced NaTrium Green-2 AM (ENG-2 AM) 是一种新型的钠离子&#xff08;Na&#xff09;荧光探针&#xff0c;它作为 Asante NaTrium Green-2 …

[Bug解决] Invalid bound statement (not found)出现原因和解决方法

1、问题描述 在写了一个很普通的查询语句之后&#xff0c;出现了下面的报错信息 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xxx.oauth.mapper.WxVisitorQrBeanMapper.selectByComIdAndEmpId at org.apache.ibatis.binding.Mappe…