SpringBoot项目集成ONLYOFFICE

news2024/11/26 22:25:32

ONLYOFFICE 文档8.2版本已发布:PDF 协作编辑、改进界面、性能优化、表格中的 RTL 支持等更新

文章目录

  • 前言
  • ONLYOFFICE 产品简介
  • 功能与特点
  • Spring Boot 项目中集成 OnlyOffice
    • 1. 环境准备
    • 2. 部署OnlyOffice Document Server
    • 3. 配置Spring Boot项目
    • 4. 实现文档编辑功能
    • 5. 文档保存与版本控制
      • (1)配置文件 `application.properties`
      • (2)依赖管理 `pom.xml`
      • (3)控制器 `DocumentController.java`
      • (4)配置类 `OnlyOfficeConfig.java`
      • (5)文档服务类 `DocumentService.java`
      • (6)文档模型类 `Document.java`
      • (7)前端页面 `index.html`
      • (8)用户服务类 `UserService.java`(可选)
      • (9)修改控制器以添加权限验证 `DocumentController.java`
    • 6. 安全性和权限管理
  • 体验与测评
  • 8.2 版本的其他更新:
  • 结尾:ONLYOFFICE 项目介绍


前言

提示:这里可以添加本文要记录的大概内容:

随着互联网技术的发展,越来越多的企业和个人开始寻求高效的在线文档处理解决方案。传统的本地文档编辑软件虽然功能强大,但在多用户协同工作方面存在诸多不便。为了满足这一需求,市场上涌现出了许多优秀的在线文档编辑工具,其中OnlyOffice因其出色的性能和灵活的集成能力而受到广泛好评。本文将详细介绍如何在Spring Boot项目中集成OnlyOffice,实现文档的在线编辑功能,并分享OnlyOffice的产品特点和用户体验。

ONLYOFFICE 产品简介

OnlyOffice是一套完整的开源办公套件,旨在为企业和个人提供高效的文档处理解决方案。它包含文字处理、电子表格和演示文稿三种类型的文档编辑器,支持多种文档格式的读取和编辑。OnlyOffice不仅提供了丰富的桌面应用程序,还拥有强大的Web版编辑器——OnlyOffice Document Server,后者可以方便地集成到各类Web应用中,实现文档的在线编辑和协作。

功能与特点

  • 全面的文档支持:支持DOCXXLSXPPTX等多种文档格式的编辑和转换。
  • 实时协作编辑:允许多个用户同时编辑同一文档,所有更改实时同步。
  • 权限管理:提供细粒度的文档访问权限控制,确保文档的安全性。
  • 版本管理:自动记录文档的历史版本,便于追踪修改记录和恢复早期版本。
  • 插件扩展:支持通过插件扩展编辑器的功能,满足更多个性化需求。
  • API接口丰富:提供RESTful APIJavaScript API,方便开发者集成到现有系统中。

Spring Boot 项目中集成 OnlyOffice

1. 环境准备

  • Java环境:确保已经安装了Java环境(建议JDK 1.8及以上版本)。
    在这里插入图片描述

  • 构建工具:安装MavenGradle作为项目的构建工具。
    在这里插入图片描述

  • Spring Boot项目:可以通过Spring Initializr快速创建一个Spring Boot项目基础框架。
    在这里插入图片描述

2. 部署OnlyOffice Document Server

  • 安装OnlyOffice:可以选择在本地或云服务器上安装OnlyOffice Document Server。官方提供了详细的安装指南,可以根据自己的操作系统选择合适的安装方法。
    在这里插入图片描述

  • 检查安装:安装完成后,确保Document Server能够正常访问,通常可以通过浏览器访问http://<your_server_ip>:80来检查是否成功安装。
    在这里插入图片描述

3. 配置Spring Boot项目

在这里插入图片描述

  • 添加配置:在Spring Boot项目的application.properties文件中添加OnlyOffice服务器的相关配置信息,如服务器地址等。
  onlyoffice.server.url=http://<your_server_ip>
  onlyoffice.server.secret=<your_secret_key>
  • 创建控制器:创建一个控制器(Controller)用于处理前端请求,调用OnlyOffice API进行文档的加载、保存等操作。
  @RestController
  @RequestMapping("/documents")
  public class DocumentController {

      @Value("${onlyoffice.server.url}")
      private String serverUrl;

      @Value("${onlyoffice.server.secret}")
      private String secretKey;

      @GetMapping("/{id}")
      public ResponseEntity<?> getDocument(@PathVariable String id) {
          // 调用OnlyOffice API获取文档编辑所需参数
          // ...
      }

      @PostMapping("/{id}")
      public ResponseEntity<?> saveDocument(@PathVariable String id, @RequestBody Document document) {
          // 处理文档保存逻辑
          // ...
      }
  }

4. 实现文档编辑功能

  • 前端集成:利用OnlyOffice提供的JavaScript API,在前端页面中嵌入文档编辑器。
  <div id="document-editor"></div>
  <script src="https://<your_server_ip>/web-apps/apps/api/documents/api.js"></script>
  <script>
      function onDocumentReady() {
          var docEditor = new DocsAPI.DocEditor("document-editor", {
              "document": {
                  "fileType": "docx",
                  "key": "<document_id>",
                  "title": "Sample Document",
                  "url": "https://<your_server_ip>/documents/<document_id>"
              },
              "documentType": "word",
              "editorConfig": {
                  "callbackUrl": "https://<your_backend_url>/documents/<document_id>",
                  "mode": "edit",
                  "lang": "en"
              },
              "customization": {
                  "actionBar": false,
                  "chat": false
              }
          });
      }
  </script>

5. 文档保存与版本控制

  • 保存文档:当用户完成编辑并保存文档时,OnlyOffice会将更新后的文档发送回指定的回调URL。
  @PostMapping("/{id}")
  public ResponseEntity<?> saveDocument(@PathVariable String id, @RequestBody Document document) {
      // 将文档保存到数据库或文件系统中
      // 记录版本信息
      return ResponseEntity.ok().build();
  }
  • 版本管理:记录文档的历史版本,便于追踪修改记录和恢复早期版本。

以下是Spring Boot项目中集成OnlyOffice的完整代码部分:

(1)配置文件 application.properties

onlyoffice.server.url=http://<your_server_ip>
onlyoffice.server.secret=<your_secret_key>

(2)依赖管理 pom.xml

<dependencies>
    <!-- Spring Boot Web Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Boot Thymeleaf Starter (可选,用于模板引擎) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>

    <!-- Spring Boot Security Starter (可选,用于安全控制) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

    <!-- JSON处理库 -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
    </dependency>
</dependencies>

(3)控制器 DocumentController.java

package com.example.onlyoffice.controller;

import com.example.onlyoffice.config.OnlyOfficeConfig;
import com.example.onlyoffice.model.Document;
import com.example.onlyoffice.service.DocumentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/documents")
public class DocumentController {

    @Autowired
    private OnlyOfficeConfig onlyOfficeConfig;

    @Autowired
    private DocumentService documentService;

    @GetMapping("/{id}")
    public ResponseEntity<Document> getDocument(@PathVariable String id) {
        Document document = documentService.getDocumentById(id);
        if (document == null) {
            return ResponseEntity.notFound().build();
        }
        return ResponseEntity.ok(document);
    }

    @PostMapping("/{id}")
    public ResponseEntity<Void> saveDocument(@PathVariable String id, @RequestBody Document document) {
        documentService.saveDocument(id, document);
        return ResponseEntity.ok().build();
    }

    @GetMapping("/config/{id}")
    public ResponseEntity<Object> getConfig(@PathVariable String id) {
        return ResponseEntity.ok(onlyOfficeConfig.getConfig(id));
    }
}

(4)配置类 OnlyOfficeConfig.java

package com.example.onlyoffice.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

@Component
public class OnlyOfficeConfig {

    @Value("${onlyoffice.server.url}")
    private String serverUrl;

    @Value("${onlyoffice.server.secret}")
    private String secretKey;

    public Map<String, Object> getConfig(String documentId) {
        Map<String, Object> config = new HashMap<>();
        config.put("document", Map.of(
                "fileType", "docx",
                "key", documentId,
                "title", "Sample Document",
                "url", serverUrl + "/documents/" + documentId
        ));
        config.put("documentType", "word");
        config.put("editorConfig", Map.of(
                "callbackUrl", serverUrl + "/documents/" + documentId,
                "mode", "edit",
                "lang", "en"
        ));
        config.put("customization", Map.of(
                "actionBar", false,
                "chat", false
        ));
        return config;
    }
}

(5)文档服务类 DocumentService.java

package com.example.onlyoffice.service;

import com.example.onlyoffice.model.Document;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.ArrayList;
import java.util.Collections;

@Service
public class DocumentService {

    private final Map<String, Document> documents = new HashMap<>();
    private final Map<String, List<Document>> history = new HashMap<>();

    public Document getDocumentById(String id) {
        return documents.get(id);
    }

    public void saveDocument(String id, Document document) {
        Document currentDocument = documents.get(id);
        if (currentDocument != null) {
            history.computeIfAbsent(id, k -> new ArrayList<>()).add(currentDocument);
        }
        documents.put(id, document);
    }

    public List<Document> getHistory(String id) {
        return history.getOrDefault(id, Collections.emptyList());
    }
}

(6)文档模型类 Document.java

package com.example.onlyoffice.model;

import lombok.Data;

@Data
public class Document {
    private String content;
    // 其他字段...
}

(7)前端页面 index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>OnlyOffice Document Editor</title>
</head>
<body>
<div id="document-editor" style="height: 600px;"></div>
<script src="https://<your_server_ip>/web-apps/apps/api/documents/api.js"></script>
<script>
    async function loadDocumentEditor() {
        const response = await fetch('/documents/config/<document_id>');
        const config = await response.json();

        new DocsAPI.DocEditor("document-editor", config);
    }

    window.onload = loadDocumentEditor;
</script>
</body>
</html>

(8)用户服务类 UserService.java(可选)

package com.example.onlyoffice.service;

import org.springframework.stereotype.Service;

@Service
public class UserService {

    public boolean hasAccess(String username, String documentId) {
        // 这里实现具体的权限验证逻辑
        // 示例:假设所有用户都有访问权限
        return true;
    }
}

(9)修改控制器以添加权限验证 DocumentController.java

package com.example.onlyoffice.controller;

import com.example.onlyoffice.config.OnlyOfficeConfig;
import com.example.onlyoffice.model.Document;
import com.example.onlyoffice.service.DocumentService;
import com.example.onlyoffice.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/documents")
public class DocumentController {

    @Autowired
    private OnlyOfficeConfig onlyOfficeConfig;

    @Autowired
    private DocumentService documentService;

    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public ResponseEntity<Document> getDocument(@PathVariable String id, @AuthenticationPrincipal UserDetails userDetails) {
        if (!userService.hasAccess(userDetails.getUsername(), id)) {
            return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
        }
        Document document = documentService.getDocumentById(id);
        if (document == null) {
            return ResponseEntity.notFound().build();
        }
        return ResponseEntity.ok(document);
    }

    @PostMapping("/{id}")
    public ResponseEntity<Void> saveDocument(@PathVariable String id, @RequestBody Document document, @AuthenticationPrincipal UserDetails userDetails) {
        if (!userService.hasAccess(userDetails.getUsername(), id)) {
            return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
        }
        documentService.saveDocument(id, document);
        return ResponseEntity.ok().build();
    }

    @GetMapping("/config/{id}")
    public ResponseEntity<Object> getConfig(@PathVariable String id, @AuthenticationPrincipal UserDetails userDetails) {
        if (!userService.hasAccess(userDetails.getUsername(), id)) {
            return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
        }
        return ResponseEntity.ok(onlyOfficeConfig.getConfig(id));
    }
}

以上代码涵盖了从配置文件、依赖管理、控制器、配置类、服务类、模型类到前端页面的完整实现。希望这些代码能帮助你在Spring Boot项目中成功集成OnlyOffice。如果有任何问题或需要进一步的帮助,请随时提问。

6. 安全性和权限管理

  • 权限控制:通过OnlyOffice提供的API设置文档的访问权限,例如只读、编辑等。

  • 后端验证:在Spring Boot后端实现相应的权限验证逻辑,确保只有授权用户才能访问特定的文档。

体验与测评

在实际使用中,OnlyOffice的表现令人满意。其界面设计简洁直观,用户可以轻松上手;编辑器响应速度快,即使在网络条件不佳的情况下也能保持流畅的操作体验。OnlyOffice对中文文档的支持也相当不错,无论是字体显示还是排版布局都达到了较高的水平。

  • 更快的文件加载速度:为了加快编辑器的打开速度,我们优化了加载脚本。与之前的版本相比:

打开普通文件 – 最高提速 21%
打开演示文稿 – 最高提速 17%

Excel:
请添加图片描述
PPT:
请添加图片描述
PDF:
在这里插入图片描述

当然也有一些不足之处需要注意。部分高级功能需要购买商业许可证才能使用,这可能会增加企业的成本负担。另外与其他一些在线文档编辑工具相比,OnlyOffice的社区活跃度稍显不足,遇到问题时可能难以获得及时的帮助和支持。
在这里插入图片描述

8.2 版本的其他更新:

协作编辑 PDF 文件;

文本文档中的域代码;

从第三方来源插入文本;

预设阿拉伯语数字编号;

电子表格中的迭代计算;

电子表格编辑器中的丝滑滚动;

在幻灯片上绘图;

演示文稿中的随机切换效果;

所有语言的词典更新和拼写检查改进;

新的图表类型,如直方图、瀑布图、漏斗图等。

结尾:ONLYOFFICE 项目介绍

OnlyOffice不仅仅是一款文档编辑工具,它背后是一个充满活力的开源项目。该项目始于2009年,由Ascensio System SIA公司发起并维护。多年来,OnlyOffice不断发展壮大,形成了一个包括文档编辑器、邮件客户端、项目管理等多个子项目的生态系统。目前,OnlyOffice在全球范围内拥有数百万用户,得到了广泛的认可和好评。

ONLYOFFICE 官网

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

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

相关文章

【华为HCIP实战课程31(完整版)】中间到中间系统协议IS-IS路由汇总详解,网络工程师

一、IS-IS的汇总 1、可以有效减少在LSP中发布的路由条目,减小对系统资源的占用。 2、会减少LSP报文的扩散,接收到该LSP报文的其他设备路由表中只会出现一条聚合路由。 3、可以避免网络中的路由震荡,提高了网络的稳定性。 4、被聚合的路由可以是IS-IS路由,也可以是被引入…

LabVIEW编程过程中为什么会出现bug?

在LabVIEW编程过程中&#xff0c;Bug的产生往往源自多方面原因。以下从具体的案例角度分析一些常见的Bug成因和调试方法&#xff0c;以便更好地理解和预防这些问题。 ​ 1. 数据流错误 案例&#xff1a;在一个LabVIEW程序中&#xff0c;多个计算节点依赖相同的输入数据&#…

Vatee万腾平台:让企业数字化转型更轻松、更高效

在数字化浪潮席卷全球的今天&#xff0c;企业数字化转型已成为不可逆转的趋势。然而&#xff0c;对于许多企业来说&#xff0c;数字化转型并非易事&#xff0c;它涉及到技术、人才、流程等多个方面的变革。为了帮助企业顺利实现数字化转型&#xff0c;Vatee万腾平台应运而生&am…

STM32G0xx使用LL库将Flash页分块方式存储数据实现一次擦除可多次写入

STM32G0xx使用LL库将Flash页分块方式存储数据实现一次擦除可多次写入 参考例程例程说明一、存储到Flash中的数据二、Flash最底层操作(解锁&#xff0c;加锁&#xff0c;擦除&#xff0c;读写)三、从Flash块中读取数据五、测试验证 参考例程 STM32G0xx HAL和LL库Flash读写擦除操…

若依管理系统使用已有 Nacos 部署流程整理

背景 玩了一下开源项目 RuoYi 管理系统Cloud 版&#xff0c;卡住的地方是&#xff1a;它用到了 nacos 配置管理&#xff0c;如果用的 nacos 环境是单机且是内置数据库的话&#xff0c;该怎么配置呢&#xff1f; 本文整理本机启动 RuoYi Cloud 应用本地部署的过程&#xff0c;…

快速学习Python框架FastAPI

FastAPI是一种现代、快速&#xff08;高性能&#xff09;的Web框架&#xff0c;用于Python 3.6&#xff0c;使用Python类型提示构建API。它的设计初衷是帮助开发者在短时间内开发出高性能的API服务。FastAPI的灵感来源于许多高性能的编程框架&#xff0c;包括Express、Django R…

scala Map集合

一.Map的概述 Map是一种存储键值对的数据结构&#xff0c;Map中的键都是唯一的。 idea实例 二.Map的常见操作 idea实例 三.Map中的查询元素 idea实例 四.Map的常用方法 idea实例 五.Map的遍历 idea实例

Zabbix监控架构

目录 1. Zabbix监控架构-CS架构 2. Zabbix极速上手指南 主机规划 2.1 部署ngxphp环境并测试 检查安装结果 2.2 部署数据库 2.3 编译安装zabbix-server服务端及后续配置 2.4 部署前端代码代码进行访问 前端的配置文件(连接数据库与主机名等信息) 2.5 欢迎来到zabbix 2…

基于vue+neo4j 的中药方剂知识图谱可视化系统

前言 历时一周时间&#xff0c;中药大数据R02系统中药开发完毕&#xff0c;该系统通过scrapy工程获取中药数据&#xff0c;使用python pandas预处理数据生成知识图谱和其他相关数据&#xff0c;利用vuespringbootneo4jmysql 开发系统&#xff0c;具体功能请看本文介绍。 简要…

Java——》try-with-resource

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

数据结构---二叉树(顺序结构),堆(上)

树 树的概念与结构 树是⼀种⾮线性的数据结构&#xff0c;它是由 n&#xff08;n>0&#xff09; 个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;⽽叶朝下的。 PS 有⼀个特殊的结点&#xff…

蓝桥杯-网络安全比赛题目-遗漏的压缩包

小蓝同学给你发来了他自己开发的网站链接&#xff0c; 他说他故意留下了一个压缩包文件&#xff0c;里面有网站的源代码&#xff0c; 他想考验一下你的网络安全技能。 &#xff08;点击“下发赛题”后&#xff0c;你将得到一个http链接。如果该链接自动跳转到https&#xff0c;…

HTB:Busqueda[WriteUP]

目录 连接至HTB服务器并启动靶机 使用nmap对靶机进行开放端口扫描 使用ffuf对该域名进行路径FUZZ 直接使用浏览器访问靶机80端口主页面 直接到Github上寻找相关PoC、EXP USER_FLAG&#xff1a;0f2686aebbdb4c728050281a6fb742cf 特权提升 ROOT_FLAG&#xff1a;dde68ef…

如何创建备份设备以简化 SQL Server 备份过程?

SQL Server 中的备份设备是什么&#xff1f; 在 SQL Server 中&#xff0c;备份设备是用于存储备份数据的物理或逻辑介质。备份设备可以是文件、设备或其他存储介质。主要类型包括&#xff1a; 文件备份设备&#xff1a;通常是本地文件系统中的一个或多个文件。可以是 .bak 文…

c语言-8进制的表示方法

文章目录 一、8进制二、输出格式三、范围限制四、八进制的负数五、程序 一、8进制 在C语言中&#xff0c;表示8进制数需要使用前缀数字0&#xff0c;而不是通常的o或者0x. 8进制数以数字0作为前缀&#xff0c;后面跟着一串八进制数字&#xff08;0-7&#xff09;组成&#xf…

python操作MySQL以及SQL综合案例

1.基础使用 学习目标&#xff1a;掌握python执行SQL语句操作MySQL数据库软件 打开cmd下载安装 安装成功 connection就是一个类&#xff0c;conn类对象。 因为位置不知道&#xff0c;所以使用关键字传参。 表明我们可以正常连接到MySQL 演示、执行非查询性质的SQL语句 pytho…

【含开题报告+文档+源码】基于SSM的物流管理系统设计与实现

开题报告 随着电子商务的迅猛发展和人们生活水平的提高&#xff0c;快递服务行业正经历着前所未有的增长。占航快递公司作为国内知名的快递企业之一&#xff0c;面临着巨大的机遇和挑战。传统的快递服务管理方式已经无法满足日益增长的业务需求&#xff0c;快递服务流程中的问…

外包干了2年,快要废了。。。

先说一下自己的情况&#xff0c;普通本科毕业&#xff0c;在外包干了2年多的功能测试&#xff0c;这几年因为大环境不好&#xff0c;我整个人心惊胆战的&#xff0c;怕自己卷铺盖走人了&#xff0c;我感觉自己不能够在这样蹉跎下去了&#xff0c;长时间呆在一个舒适的环境真的会…

界面控件DevExpress WPF中文教程:Data Grid——卡片视图设置

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

使用Matlab神经网络工具箱

综述 在大数据和人工智能时代&#xff0c;深度学习是一种最为常见的数据分析和拟合工具。本报告以常用分析软件Matlab为例&#xff0c;介绍如何通过编写代码实现一个简单的CNN卷积神经网络。 Step 1: 打开matlab&#xff0c;新建脚本 1、安装matlab 2018以上版本后&#xff…