【vue2+onlyoffice】基础预览demo运行+问题解决

之前其实写过Onlyoffice的使用,但是写得不太完整,这次补充下。

一、OnlyOffice简介

  • ONLYOFFICE,是一个包含常用办公套件,Word 、Excel、PPT大办公套件搬到了云端,只需要一个浏览器即可以在线使用 Office 的各种功能。
  • 特色:可以用于文档处理、协作编辑、项目管理和文档预览等多种用途。
  • 版本对比:
    • 开源版(Community Edition):
      免费提供,适用于个人用户和小型团队。
      包含基本的文档处理、协作编辑和项目管理功能。
      支持跨平台运行和多人协作编辑。(同一个文档同一时间不能超过20人协同编辑)
    • 专业版(Professional Edition):
      面向个人用户和小型团队,需付费使用。
      提供了企业版的全部功能,以及更多的定制选项和扩展功能,如API集成、插件支持等。
    • 企业版(Enterprise Edition):
      针对企业用户提供,需付费使用。
      提供了高级功能和技术支持服务,如CRM集成、文档版本控制、权限管理等。
      具备更高级的安全性和可定制性,支持LDAP/AD集成、SSO登录等企业级认证和安全机制。
    • 云版(Cloud Edition):
      基于云端的服务模式,无需自行部署服务器。
      提供与开源版和企业版相似的功能,包括文档编辑、协作、项目管理等。
      提供不同的订阅计划和灵活的服务规模,适用于不想自行管理服务器的用户或团队。

对于一般内部项目来说开源版足够了。如果需要去掉它自带的logo和名称是需要付费版的。

二、服务组成

ONLYOFFICE文档服务分为客户端和服务端两部分。

客户端包括:
文档管理器(Document manager)
文档编辑器(Document editor)

服务端包括:
文档存储服务(Document storage service)
文档编辑服务(Document editing service)
文档指令服务(Document command service)
文档转换服务(Document conversion service)
文档构建服务(Document builder service)

三、工作原理

1.打开文件

1、用户使用文档管理器打开文档进行查看或者编辑。(基于浏览器访问)
2、使用JavaScript API 将文档唯一标识符(key)以及文档URL(url)发送到文档编辑器。
3、文档编辑器向文档编辑服务发送一个打开文档的请求。
4、文档编辑服务从文档存储服务下载相对应的文档,并将文档转换为Office Open XML格式。
5、准备就绪后,文档编辑服务会将转化后的文档传输到基于浏览器的文档编辑器。
6、提供编辑或者查看权限,对文档进行相应操作,执行保存

2.保存文件

1、用户在文档编辑器中编辑文件。
2、文档编辑器将更改发送给文档编辑服务。
3、用户关闭文档编辑器。
4、文档编辑服务监视到文档结束工作,并收集从文档编辑器发送到一个文档中的更改
5、执行回调保存接口
6、返回状态

3.协同编辑

1、用户1和用户2在文档编辑器中打开同一个文档,即打开文件时已使用一个相同的document.key
2、用户1对打开的文档进行更改。
3、文档编辑器将用户1所做的更改发送到文档编辑服务。
4、文档编辑服务将用户1所做的更改发送给用户2文档编辑器。
5、现在用户2可以看到这些变化。

四、使用

1. 构建文档服务器

这步一般是后端实现的,这里就列一些参考的文章

1.onlyoffice使用记录

onlyoffice连接mysql 2.onlyoffice去掉token验证 3.把各种功能按钮提出来。(保存、下载、打印…)在这里插入图片描述
最后他的效果图如上。

2.demo运行时报错的解决(后端处理)

  • 报错:文档安全令牌未正确形成
    - 可能是JWT的原因,去掉验证就可以了?(如果要更安全的话可以自己加个Token?)
  • 报错:下载失败
    - 使用内部ip地址访问后端服务报错,修改/etc/onlyoffice/documentserver/default.json​中配置
    - 扩展 使用localhost不能跳转至插件的问题,解决方案:使用nginx反向代理。

2.vue中连接&展示(demo)

  1. 创建一个vue2项目
  2. public中的index.htmlhead里增加<script type='text/javascript' src='http://ip:port/web-apps/apps/api/documents/api.js'></script>
  3. 需要有一个线上文档的地址,才能用Onlyoffice打开。
  4. 新建一个组件在components目录下:vanOnkyOffice.vue
<template>
  <div id="vabOnlyOffice"></div>
</template>

<script>
import { getFileType } from "@/utils/wayne";

export default {
  name: "VabOnlyOffice",
  props: {
    option: {
      type: Object,
      default: () => {
        return {};
      },
    },
  },
  data() {
    return {
      doctype: "",
      //参数说明
      parameters: {
        document: {
          //文件扩展名
          fileType: "docx",
          //key 默认置空则不走缓存 always update
          key: "",
          //为已查看或编辑的文档定义所需的文件名,该文件名在下载文档时也将用作文件名。
          title: "",
          //文件地址
          url: "",
          //相关权限
          permissions: {
            copy: true, //定义内容是否可以复制到剪贴板。如果该参数设置为false,则只能在当前文档编辑器中粘贴内容。默认值为true。
            download: true, //定义文档是可以下载还是只能在线查看或编辑。如果下载权限设置为“假”的下载为...菜单选项将是缺席的文件菜单。默认值为true。
            edit: true, //定义文档是可以编辑还是只能查看。如果编辑权限设置为“true”,则文件菜单将包含编辑文档菜单选项;请注意,如果编辑权限设置为“false”,文档将在查看器中打开,即使模式参数设置为edit,您也无法将其切换到编辑器。默认值为true。
            print: true, //定义是否可以打印文档。如果打印权限设置为“false”的打印菜单选项将是缺席的文件菜单。默认值为true
          },
        },
        //文件类型
        documentType: "text",
        height: "100%",
        width: "100%",
        editorConfig: {
          //语言:zh-CN简体中文/en英文
          lang: "en",
          //阅读状态 view/edit
          mode: "view",
          customization: {
            //是否显示插件
            plugins: false,
          },
        },
      },
    };
  },
  watch: {
    option: {
      handler: function (n) {
        this.setEditor(n);
        this.doctype = getFileType(n.fileType);
      },
      deep: true,
    },
  },
  mounted() {
    if (this.option.url) {
      this.setEditor(this.option);
    }
  },
  methods: {
    async setEditor(option) {
      this.doctype = getFileType(option.fileType);

      let config = {
        document: {
          //后缀
          fileType: option.fileType,
          key: "",
          title: option.title,
          permissions: {
            edit: option.isEdit, //是否可以编辑: 只能查看,传false
            print: option.isPrint,
            download: false,
            // "fillForms": true,//是否可以填写表格,如果将mode参数设置为edit,则填写表单仅对文档编辑器可用。 默认值与edit或review参数的值一致。
            // "review": true //跟踪变化
          },
          url: option.url,
        },
        documentType: this.doctype,
        editorConfig: {
          callbackUrl: option.editUrl, //"编辑word后保存时回调的地址,这个api需要自己写了,将编辑后的文件通过这个api保存到自己想要的位置
          lang: option.lang, //语言设置
          //定制
          customization: {
            autosave: false, //是否自动保存
            chat: false,
            comments: false,
            help: false,
            // "hideRightMenu": false,//定义在第一次加载时是显示还是隐藏右侧菜单。 默认值为false
            //是否显示插件
            plugins: true,
            //暂时无法生效
            customer: {
              address: "12333333333",
              info: "S11",
              logo: "123",
              mail: "j123",
              name: "123",
              www: "123",
            },
          },
        },
        width: "100%",
        height: "100%",
      };

      // eslint-disable-next-line no-undef,no-unused-vars
      new DocsAPI.DocEditor("vabOnlyOffice", config);
    },
  },
};
</script>

@/utils/wayne里的方法

export function getFileType(fileType) {
    let docType = ''
    let fileTypesDoc = [
      'doc', 'docm', 'docx', 'dot', 'dotm', 'dotx', 'epub', 'fodt', 'htm', 'html', 'mht', 'odt', 'ott', 'pdf', 'rtf', 'txt', 'djvu', 'xps',
    ]
    let fileTypesCsv = [
      'csv', 'fods', 'ods', 'ots', 'xls', 'xlsm', 'xlsx', 'xlt', 'xltm', 'xltx',
    ]
    let fileTypesPPt = [
      'fodp', 'odp', 'otp', 'pot', 'potm', 'potx', 'pps', 'ppsm', 'ppsx', 'ppt', 'pptm', 'pptx',
    ]
    if (fileTypesDoc.includes(fileType)) {
      docType = 'text'
    }
    if (fileTypesCsv.includes(fileType)) {
      docType = 'spreadsheet'
    }
    if (fileTypesPPt.includes(fileType)) {
      docType = 'presentation'
    }
    return docType
  }
  
  1. 在App.vue中调用这个组件:
<template>
  <div class="qualityManual-container">
    <div class="qualityManual-container-office">
      <vab-only-office :option="option" />
    </div>
  </div>
</template>

<script>
import vabOnlyOffice from "./components/vabOnlyOffice";

export default {
  name: "QualityManual",
  components: { vabOnlyOffice },

  data() {
    return {
      //参考vabOnlyOffice组件参数配置
      option: {
        url: "",
        isEdit: "",
        fileType: "",
        title: "",
        lang: "",
        isPrint: "",
      },
    };
  },
  methods: {
    getFile() {
      // getAction('/onlyfile/file/queryById', { id: this.id }).then(res => {
      this.option.isEdit = true;
      this.option.lang = "en";
      this.option.url ="http://xxx/xxxxxx.docx";
      this.option.title = "123";
      this.option.fileType = "docx";
      this.option.isPrint = false;
      // })
    },
  },
  mounted() {
    this.getFile();
  },
};
</script>

<style lang="scss" scoped>
.qualityManual-container {
  padding: 0 !important;

  &-office {
    width: 100%;
    height: 90vh;
  }
}
</style>

其实主要是使用了参考2里面的代码,留着备份一下。

五、参考

1.onlyoffice+vue实现在线预览在线编辑 :包括onlyoffice介绍和前后端代码
2.Vue 预览word,excel,ppt等office文档-内网访问(基于onlyoffice,后端返回文件流) 上面这篇的前端组件也是参考的这个文档里的。
3java+vue+onlyoffice的简单集成:代码不太全;提到集成插件(签章)是在部署docker的时候挂载?;从文档管理页跳转到详情页的写法。有包括后端的保存回调写法。
vue+onlyoffice实现编辑和预览 有完整的使用代码,参考1里的代码是在这个基础上做整合的。
4.ONLYOFFICE的csdn:里面有些教程,不过首发应该还是它自己的官网?
5.【onlyoffice中文指南】12-问题及排除 确实是比较常见的问题。
6. 史上最全 在线编辑 onlyOffice 使用步骤 还没看,好像还有后端的保存的写法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HOOPS Commuicator:基于Web的交互式2D/3D图形轻量化引擎

在当前数字化时代&#xff0c;Web基础的3D应用程序正在成为行业标准&#xff0c;尤其是在工程和制造领域。Tech Soft 3D公司旗下的HOOPS Communicator正是针对这一需求设计的高级解决方案&#xff0c;提供了一套全面的工具&#xff0c;旨在帮助开发者构建复杂的3D工程应用程序。…

3. 无重复字符的最长子串/438. 找到字符串中所有字母异位词/560. 和为 K 的子数组

3. 无重复字符的最长子串 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。 思路&#xff1a;想象一下我们…

Spring MVC和Spring Boot

上节已经提到过请求&#xff0c;这次梳理响应。 响应 响应基本上都要被Controller所托管&#xff0c;告诉Spring帮我们管理这个代码&#xff0c;我们在后面需要访问时&#xff0c;才可以进行访问&#xff0c;否则将会报错。并且其是由RestController分离出来的&#xff0c;Re…

免杀技术之白加黑的攻击防御

一、介绍 1. 什么是白加黑 通俗的讲白加黑中的白就是指被杀软列入到可信任列表中的文件。比如说微软自带的系统文件或者一些有有效证书签名的文件,什么是微软文件&#xff0c;或者什么是有效签名文件在后面我们会提到他的辨别方法。黑就是指我们自己的文件&#xff0c;没有有…

allegro输出正反面bom

不是前面两条命令&#xff0c;而是component report

Scrapy

【 一 】Scrapy介绍 【0】前言 Scrapy知识预备 ​ 爬虫毕竟是在网页里面抓取数据的,因此前端那些东西没学过也要稍微懂点。HTML、CSS简单的语法,Xpath、正则表达式等等,需要有一些简单的基础。 ​ Scrapy一个开源和协作的框架,其最初是为了页面抓取(更确切来说,网络抓…

Day26: Redis入门、开发点赞功能、开发我收到的赞的功能、重构点赞功能、开发关注、取消关注、开发关注列表、粉丝列表、重构登录功能

Redis入门 简介 Redis是NoSQL数据库&#xff08;Not only SQL&#xff09;值支持多种数据结构&#xff08;key都是string&#xff09;&#xff1a;字符串、哈希、列表、集合、有序集合把数据存在内存中&#xff0c;速度惊人&#xff1b;同时也可以讲数据快照&#xff08;数据…

(一)JVM实战——jvm的组成部分详解

前言 本节内容是关于java虚拟机JVM组成部分的介绍&#xff0c;通过其组成架构图了解JVM的主要组成部分。 正文 ClassFile&#xff1a;字节码文件 - javac&#xff1a;javac前端编译器将源代码编译成符合jvm规范的.class文件&#xff0c;即字节码文件 - class文件的结构组成&a…

【智能算法】指数分布优化算法(EDO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2023年&#xff0c;M Abdel-Basset等人受到指数分布理论启发&#xff0c;提出了指数分布优化算法&#xff08;Exponential Distribution Optimizer, EDO&#xff09;。 2.算法原理 2.1算法思想 ED…

mac系统镜像源管理之nrm的安装与使用

之前有介绍过&#xff1a;pnpm安装和使用&#xff0c;nvm安装及使用&#xff0c;在前端开发中其实还有一个工具也会偶尔用到&#xff0c;那就是nrm&#xff0c;本文就详解介绍一下这个工具&#xff0c;非常的简单且好用&#xff5e; 文章目录 1、什么是nrm&#xff1f;2、安装3…

CPU资源控制

一、CPU资源控制定义 cgroups&#xff08;control groups&#xff09;是一个非常强大的linux内核工具&#xff0c;他不仅可以限制被namespace隔离起来的资源&#xff0c; 还可以为资源设置权重、计算使用量、操控进程启停等等。 所以cgroups&#xff08;control groups&#xf…

【IC设计】奇数分频与偶数分频 电路设计(含讲解、RTL代码、Testbench代码)

文章目录 原理分析实现和仿真偶数分频的电路RTL代码偶数分频的电路Testbench代码偶数分频的电路仿真波形占空比为50%的三分频电路RTL代码占空比为50%的三分频电路Testbench代码占空比为50%的三分频电路仿真波形 参考资料 原理分析 分频电路是将给定clk时钟信号频率降低为div_c…

Springboot 整合 Quartz框架做定时任务

在Spring Boot中整合Quartz&#xff0c;可以实现定时任务调度的功能 1、首先&#xff0c;在pom.xml文件中添加Quartz和Spring Boot Starter Quartz的依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-bo…

基于MNIST的手写数字识别

上次我们基于CIFAR-10训练一个图像分类器&#xff0c;梳理了一下训练模型的全过程&#xff0c;并且对卷积神经网络有了一定的理解&#xff0c;我们再在GPU上搭建一个手写的数字识别cnn网络&#xff0c;加深巩固一下 步骤 加载数据集定义神经网络定义损失函数训练网络测试网络 …

AI绘画怎么用涂抹消除处理图片?

AI绘画软件中的涂抹消除功能通常用于处理图片&#xff0c;以去除不需要的部分或进行细节调整。不同的AI绘画软件可能具有不同的界面和功能设置&#xff0c;因此具体的操作步骤可能会有所不同。那么AI绘画一般怎么用涂抹消除处理图片? 该功能主打“一键消除&#xff0c;不留痕迹…

【MCU】栈溢出问题

项目场景&#xff1a; 硬件&#xff1a;STM32F407&#xff0c;操作系统&#xff1a;rt_thread master分支 问题描述 问题栈溢出 id 499 ide 00 rtr 00 len 8 9 Function[rt_completion_wait] shall not be used in ISR (0) assertion failed at function:rt_completion_wait,…

由于磁盘空间不够导致服务无法访问的情况

昨天服务出现了一些“小状况”&#xff0c;这里做下记录&#xff0c;为了以后类似的问题&#xff0c;可以作为参考。 具体情况是&#xff0c;如下&#xff1a; 本来一直访问都好好的服务突然间访问不到了&#xff0c;首先确定了下服务器上的 docker 服务是否正常运行。确认正…

粒子群算法与优化储能策略python实践

粒子群优化算法&#xff08;Particle Swarm Optimization&#xff0c;简称PSO&#xff09;, 是1995年J. Kennedy博士和R. C. Eberhart博士一起提出的&#xff0c;它是源于对鸟群捕食行为的研究。粒子群优化算法的基本核心是利用群体中的个体对信息的共享从而使得整个群体的运动…

【办公类-26-01】20240422 UIBOT网络教研(自动登录并退出多个账号,半自动半人工)

作品展示&#xff1a; 背景需求&#xff1a; 每学期有多次网络教研 因为我有历任搭档的进修编号和登录密码&#xff0c; 所以每次学习时&#xff0c;我会把历任搭档的任务也批量完成。 但是每次登录都要从EXCEL里复制一位老师的“进修编号”“密码”&#xff0c;还要点击多次…

快速回复app是什么样

在电商领域&#xff0c;掌握一些必备的软件工具是提高工作效率、优化运营流程以及提升用户体验的关键。本文将为您介绍做电商必备的几个软件&#xff0c;帮助您更好地开展电商业务。 ​ 快速回复APP&#xff1a;重新定义沟通效率 在快节奏的现代社会中&#xff0c;人们对于沟通…
最新文章