本文摘要
文章介绍在泛微 E9 中集成开源 kkfileview 实现统一文档预览:先自行编译部署 kkfileview 服务,再新建工具类生成带 ddcode 的文件下载地址,改造 index2file.jsp 拼接并 Base64 编码预览链接嵌入 iframe,最后通过 kkfileview.properties 配置开关与地址。适合做 E9 二开的读者参考,作者提醒方案安全性与稳定性尚未全面评估,生产使用前需充分测试,并注意并发、大文件和移动端适配。

本博客只涉及部分核心操作,不是保姆级教学,希望你也能有自己的思路,感悟破局的乐趣。

20251020104536.gif

背景

在日常办公中,文件预览是一个高频且重要的需求。传统的文件预览方案往往存在格式支持有限、体验不佳等问题。泛微E9自带的文档预览功能虽然基础,但在面对复杂格式或特殊需求时往往力不从心。

今天给大家介绍如何通过集成开源的kkfileview项目,为泛微E9打造一个强大、统一的文档预览解决方案。

功能亮点

  • 多格式支持:支持Office、PDF、图片、视频、音频等常见格式
  • 无缝集成:与泛微E9原有文档模块完美融合
  • 零客户端:基于Web的纯前端预览,无需安装任何插件
  • 高性能:基于Spring Boot构建,响应迅速
  • 开源免费:基于Apache 2.0协议,可自由使用和修改

实施步骤

第一步:部署kkfileview服务

丸子采用的是从官方GitHub下载源码并自行编译打包的方式。如果你不想自己打包,可以私信丸子获取编译好的版本(有时间的话会分享)。

启动成功后访问演示页: image.png

访问成功界面: image.png

第二步:泛微E9文档功能改造

核心工具类

首先创建一个工具类,用于生成文件下载的ddcode(这是泛微文档外发的核心知识):

package com.onestools;
import weaver.docs.docs.util.DesUtils;
public class getFileDownloadUrl {
/**
* 根据文件ID生成临时下载URL
* @param fileid 文件ID
* @return 下载URL
*/
public static String getFileDownloadUrl(int fileid) {
try {
String encrypt = new DesUtils().encrypt(1 + "_" + fileid);
return "/weaver/weaver.file.FileDownload?fileid=" + fileid + "&download=1&ddcode=" + encrypt;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 根据文件ID和基础URL生成临时下载URL
* @param fileid 文件ID
* @param baseurl 基础URL
* @return 下载URL
*/
public static String getFileDownloadUrl(int fileid, String baseurl) {
try {
String encrypt = new DesUtils().encrypt(1 + "_" + fileid);
return baseurl + "/weaver/weaver.file.FileDownload?fileid=" + fileid + "&download=1&ddcode=" + encrypt;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}

JSP页面改造

在ecology目录下/docs/e9/index2file.jsp中增加kkfileview预览逻辑:

增加引用:

<%@ page import="com.onestools.getFileDownloadUrl" %>
<%@ page import="sun.misc.BASE64Encoder" %>

image.png

添加kkfileview预览逻辑:

// 现在检查kkfileview配置
boolean useKKFileView = "1".equals(rs.getPropValue("kkfileview","IsUsekkFileView"));
String kkFileViewUrl = rs.getPropValue("kkfileview","kkFileViewUrl"); // kkfileview服务地址
String e9BaseUrl = rs.getPropValue("kkfileview","E9BaseUrl"); // E9基础URL
if(useKKFileView && !isEdit) {
// KKFileView预览逻辑
if(!"".equals(Util.null2String(kkFileViewUrl)) && !"".equals(Util.null2String(e9BaseUrl))) {
try {
// 使用getFileDownloadUrl工具类生成下载链接
String originUrl = getFileDownloadUrl.getFileDownloadUrl(imagefileId, e9BaseUrl);
String previewUrl = originUrl + "&fullfilename=" + java.net.URLEncoder.encode(imagefilename, "UTF-8");
// Base64编码previewUrl
String base64Url = new BASE64Encoder().encode(previewUrl.getBytes("UTF-8"));
// 生成最终的iframe地址
docContent = "<iframe id=\"officeShow\" src=\""+kkFileViewUrl+"/onlinePreview?url="+java.net.URLEncoder.encode(base64Url, "UTF-8")+"\" style=\"display: block;width: 100%;height: 100%; border:0\"></iframe>";
} catch (Exception e) {
// 如果kkfileview出错,继续使用原有逻辑
e.printStackTrace();
}
}
}

image.png

第三步:系统配置

在ecology目录下/WEB-INF/prop新建kkfileview.properties 增加以下内容:

# 是否开启kkfileview
IsUsekkFileView=1
# kkfileview的外部访问地址
kkFileViewUrl=http://192.168.31.130:8012/kkpreview
# 相对于kkfileview访问E9的地址(建议内网地址)
E9BaseUrl=http://127.0.0.1:8080

注意事项

  1. 安全性考虑:该方案的安全性和稳定性暂未经过全面评估,请在生产环境使用前进行充分测试
  2. 性能优化:大量并发预览时可能需要考虑kkfileview的集群部署
  3. 文件大小:超大文件预览时需要注意网络传输和服务器性能
  4. 移动端适配:本示例只处理了index2file.jsp,如需移动端支持,需要对index2mobile.jsp进行类似改造

总结

通过集成kkfileview,我们成功为泛微E9赋予了强大的文档预览能力。这种”破局”思路不仅适用于文档预览,还可以扩展到其他系统功能的增强和改造。

技术只是工具,思路才是关键。希望这个案例能够激发大家更多的创新想法,在现有系统的基础上创造出更多可能性。


温馨提示:本文涉及的技术方案仅供学习参考,请根据实际环境进行评估和测试。如有技术问题,欢迎交流讨论!