国产系统(麒麟V10、uos)使用pageoffice在线编辑office文件

news/2025/3/14 18:22:54/文章来源:https://www.cnblogs.com/lhl77/p/18575925

本文描述了PageOffice产品在(VUE+Springboot)前后端分离的项目中如何集成调用。

一、环境

前端:vue2

后端:springboot2、jdk1.8

如果是springboot3,jdk17及以上版本,用这个依赖:

  1. <dependency>
  2. <groupId>com.zhuozhengsoft</groupId>
  3. <artifactId>pageoffice</artifactId>
  4. <version>6.3.3.1</version>
  5. </dependency>

二、后端项目

1、新建Springboot后端项目:springboot-back,在配置文件application.properties中设置项目端口为:8081

2、在您项目的pom.xml中通过下面的代码引入PageOffice依赖。pageoffice.jar已发布到Maven中央仓库 (opens new window),建议使用最新版本。

  1. <dependency>
  2. <groupId>com.zhuozhengsoft</groupId>
  3. <artifactId>pageoffice</artifactId>
  4. <version>6.3.3.1-javax</version>
  5. </dependency>

3、新建一个pageoffice文件夹,用来存放PageOffice的系统文件(如license.lic、客户端安装包等),比如windows环境下创建:D:/pageoffice,linux环境下创建:/root/pageoffice

4、拷贝pageoffice客户端安装程序到上一步创建的pageoffice文件夹下。

  • 客户端是windows环境:拷贝posetup_6.3.2.2.exe到pageoffice文件夹下;
  • 客户端是国产操作系统环境:拷贝对应芯片的PageOffice客户端deb安装包到pageoffice文件夹下;

PageOffice客户端安装程序下载地址:pageoffice6-client 发行版 - Gitee.com 

5、打开springboot-back项目的配置文件application.properties,添加一个posyspath变量,值为上一步创建的pageoffice文件夹的路径

  1. server.port=8081
  2. posyspath=D:/pageoffice

 6、在您项目的启动类Application类中添加一项@Bean配置,此为PageOffice服务器端的必要配置,代码如下:

  1. @Value("${posyspath}")
  2. private String poSysPath;
  3. @Bean
  4. public ServletRegistrationBean pageofficeRegistrationBean() {
  5. com.zhuozhengsoft.pageoffice.poserver.Server poserver
  6. = new com.zhuozhengsoft.pageoffice.poserver.Server();
  7. poserver.setSysPath(poSysPath);//设置PageOffice注册成功后,license.lic文件存放的目录
  8. ServletRegistrationBean srb = new ServletRegistrationBean(poserver);
  9. srb.addUrlMappings("/poserver.zz");
  10. srb.addUrlMappings("/poclient");
  11. srb.addUrlMappings("/sealsetup.exe");
  12. return srb;
  13. }

注意

注意:在实际开发中,您的后端项目中必须将PageOffice相关配置请求从后端拦截器SpringSecurity或者Shiro等授权认证校验框架中放出来。例如:

  • SpringSecurity
.antMatchers("/poserver.zz","/poclient","/sealsetup.exe").permitAll()
  • Shiro
  1. filterChainDefinitionMap.put("/poserver.zz", "anon");
  2. filterChainDefinitionMap.put("/poclient", "anon");
  3. filterChainDefinitionMap.put("/sealsetup.exe", "anon");

7、新建Controller并调用PageOffice在线打开文件,例如DocumentController代码如下:

  1. @RestController
  2. @RequestMapping(value = "/doc")
  3. public class DocumentController {
  4. //获取doc目录的磁盘路径
  5. private String dir = GetDirPathUtil.getDirPath() + "static/";
  6. @RequestMapping(value="/openFile")
  7. public String openFile(HttpServletRequest request,int file_id,String file_name) {
  8. //file_id和file_name是为了展示如何使用参数,我们这里只用到了file_name
  9. PageOfficeCtrl poCtrl = new PageOfficeCtrl(request);
  10. //webOpen的第一个参数支持能够输出下载文件的Url相对地址或者文件在服务器上的磁盘路径两种方式
  11. //查看详细,请在"https://www.pageoffice.cn/"搜索“PageOffice属性或方法中涉及到的URL路径或磁盘路径的说明”
  12. poCtrl.webOpen("file://"+dir+file_name, OpenModeType.docNormalEdit, "张三");
  13. return poCtrl.getHtmlCode();//必须
  14. }
  15. @RequestMapping("/saveFile")
  16. public void saveFile(HttpServletRequest request, HttpServletResponse response,int file_id,String file_name) {
  17. //file_id和file_name是为了展示如何使用参数,我们这里只用到了file_name
  18. FileSaver fs = new FileSaver(request, response);
  19. fs.saveToFile(dir + file_name);
  20. fs.close();
  21. }
  22. }

三、前端项目 

1、新建Vue前端项目:vue-front

2、Vue配置代理。

  1. devServer: {
  2. proxy: {
  3. '/dev-api': { // "/dev-api"对应后端项目"http://192.168.1.100:8081"地址
  4. target: 'http://192.168.1.100:8081',
  5. ws: true,
  6. changeOrigin: true,
  7. pathRewrite: {
  8. '^/dev-api': ''
  9. }
  10. },
  11. }
  12. }

3、引用js-pageoffice库。

注意:请确保安装的js-pageoffice库版本号与后端项目pom.xml文件中引用的PageOffice JAR包版本号的前三位相同。

​ 使用命令安装:npm install js-pageoffice@6.3.3 --save-exact

4、在全局拦截器中添加PageOffice相关配置。

  1. import axios from "axios";
  2. import { POBrowser } from "js-pageoffice";
  3. // 创建 axios 实例
  4. const service = axios.create({
  5. baseURL: "/dev-api", // 设置你的基础 URL
  6. timeout: 5000, // 设置请求超时时间
  7. });
  8. // 请求拦截器
  9. service.interceptors.request.use(
  10. (config) => {
  11. // 在发送请求之前做些什么
  12. //const token = Cookies.get('token'); // 假设你的token存储在cookie中
  13. const token = "123";
  14. if (token) {
  15. config.headers["Authorization"] = "Bearer " + token; // 将token添加到请求头中
  16. // PageOffice全局配置,必须在此拦截器中定义
  17. //必须。设置后端代理,具体属性值以您实际开发为准,比如POBrowser.setProxyBaseAPI(process.env.VUE_APP_BASE_API);
  18. POBrowser.setProxyBaseAPI("/dev-api");
  19. //必须。向PageOffice后端请求设置header,支持多次调用setHeader()设置更多的值,具体属性名称和属性值以您实际开发为准。
  20. POBrowser.setHeader("Authorization", "Bearer " + token);
  21. /**
  22. * 前端存储token的方案
  23. *方案1.使用Cookie
  24. *如果您的令牌(token)存储在Cookie中,PageOffice会默认支持通过Cookie方式保存令牌,因此您无需编写任何额外的代码。
  25. *方案2.使用Localstorage或者SessionStorage
  26. *如果令牌(token)是保存在LocalStorage或SessionStorage中,您必须调用POBrowser.setStorage()方法。
  27. */
  28. //POBrowser.setStorage("Admin-Token",getToken());//支持多次调用setStorage()设置更多的值,具体属性名称和属性值以您实际开发为准。
  29. }
  30. return config;
  31. },
  32. (error) => {
  33. // 对请求错误做些什么
  34. return Promise.reject(error);
  35. }
  36. );

5、新建一个Vue页面:src/views/DocView.vue,用来显示在线打开的文档。

  1. <template>
  2. <div class="doc">
  3. 演示: 文档<br /><br />
  4. <!-- 此div用来加载PageOffice客户端控件,其中div的高宽及位置就决定了控件的大小及位置 -->
  5. <div style="width:auto; height:900px;" v-html="poHtmlCode"></div>
  6. </div>
  7. </template>
  8. <script>
  9. import request from '@/utils/request'
  10. export default {
  11. name: 'DocView',
  12. data() {
  13. return {
  14. poHtmlCode: '',
  15. open_params: '',
  16. }
  17. },
  18. created: function () {
  19. //使用pageofficectrl.WindowParams获取获取父页面(此项目中为:HomeView.vue)中POBrowser.openWindow()方法的第三个参数的值,获取到的值为string类型
  20. this.open_params = JSON.parse(pageofficectrl.WindowParams);
  21. // 请求后端打开文件
  22. this.openFile().then(response => {
  23. this.poHtmlCode = response;
  24. }
  25. );
  26. },
  27. methods: {
  28. OnPageOfficeCtrlInit() {
  29. //PageOffice的初始化事件回调函数,您可以在这里添加自定义按钮
  30. pageofficectrl.AddCustomToolButton("保存", "Save", 1);//其中"Save"对应methods中的Save()函数,并且需要在mounted中挂载。
  31. },
  32. Save() {
  33. //使用SaveFilePage属性设置后端保存方法的Controller路由地址,这个地址必须从"/"开始,并且也可以向此路由地址传递json字符串参数,示例如下:
  34. let saveFileUrl = "/doc/saveFile";
  35. let paramValue = new URLSearchParams(this.open_params);//为了简单起见,这里直接使用打开时的参数。
  36. pageofficectrl.SaveFilePage = `${saveFileUrl}?${paramValue.toString()}`;
  37. //在这里写您保存前的代码
  38. pageofficectrl.WebSave();
  39. //在这里写您保存后的代码,比如判断保存结果pageofficectrl.CustomSaveResult
  40. //alert(pageofficectrl.CustomSaveResult);
  41. },
  42. AfterDocumentOpened() {
  43. //在这里写您文档打开后自动触发的代码
  44. },
  45. openFile() {
  46. //发起GET请求到后端Controller的/doc/openFile路由
  47. return request({
  48. url: '/doc/openFile',
  49. method: 'get',
  50. params: this.open_params
  51. })
  52. }
  53. },
  54. mounted: function () {
  55. //将当前页面methods中定义的函数挂载到PageOffice控件,例如控件触发的事件、自定义按钮触发的函数。
  56. window.POPageMounted = this;//此行必须
  57. }
  58. }
  59. </script>

6、配置DocView.vue的访问路由。

  1. const routes = [
  2. // 其他路由配置项...
  3. // 下面添加DocView.vue的路由
  4. ,
  5. {
  6. path: '/showDoc',
  7. name: 'doc',
  8. component: () => import('../views/DocView.vue')
  9. }
  10. ]

7、在您的Vue页面(比如HomeView.vue,PageOffice中把这个页面称之为父页面)添加一个打开文件的超链接,点击超链接调用POBrowser对象的openWindow方法,弹出PageOffice浏览器(POBrowser)窗口访问DocView.vue在线打开文件,代码如下:

 <a  href="#" @click.prevent="open_pageoffice()">打开文件</a>
  1. <script>
  2. import request from '@/utils/request'
  3. import { POBrowser } from 'js-pageoffice'
  4. export default {
  5. name: 'HomeView',
  6. methods: {
  7. open_pageoffice() {
  8. let paramJson={};
  9. paramJson.file_id=1;
  10. paramJson.file_name="test.doc";
  11. let paramString=JSON.stringify(paramJson);
  12. //openWindow()第三个参数用来向弹出的PageOffice浏览器(POBrowser)窗口传递参数(参数长度不限),支持json格式字符串。
  13. //此处为了方便演示,我们传递了file_id和file_name两个参数,具体以您实际开发为准。
  14. POBrowser.openWindow('/showDoc', 'width=1150px;height=900px;',paramString);
  15. },
  16. }
  17. }
  18. </script>

 8、启动springboot-back和vue-front项目,点击“打开文件”超链接,查看在线打开编辑保存Word文件的效果。

参考文档:PageOffice最简集成代码(VUE+Springboot) | PageOffice 开发者中心 

原文链接:https://blog.csdn.net/qq_44306545/article/details/143943224

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

产品经理如何用项目管理技能提升交付质量与效率?

作为产品经理,除了要具备产品设计和创新的能力,还需要掌握项目管理的技巧,因为产品的成功不仅仅取决于设计和开发,项目管理的精细化操作更是不可忽视的一环。项目管理的核心目标是确保项目按时、按质、按量完成,最终能够顺利交付客户。而作为产品经理,我们常常承担着项目…

idea源码下载问题: Cannot download sources Sources not found for:xxx

转载: 原文地址 问题出现的原因是我新建项目后没有手动设置仓库地址,导致用命令mvn dependency:resolve -Dclassifier=sources下载的源码全部自动的下载到默认仓库:C:\Users\xxx\.m2\repository而idea选择源文件时跳出的文件选择框还是我自定义的仓库 所以找不到源码文件,其…

@Url.Content

@Url.Content 是ASP.NET MVC中的一个HTML帮助器,用于生成相对于应用程序根目录的URL。这个帮助器特别有用当你需要引用静态内容,如图片、CSS文件、JavaScript文件等,这些文件通常放在Content文件夹中。 使用@Url.Content可以确保生成的URL是正确的,无论应用程序的基路径是什…

Linux安装RabbitMQ详细教程(最详细的图文教程)

一、环境准备1、RabbitMQ版本 和 Erlang 版本兼容性关系 https://www.rabbitmq.com/which-erlang.html 2、ErLang安装教程 https://www.cnblogs.com/haoliyou/p/17666817.html 3、RabbitMQ的安装依赖于erlang所以先安装4、RabbitMQ CentOS 参考安装步骤 https://www.rabbitmq.c…

考研打卡(30)

开局(30) 开始时间 2024-11-29 08:23:23 结束时间 2024-11-29 09:21:22今早醒来,打了十几个喷嚏,蹲了一分钟才发现是女厕所(还好没人)数据结构 有一个有序表R[1...13]={1,3,9,12,32,41,45,62,75,77,82,95,100}, 当用二分查找法查找值为82的节点时,经过____…

连续分配管理方式

连续分配管理方式 ‍ ​​ 补充: 非连续分配管理方式:基本分页存储管理 基本分段存储管理 段页式存储管理一、前言 对于内存来说:内部碎片:已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间 外部碎片:还没有被分配出去(不属于任何进程),但由于太小了无…

覆盖与交换

覆盖与交换 ‍ ​​ ‍一、覆盖技术 (一)思想 将程序分为多个段(多个模块)。常用的段常驻内存,不常用的段在需要时调入内存。 (二)实现 将内存分为一个“固定区”和若干个“覆盖区”。 需要常驻内存的段放在“固定区”中,调入后就不再调出(除非运行结束) 不常用的段放…

Qt支持RKMPP硬解的视频监控系统/性能卓越界面精美/实时性好延迟低/录像存储和回放/云台控制

一、前言 之前做的监控系统,已经实现了在windows上硬解码比如dxva2和d3d11va,后续又增加了linux上的硬解vdpau的支持,这几种方式都是跨系统的硬解实现方案,也是就是如果都是windows系统,无论X86还是ARM都通用,在系统层面屏蔽了实现细节,按照规范来写就行,这种方式叫跨硬…

20222313 2024-2025-1 《网络与系统攻防技术》 实验五实验报告

1. 实验内容 1.1 实验要求 (1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取相关信息。 (2)尝试获取BBS、论坛、QQ、MSN中某一好友的IP地址,并查询获取该好友所在的具体地理位置。 (3)使用nmap开源软件对靶机环境进行扫描,回答以下问题并…

多协议兼容:开启跨网文件传输的新纪元!

金融、医疗、政府单位、跨国公司等企业内部往往存在多个隔离的网络环境,如内网、外网、测试网等。随着数字化办公的深入,内网与内网、内网与外网间的文件交换需求频繁,传统的文件传输方式已无法满足安全、合规的文件交换需求。1、跨国公司在不同地区运营时,需要安全、高效地…

Odoo和其他SprinBoot框架同时存在时时区问题

因为Centos的停更以及Odoo版本升级后更加友好的支持了Ubuntu所以发布Odoo服务使用了Ubuntun系统环境,因为Odoo为国外人开发所以他们默认代码中处理了跨时区的问题,便于在国内可以友好显示,但是我还不能手动去调时区,要不然就的处理Odoo的源代码了,可是我还有另一个MySQL的…

请问PbootCMS模板调用当前栏目的文章和分页

#### 调用当前栏目的文章 ```html {pboot:list num=10 scode={sort:scode} page=0}<li><a href="[list:link]">[list:title lencn=20]</a></li> {/pboot:list}扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精…