提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:本人从2021年7月份开始使用开源框架kkFileView到现在已经过去了5个多月了,总提来讲kkFileView的功能很强大,由于需要集成依赖第三方软件openboffice或liberoffice,不可避免的会给开发人员或者使用部署人员带来很多兼容性和环境配置问题,我在这里踩了很多坑,这里做个总结,下面的kkFileView就简称KFV了
提示:以下是本篇文章正文内容,下面案例可供参考
一、依赖选择
示例:kkFileView需要第三方软件的功能支撑,因此如果选择的软件不符合程序能够接受的范围就会带来冲突,下面附上官方说明:
Java: 1.8+
Maven:3.4+
OpenOffice或LiberOffice(Windows下已内置,CentOS或Ubuntu下会自动下载安装,MacOS下需要自行安装)
不过这些提示并不精确,查看类OfficeUtils中getDefaultOfficeHome方法后定位到更精准范围,如下图:
windows下KFV自带完美兼容的windows-office,这里就不做说明了;
linux下可以选择openoffice4,而libreoffice可以选择使用libreoffice6.0-7.2版本;
作者这里选择的是libreoffice7.1版本的软件来兼容的KFV,下载地址如下:
这两个分别下载LibreOffice_7.1.4.2_Linux_x86-64_rpm.tar.gz 和LibreOffice_7.1.4.2_Linux_x86-64_rpm_langpack_zh-CN.tar.gz文件,前面提供启动程序,后面提供中文语言包
第三个需要下载的是KFV官网的linux能运行的jar包下载地址如下:(https://kkfileview.keking.cn)
https://kkfileview.keking.cn/kkFileView-4.0.0.tar.gz
二、环境部署安装
2.1解压
将下载好的程序传到某个目录下,我这里的文件目录是
/export/server/LibreOffice_7.1.4.2_Linux_x86-64_rpm.tar.gz
/export/server/LibreOffice_7.1.4.2_Linux_x86-64_rpm_langpack_zh-CN.tar.gz
/export/server/kkFileView-4.0.0.tar.gz
接下来需要解压文件:
使用命令如下:
#进入解压文件位置后
tar -zxvf /export/server/LibreOffice_7.1.4.2_Linux_x86-64_rpm.tar.gz
tar -zxvf /export/server/LibreOffice_7.1.4.2_Linux_x86-64_rpm_langpack_zh-CN.tar.gz
tar -zxvf /export/server/kkFileView-4.0.0.tar.gz
2.2启动程序
解压后目录结构如图所示;
进入 cd ./kkFileView4.0.0/bin ,然后执行命令sh ./startup.sh sh ./showlog.sh
这个时候你就会发现第一个坑:office.home配置有误
2.3踩坑--------office.home配置有误
这个是由于KFV的加载程序找不到office.home,在OfficePluginManager类的,startOfficeManager方法下,源码截图:
OfficeUtils.getDefaultHome()方法是获取 配置文件application.properties的office.home的加载位置,这个不配置的话,在linux中有启动程序会扫描openoffice、libreoffice文件夹自动获取并加载,因此不是导致office.home出现的主要原因,主要原因是上面我们下载的2个程序并没有编译生成可被KFV扫描的程序。
2.3踩坑问题解决
编译LibreOffice_7.1.4.2_Linux_x86-64_rpm和LibreOffice_7.1.4.2_Linux_x86-64_rpm_langpack_zh-CN文件,命令如下:
#进入到/export/server目录
sudo yum install -y ./LibreOffice_7.1.4.2_Linux_x86-64_rpm/RPMS/*.rpm
#然后再执行
sudo yum install -y ./LibreOffice_7.1.4.2_Linux_x86-64_rpm_langpack_zh-CN/RPMS/*.rpm
这里还要很多命令,如卸载libreoffice程序语句:
sudo yum remove libreoffice7.1-*
这里的7.1是版本号
这个时候我们再执行启动程序./startip.sh突然发现程序启动成功,这是由于我们编译后会在
目录/opt下创建了libreoffice7.1文件,如图所示:
到这里我们初步成功似乎很完美了,接下来我为你表演各种坑,如下:
三、踩坑-------OFFICE组件不可用
确认是否是office组件的问题
大部分office组件不可用是由于未关闭office程序导致的,先验证office程序是否关闭:
ps -ef |grep office
如果有就说明,office程序未关闭,我这里提供了一个./shutdown.sh脚本,可用拿着用,替换KFV的./shutdown.sh即可
#!/bin/bash
FIDS=`ps -ef|grep kkFileView-4.0.0.jar|awk '{print $2}'`
PIDS=`ps -ef|grep office|awk '{print $2}'`
if [ -z "$FIDS" ]; then
echo "ERROR: The kkFileView does not started!"
exit 1
fi
for FID in $FIDS ; do
kill -9 $FID
done
echo "OK!"
echo "FID: $FIDS"
if [ -z "$PIDS" ]; then
echo "ERROR: The office does not started!"
exit 1
fi
for PID in $PIDS ; do
kill -9 $PID
done
echo "OK!"
echo "PID: $PIDS"
如果你发现office已经关闭了还是出现以上问题,接下来你需要注释掉如下代码,再编译上传到Linux运行加载判断是否是KFV的office监听程序异常导致的。我测试的时候,发现绝大部分office.home报错都是这个检测程序导致的。
如图所示,注释掉OfficeProcess.java程序start方法下的,用来判断soffice.bin程序是否存在,注释掉后如果程序还是启动不起来,就说明是office组件的问题了,不过一般都不是组件的问题,下面是来检测组件是否存在问题的步骤3:
验证office组件是否不可用
第一步验证文件是否安装成功
执行以下命令:
/opt/libreoffice7.1/program/soffice -help
截图如下:
这里讲解以下为什么需要执行这条语句,主要是验证soffice.exe程序是否可用,KFV这里有对该程序的启动代码,如下所示:
也就是说程序启动时会获取soffice.bin程序和启动配置文件application.properyies的office.plugin.server.ports = 2001,2002端口号进行加载,
这也就是starting process with acceptString ‘%s’ and profileDir '%s’等等提示语句该类为OfficeProcess。
当我们发现-help语句执行成功后,等于程序成功编译完成了,接下来我们需要判断程序是否能用
验证office组件是否可用
上传一个excel文件one.xlsx到/opt,通过libreoffice程序转换成pdf文件,
#准备一个文件夹做输出文件夹output,我这里的是rh
/opt/libreoffice7.1/program/soffice --headless --convert-to pdf:writer_pdf_Export /opt/one.xlsx --outdir /opt/rh/
在浏览器打开,如图所示:
发现office程序没问题了,以上流程只要有一出流程加载有问题就可能导致office组件真的存在问题,所以只要程序出错,我建议删除–重装大法。
为了保险起见我建议配置环境变量,操作如下
vi /etc/profile
export PATH=$PATH:/opt/libreoffice7.1/program
#保存退出
source /etc/profile
#执行成功代表配置完成
soffice --version
到这一步后为避免程序出现office组件不可用的情况,需要进行如下操作
#进入kkFileView目录
cd conf/
vi application.properties
#修改office.home
office.home=/opt/liberoffice7.1
然后重新启动,接下来有惊喜
在windows版本下验证office组件是否不可用
1、环境搭建:
下载Libreoffice7.1压缩包,下载路径我已经为大家准备好了:https://downloadarchive.documentfoundation.org/libreoffice/old/7.1.0.1/win/x86_64/
如图所示:
直接下载它就行了,安装的时候一路默认选项,你会发现在C:\Program Files\LibreOffice下有一个program文件夹,我在桌面上已经实现准备好了一个测试文件one.xlsx,现在我要通过office组件将它转换成pdf格式,在C:\Program Files\LibreOffice\program文件路径输入cmd,进入命令行窗口,
执行
soffice --headless --convert-to pdf:writer_pdf_Export C:\Users\Administrator\Desktop/one.xlsx --outdir C:\Users\Administrator\Desktop
如图:
最后我发现在桌面上生成了一个one.pdf文件,打开看看,如下图。
说明office组件可用,验证成功。
四、踩坑-------officeHome must exist and be a directory
如图所示:
出现这个bug的原因是我们配置office.home时office.home=/opt/liberoffice7.1的后面有空格即占位符,导致程序并不是访问的指定路径,删除掉空格后即可成功,如图:(空格导致的程序报错)
至此程序导致的office.home原因完美解决
五、程序优化
1、无法打开dox文件,使用KFV程序转义成pdf时会报500,体验感很糟糕,我这里通过异常捕获,返回I‘m sorry图像
代码如下:
位置:OfficeFilePreviewImpl.class
步骤:第一步添加日志程序:
private final Logger logger = LoggerFactory.getLogger(OfficeFilePreviewImpl.class);
##########################
try {
officeToPdfService.openOfficeToPDF(filePath, outFilePath);
if (isHtml) {
// 对转换后的文件进行操作(改变编码方式)
fileHandlerService.doActionConvertedFile(outFilePath);
}
if (ConfigConstants.isCacheEnabled()) {
// 加入缓存
fileHandlerService.addConvertedFile(pdfName, fileHandlerService.getRelativePath(outFilePath));
}
}catch (Exception e){
logger.error("文件解析异常,请检测文件是否可用,file name is {} and error is {}",fileName,e.getMessage());
String errorMsg = "文件解析异常,请检测文件是否可用";
return otherFilePreview.notSupportedFile(model, errorMsg);
}
其它位置需要捕获的同理。
2、文件无法打开,报404
这是由于通过缓存的
方式进行的判断,可以是redis,也可以是Map等等,但是这些严格意义上来讲没错,但是实际上缺并不好用,
我这里修改成最简单的文件判断,如下:
File file = new File(outFilePath);
if(!file.exists){
}
3、解决文件编译乱码问题
上面的one.xlsx文件转换成one.pdf后发现有部分数据已经出现了乱码,而KFV提供了很强的帮助来针对文件乱码问题。步骤如下:
fonts文件的来源:windows下的C:\Windows\Fonts下文件拷贝就行了,然后放到chinese目录下。
cd /usr/share/fonts
mkdir chinese
chmod -R 755 /usr/share/fonts/chinese
vi /etc/fonts/fonts.conf
<dir>/usr/share/fonts/chinese</dir>
6、按 esc键进入安全模式,输出 :wq 保存更改推出,如下图
7、fc-cache 更新更改生效 刷新缓存
8、fc-list 查看是否成功
如图所示:
总结
提示:这里对文章进行总结:
如果后面还遇到一些坑,也会继续补充的。