gitee开源程序kkFileView踩坑及解决方案

Posted 剑雪封喉r

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gitee开源程序kkFileView踩坑及解决方案相关的知识,希望对你有一定的参考价值。

目录

前言

一、依赖选择

二、环境部署安装

2.1解压

2.2启动程序

2.3踩坑--------office.home配置有误

2.4踩坑问题解决

三、踩坑-------OFFICE组件不可用

3.1确认是否是office组件的问题

3.2验证office组件是否不可用

3.3验证office组件是否可用

四、踩坑-------officeHome must exist and be a directory

五、程序优化

5.1无法打开dox文件,使用KFV程序转义成pdf时会报500,体验感很糟糕,我这里通过异常捕获,返回I‘m sorry图像

5.2文件无法打开,报404

5.3解决文件编译乱码问题

​总结


前言

       提示:本人从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,下载地址如下:

https://downloadarchive.documentfoundation.org/libreoffice/old/7.1.4.2/rpm/x86_64/LibreOffice_7.1.4.2_Linux_x86-64_rpm.tar.gz

https://downloadarchive.documentfoundation.org/libreoffice/old/7.1.4.2/rpm/x86_64/LibreOffice_7.1.4.2_Linux_x86-64_rpm_langpack_zh-CN.tar.gz

这两个分别下载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.4踩坑问题解决

编译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组件不可用

3.1确认是否是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:

3.2验证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语句执行成功后,等于程序成功编译完成了,接下来我们需要判断程序是否能用

3.3验证office组件是否可用

上传一个excel文件one.xlsx到/opt,通过libreoffice程序转换成pdf文件,

#准备一个文件夹做输出文件夹output,我这里的是rh

#准备一个文件夹做输出文件夹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

然后重新启动,接下来有惊喜

 

四、踩坑-------officeHome must exist and be a directory

如图所示:

出现这个bug的原因是我们配置office.home时office.home=/opt/liberoffice7.1的后面有空格即占位符,导致程序并不是访问的指定路径,删除掉空格后即可成功,如图:(空格导致的程序报错)

 

至此程序导致的office.home原因完美解决

五、程序优化

5.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);
                


其它位置需要捕获的同理。

5.2文件无法打开,报404

这是由于通过缓存的


方式进行的判断,可以是redis,也可以是Map等等,但是这些严格意义上来讲没错,但是实际上缺并不好用,
我这里修改成最简单的文件判断,如下:

File file = new File(outFilePath);
if(!file.exists)

5.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   查看是否成功

如图所示:


总结

提示:这里对文章进行总结:
如果后面还遇到一些坑,也会继续补充的。

————————————————
版权声明:本文为CSDN博主「墨绳」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43206536/article/details/121676962

以上是关于gitee开源程序kkFileView踩坑及解决方案的主要内容,如果未能解决你的问题,请参考以下文章

gitee开源程序kkFileView踩坑及解决方案

Maven 环境踩坑及完整配置

Java项目生产环境部署,遇到FTP连接加密服务器的踩坑及爬坑过程

kkFileView在centos7上安装

ES IK拼音插件踩坑及填坑记录

spring单元测试Mock,MockBean踩坑及没有真实执行的理解