OpenOffice在线预览附件
Author xiuhong.chen@hand-china.com
Date 2018/1/20
Desc 在线预览附件功能
1.下载安装包
官方下载: http://www.openoffice.org/download/index.html
2.安装OpenOffice
此处对于安装过程针对windows 和 linux两种环境分别介绍:
Windows安装
-
双击安装包 打开运行程序 ----> 点击下一步按钮 ----> 点击浏览按钮 选择安装目录路径 -----> 会自动检测系统中的插件 如果需要会自动安装 -----> 输入使用的用户 以及选择用户权限 点击下一步按钮 -----> 勾选通常安装 点击下一步 ----> 点击完成 即安装结束
-
接下来以命令方式启动OpenOffice服务
cd C:\Program Files (x86)\OpenOffice 4\program soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard
服务打开成功之后在任务管理器可以看见soffice.bin的进程。
注意: 使用OpenOffice的时候一定要打开服务 !
比如我自己电脑晚上关机了,服务就自己关闭, 使用预览功能时候会报错:
java.net.ConnectException: connection failed: socket,host=127.0.0.1,port=8100,tcpNoDelay=1: java.net.ConnectException: Connection refused: connect at .....
Linux安装
linux安装教程可以参考网址:https://www.cnblogs.com/goodcheap/p/7929986.html
-
启动服务和windows不同的是,需要在命令末尾加 &
cd /opt/openoffice4/program soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &
-
查看服务是否成功启动
[root@vs058 program]# ps -ef|grep openoffice root 24818 24804 19 15:08 pts/4 00:00:00 /opt/openoffice4/program/soffice.bin -headless -accept=socket,host=127.0.0.1,port=8100;urp; -nofirststartwizard root 24824 24592 0 15:08 pts/4 00:00:00 grep openoffice [root@vs058 program]# netstat -lnp |grep 8100 tcp 0 0 127.0.0.1:8100 0.0.0.0:* LISTEN 24818/soffice.bin
3.引入jodconverter-2.2.2.jar包
引入jar包的过程摸索了很久, 对于一般的java项目,直接将jar包放在lib下就可以调用; 但是恰巧我用的是maven项目, 这就需要在maven中寻找依赖, 对于我这个maven新手而言,只听过maven,见过表面的maven,并没有很深入而又熟练地掌握它的用法,尤其是碰到在pom.xml中引入依赖这种问题. 只能很羞愧地寻求小伙伴的帮助或者百度.
-
在国内访问Maven仓库,连接速度太慢,所以我们要将中央仓库换成阿里云的中央仓库:
-
某些项目需要公司内部的依赖,这个时候我们就可以在项目的pom.xml中手动指定公司的仓库,比如下图,前提是公司仓库里有我们需要的依赖
-
pom.xml中引入 jar包请参考:http://blog.csdn.net/gfd54gd5f46/article/details/54973954 .
比如我们这个在线预览的功能需要 jodconverter-2.2.2.jar , 阿里的中央仓库里并没有这个包, 我们就需要从万能的百度下载该包,然后上传到我们公司的中央仓库:https://jingyan.baidu.com/article/a948d6517b72eb0a2dcd2e2a.html , 上传之后我们的仓库里就有该依赖了 ! 如下图:
-
仓库中的依赖已经准备好,接下来我们就在pom.xml中引入依赖:
<!-- 注意: jodconverter-2.2.1 不能转换docx xlsx pptx格式的文件. jodconverter-2.2.2 和 jodconverter-core-3.0-beta-4 都可以导入docx格式的文件, 二者可选其一, 不过使用这两个jar包的时候还需要导入下边这些依赖包: slf4j-api-1.7.25 , juh-4.1.2 , jurt-4.1.2 , ridl-4.1.2 , unoil-4.1.2 , xstream-1.4.10 否则会报错: java.lang.NoClassDefFoundError: com/sun/star/lang/DisposedException --> <!--OpenOffice将docx excel ppt 转换为pdf,实现在线预览--> <dependency> <groupId>com.hand.hap</groupId> <artifactId>jodconverter</artifactId> <version>2.2.2</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>org.openoffice</groupId> <artifactId>juh</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.openoffice</groupId> <artifactId>jurt</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.openoffice</groupId> <artifactId>ridl</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.openoffice</groupId> <artifactId>unoil</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>com.thoughtworks.xstream</groupId> <artifactId>xstream</artifactId> <version>1.4.10</version> </dependency> <!--openOffice-->
备注:
有小伙伴说很难找到jar包,我把jar包上传到了百度云盘里,大家根据项目选择不同的版本
链接:https://pan.baidu.com/s/16ujGhvEC4v1ucjkGwpCz7g
提取码:dgsm
4.前台代码
在附件上传界面可以上传文件,也可以获取到文件列表的详细信息, 比如 文件在服务器上的路径,还有文件名称
既然文件路径都获得到了, 那我们直接将文件路径和文件名称传递到后台进行预览, 代码如下:
kendoUI-Grid:
{
field: "",
headerAttributes: {
style: "text-align: center"
},
attributes: {style: "text-align:center"},
title: '预览',
width: 50,
template: function (e) {
return '<a href="##" onclick="preview( \''+e.filePath.replace(/\\/g,"/")+'\' , \''+e.fileName+'\')" style="text-decoration : underline;color : blue;cursor:pointer" >'
+ '预览'
+ '</a>'
}
}
将参数传递到controller:
function preview(filePath , fileName) {
window.open("${base.contextPath}/sys/attach/preview?filePath="+filePath+"&fileName="+fileName);
}
注意:
- 传递非字符串时:
"+item.basicId+"
- 传递字符串参数时:
\""+item.candidateRuleCode+"\"
用双引号将参数包围,同时使用转义符。 - 传递文件路径作为参数时: 文件路径中包括
"/"
或者"\"
, 只用双引号将参数包围会出错:Uncaught SyntaxError: Invalid Unicode escape sequence
, 所以我们用.replace(/\\/g,"/")
将路径中的参数全部用转义字符
5.后台代码
-
首先我们要根据
System.getProperty("os.name")
获得服务器类别, 然后自由转换文件路径, 比如linux就是``"/",windows就是
""` -
对于HAP框架来说, 文件上传到服务器时是不带后缀名的,这个时候利用jodconverter将docx文件转换为pdf文件时就会出现错误
java.lang.IllegalArgumentException: unknown document format for file: