在线编辑、预览、基于wps web office,v3版 强势来袭

说明

  1. v1 版本已经不再更新了,官方也只是提供以前申请下来的账号能继续使用,新申请,需要用到v3了
  2. v3 版本sdk参考 wps-weboffice-sdk-v3, 里面有很详细的注释
  3. v3 集成方法,后端请参考wps-weboffice-v3-demo, 实现你需要对接的接口即可
  4. 使用v3的大前提是,你申请了开发账号,并且申请下来了appid,–web-office官网–

其实v3版本已经是小半年了,但是呢,实在看不下去官方的那个sdk,所以,自己就接着弄吧,毕竟v1的java版本,就是我出的,虽然也没有多少工作量,主要是让用的人能快速接入~~~

基于官方最新sdk-v3 ------------ V3开发文档官网
基于官方的sdk,做了大量优化,增加了最为详细的注释,并推送到maven,方便大家使用


sdk地址 https://gitee.com/mose-x/wps-weboffice-sdk-v3


引入maven

<dependency>
  <groupId>cn.ljserver.tool</groupId>
  <artifactId>web-office-v3</artifactId>
  <version>3.1.0</version>
</dependency>

基于此sdk的实现,也给你demo以及简单的html页面


demo地址 https://gitee.com/mose-x/wps-weboffice-v3


效果呢,和v1版本的大差不差,只是接入方式完全变化了

使用sdk接入,反倒更加简单了,需要接入的,多看看demo里面的注释,以及sdk的注释

比如文件预览,引入maven后,你只需实现PreviewService 里面的接口即可

/**
 * 文件预览服务必要的接口实现
 * <br>
 * <a href="https://solution.wps.cn/docs/callback/preview.html">-详见官方文档-</a>
 */
@Service
public class PreviewServiceImpl implements PreviewService {
    @Autowired
    private UserService userService;
    @Autowired
    private FileService fileService;

    /**
     * 获取文件信息
     *
     * @param fileId 文件id <br>
     *               <a href="https://solution.wps.cn/docs/callback/preview.html#获取文件信息">-详见官方文档-</a>
     */
    @Override
    public FileInfo fetchFileInfo(String fileId) {
        // 解释说明下,这里在实际的设计中,需要将 文件信息 表 和历史文件版本表分开放
        // 这里是通过文件id,获取到当前文件最新一个版本的文件信息,并返回
        // 这里为了方便,所以设计成了一张表
        return fileService.fetchFile(fileId).toFileInfo();
    }

    /**
     * 获取文件下载地址
     *
     * @param fileId 文件id <br>
     *               <a href="https://solution.wps.cn/docs/callback/preview.html#获取文件下载地址">-详见官方文档-</a>
     */
    @Override
    public DownloadInfo fetchDownloadInfo(String fileId) {
        // 解释说明下,这里在实际的设计中,需要将 文件信息 表 和历史文件版本表分开放
        // 然后这里就会获取最后一个版本的文件并返回
        // 这里为了方便,所以设计成了一张表
        return Optional.ofNullable(fileId)
                .map(fileService::findById)
                .map(Collection::stream)
                .flatMap(s -> s.max(Comparator.comparingInt(f -> f.getId().getVersion())))
                .map(f -> DownloadInfo.builder()
                        .url(f.getUrl())
                        .build())
                .orElseThrow(FileNotExist::new);
    }

    /**
     * 获取用户文件权限
     *
     * @param fileId 文件id <br>
     *               <a href="https://solution.wps.cn/docs/callback/preview.html#文档用户权限">-详见官方文档-</a>
     */
    @Override
    public UserPermission fetchUserPermission(String fileId) {
        // 解释说明下,这里在实际的设计中,需要将 文件信息 表 和 用户权限 表 分开放
        // 这里为了方便,并没有设计表,返回了所有权限到前端
        // check file exists
        fileService.fetchFile(fileId);
        // 获取user信息,这个方法点进去看看把!!!
        User user = userService.fetchUserByToken();
        // 构建user对应的文件权限
        return UserPermission.builder()
                .userId(String.valueOf(user.getId()))
                .read(true)
                .update(true)
                .rename(true)
                .download(true)
                .copy(true)
                .comment(true)
                .history(true)
                .build();
    }
}

文档编辑,单阶段保存,嗯,很简单,如下

/**
 * 单阶段文件保存接口
 * <p>
 * <a href="https://solution.wps.cn/docs/callback/save.html#%E5%8D%95%E9%98%B6%E6%AE%B5%E6%8F%90%E4%BA%A4">详见wps web office官网</a>
 */
@Service
public class SinglePhaseFileStorageServiceImpl implements SinglePhaseFileStorageService {
    @Autowired
    private UserService userService;
    @Autowired
    private FileService fileService;

    /**
     * 上传文件
     *
     * @param request 上传文件请求
     * @return 文件信息
     * <p>
     * <a href="https://solution.wps.cn/docs/callback/save.html#%E5%8D%95%E9%98%B6%E6%AE%B5%E6%8F%90%E4%BA%A4">详见wps web office官网</a>
     */
    @Override
    public FileInfo uploadFile(FileUploadSinglePhase.Request request) {
        // 获取用户信息 -> 这个方法点进去看看 ??!!
        final User user = userService.fetchUserByToken();

        // 保存文件信息
        final File file = Optional.of(request)
                .map(r -> fileService.fetchFile(request.getFileId()))
                .map(f -> File.builder()
                        .id(f.getId().copyForNewVersion())
                        .creator(f.getCreator())
                        .createTime(f.getCreateTime())
                        .modifyTime(LocalDateTime.now())
                        .modifier(user)
                        .name(request.getName())
                        .size(request.getSize())

                        // 上传文件获取到URL
                        // --------------------------------
                        // 这里不应该直接保存URL,而是不带domain的uri方便后续迁移等等
                        // 为了方便,就这么弄了
                        // --------------------------------

                        .url(QnFileService.upload(request.getFile()))
                        .build())
                .map(f -> fileService.repository().save(f))
                .orElseThrow(FileNotExist::new);

        // 返回文件信息
        return file.toFileInfo();
    }
}

这里说明下,单阶段保存,和三阶段保存

  1. 单阶段,即直接保存,没有那么多花里胡哨的
  2. 三阶段保存
    • 先获取自定义的加密算法
    • 获取到自定义的文件上传接口,同时将文件元信息给到你
    • 当wps后台上传完文件后(通过步骤2上传),再调用你的上传完成接口,作为回调,告诉你上传完成的信息



此次先给到java的sdk,java-demo以及最简单的html页面来让大家快速对接,如果确实有需要的话,后续我再把官网前端那些对接的,弄个vue的项目,供大家参考,反正闲着也是闲着。。。


嗯,别忘了给v3项目小星星哦!


V3实际效果

和v1效果差不多,只是v3目前有自带的水印(无解,v1有特权,v3不给了)


docx 在线预览/编辑


pptx 在线预览/编辑


xlsx 在线预览/编辑


pdf 在线预览/编辑





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

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

相关文章

LLM⊗KG范式下的知识图谱问答实现框架思想阅读

分享一张有趣的图&#xff0c;意思是在分类场景下&#xff0c;使用大模型和fasttext的效果&#xff0c;评论也很逗。 这其实背后的逻辑是&#xff0c;在类别众多的分类场景下&#xff0c;尤其是在标注数据量不缺的情况下&#xff0c;大模型的收益是否能够比有监督模型的收益更多…

[渗透利器]全能工具=信息收集->漏洞扫描->EXP调用

前言 hxd开发的工具&#xff0c;大致模块有&#xff08;信息收集&#xff0c;漏洞扫描&#xff0c;暴力破解&#xff0c;POC/EXP&#xff0c;常用编码&#xff09; 工具使用 下载后解压 安装环境 pip install -r requirements.txt 注意&#xff0c;该工具继承了两种不同的使…

HTML_CSS学习:定位

一、相对定位 相关代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>相对定位</title><style>.outer{width: 500px;background-color: #999ff0;border: 1px solid #000;p…

OpenHarmony实战开发-上传文件

Web组件支持前端页面选择文件上传功能&#xff0c;应用开发者可以使用onShowFileSelector()接口来处理前端页面文件上传的请求。 下面的示例中&#xff0c;当用户在前端页面点击文件上传按钮&#xff0c;应用侧在onShowFileSelector()接口中收到文件上传请求&#xff0c;在此接…

不考408的985,不想考408的有福了!吉林大学计算机考研考情分析

吉林大学&#xff08;Jilin University&#xff09;简称吉大&#xff0c;位于吉林长春&#xff0c;始建于1946年&#xff0c;是中华人民共和国教育部直属的综合性全国重点大学&#xff0c;国家“双一流”、“211工程”、“985工程”、“2011计划”重点建设的著名学府&#xff0…

我是如何带团队从0到1做了AI中台

经历心得 我从18年初就开始带这小团队开始做项目&#xff0c;比如最初的数字广东的协同办公项目&#xff0c;以及粤信签小程序等&#xff0c;所以&#xff0c;在团队管理&#xff0c;人员安排&#xff0c;工作分工&#xff0c;项目拆解等方面都有一定的经验。 19年中旬&#…

基于TL431和CSA的恒压与负压输出

Hello uu们,51去那里玩了呀?该收心回来上班了,嘿嘿! 为什么会有这个命题,因为我的手头只有这些东西如何去实现呢?让我们一起来看电路图吧.电路图如下图1所示 图1:CSA恒压输出电路 图1中,R1给U2提供偏置,Q1给R1提供电流,当U1-VOUT输出大于2.5V时候,U2内部的三极管CE导通,使得…

Kalign 3:大型数据集的多序列比对

之前一直用的是muscle&#xff0c;看到一个文章使用了Kalign&#xff0c;尝试一下吧 安装 wget -c https://github.com/TimoLassmann/kalign/archive/refs/tags/v3.4.0.tar.gz tar -zxvf v3.4.0.tar.gz cd kalign-3.4.0 mkdir build cd build cmake .. make make test su…

JVM之内存分配的详细解析

内存分配 两种方式 不分配内存的对象无法进行其他操作&#xff0c;JVM 为对象分配内存的过程&#xff1a;首先计算对象占用空间大小&#xff0c;接着在堆中划分一块内存给新对象 如果内存规整&#xff0c;使用指针碰撞&#xff08;Bump The Pointer&#xff09;。所有用过的内…

图片四张的时候两个一排 图片三张 五张的时候三个一排 css 如何实现

实现的效果如下图 1、html <view v-if"item.photo_list && item.photo_list.length ! 0" :class"getImageClass(item.photo_list.length)"><view v-for"(j,ind) in item.photo_list" :key"photoind" class"imag…

[python]texthero安装后测试代码

测试环境&#xff1a; anaconda3python3.8 texthero1.1.0 测试代码来自官方&#xff1a;https://github.com/jbesomi/texthero 代码&#xff1a; import texthero as hero import pandas as pddf pd.read_csv("https://gitee.com/FIRC/texthero/raw/master/dataset/…

自动化运维管理工具-------------Ansible

目录 一、自动化运维工具有哪些&#xff1f; 1.1Chef 1.2puppet 1.3Saltstack 二、Ansible介绍 2.1Ansible简介 2.2Ansible特点 2.3Ansible工作原理及流程 2.3.1内部流程 2.3.2外部流程 三、Ansible部署 3.1环境准备 3.2管理端安装 ansible 3.3Ansible相关文件 …

Hibernate 元数据模型(MetaModel)提示类没有找到错误

在进行一次编译的时候&#xff0c;提示下面的错误信息&#xff1a; java: java.lang.ClassNotFoundException: org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor 问题和解决 如果你对 Hibernate 的元数据还是不非常了解的话&#xff0c;请参考文章&#xff1a; JPA 的…

保研面试408复习 3——操作系统

文章目录 1、操作系统一、进程有哪几种状态&#xff0c;状态之间的转换、二、调度策略a.处理机调度分为三级&#xff1a;b.调度算法 标记文字记忆&#xff0c;加粗文字注意&#xff0c;普通文字理解。 为什么越写越少&#xff1f; 问就是在打瓦。(bushi) 1、操作系统 一、进程…

深度学习中的不确定性量化:技术、应用和挑战综述(一)

不确定性量化(UQ)在减少优化和决策过程中的不确定性方面起着关键作用&#xff0c;应用于解决各种现实世界的科学和工程应用。贝叶斯近似和集成学习技术是文献中使用最广泛的两种UQ方法。在这方面&#xff0c;研究人员提出了不同的UQ方法&#xff0c;并测试了它们在各种应用中的…

JAVA学习14——异常

目录 异常&#xff1a; 1.异常基本介绍&#xff1a; 2.异常体系图&#xff1a; 3.五大运行时异常&#xff1a; &#xff08;1&#xff09;NullPointerException空指针异常&#xff1a; &#xff08;2&#xff09;AirthmetiException数字运算异常&#xff1a; &#xff0…

翻译《The Old New Thing》 - Thread messages are eaten by modal loops

Raymond Chen 2005年4月26日 模态消息循环吃掉了线程消息 简要 文章提出了一个常见但也容易被忽视的问题&#xff1a; 线程消息&#xff08;由 PostThreadMessage 创建&#xff09;在模态循环中会被 DispatchMessage 丢弃&#xff0c;因为它们没有关联的窗口句柄。建议在创建窗…

2024年好用的几款数据库管理工具

本文主要介绍几款市面上好用的几款支持多种数据库、跨平台的数据库管理工具&#xff0c;包括开源/免费/收费不同的形式。 1. Chat2DB Chat2DB 是一款自2022年9月起开源的AI驱动的数据库管理工具&#xff0c;现如今已经超过了13k的Star。由EasyExcel&#xff08;31K Star&#…

Linux网络编程---Libevent库

一、简介 Libevent库的特点&#xff1a;开源。精简。跨平台&#xff08;Windows、Linux、maxos、unix&#xff09;。专注于网络通信。 二、安装 进入官网下载安装包后拖入虚拟机&#xff0c;压缩包名为 libevent-2.1.11-stable.tar.gz解压&#xff1a;使用命令tar -zxvf libe…

Sy9-dhcp/dns服务配置

前言、 课程需要&#xff08;进入服务器综合配置使用阶段了&#xff09;&#xff0c;这里还是沿用桌面版的ubuntu来配置dhcp和dns&#xff0c;这里updated了新的版本。2024.5 server端环境&#xff1a; Win11VMS&#xff1a;192.168.105.1192.168.105.128 &#xff08;ubuntu…
最新文章