前言
对于Office的文件得在线预览基本有以下要求
- 尽量支持Centos,否则文件要在不同服务器之间来回传输
- 要支持在线预览
- 要支持转换为PDF自行处理
- 转换效果要好
- 最好PPT支持动态效果
在这些前提下我们来看看常用得解决方案,以及最终得选择。
测试文件
http://wordupload.xhkjedu.com/resource/0/0.ppt
http://wordupload.xhkjedu.com/resource/0/0.docx
2.6M
http://wordupload.xhkjedu.com/resource/0/0.pdf
60.93MB
免费方案
JobConverter + OpenOffice/Ibreoffice
下载地址:https://mirrors.cloud.tencent.com/libreoffice/libreoffice/stable/
https://github.com/sbraconnier/jodconverter
https://blog.csdn.net/shixiansen6535/article/details/101672148
https://blog.csdn.net/qingtian_1993/article/details/79901843
自己开发转换或预览功能
特点
- 基于OpenOffice或LiberOffice
- 支持Window、CentOS、Ubuntu
- PPT无动态预览效果
- 可以本地部署
缺点
- 转换效果不好
- 部分转换失败
用微软提供的com组件实现
微软提供一个叫做SaveAsPDFandXPS的com组建来实现office转换成pdf。
java通过jacob来调用com组件
具体实现
安装office2007
安装SaveAsPDFandXPS
说明:word、exccel、ppt转pdf用
安装Acrobat
说明:pdf转图片用
配置jacob
将jacob-1.18-x64.dll放置到用到的JDK/JRE目录的bin目录下
方案优点:
解决性能问题,完美解决兼容性问题
方案缺点:
需将转换服务单独部署,成为独立服务。
需要windows服务器。
需要实现linux系统和windows系统共享文件。(可以通过磁盘挂载的方式实现共享文件)
kkfileview
https://kkfileview.keking.cn/zh-cn/index.html
https://kkfileview.keking.cn/zh-cn/docs/production.html
在线预览:https://file.keking.cn/index
特点
基于OpenOffice或LiberOffice
支持Window、CentOS、Ubuntu
支持Docker部署
- 可以本地部署
缺点
- PPT无动态预览效果
文件预览支持以下格式
支持word excel ppt,pdf等办公文档
支持txt,java,php,py,md,js,css等所有纯文本
支持zip,rar,jar,tar,gzip等压缩包
支持jpg,jpeg,png,gif等图片预览(翻转,缩放,镜像)
支持mp3,mp4,flv等多媒体文件预览
XDOC
https://gitee.com/xdoc/xoffice
特点
基于MSOffice
支持Window
- 转换效果相对较好
- 可以本地部署
缺点
- PPT无动态预览效果
微软 office web app
https://www.cnblogs.com/lovechengcheng/p/4117391.html
https://www.cnblogs.com/yanweidie/p/4516164.html
https://github.com/marx-yu/WopiHost
特点
基于MSOffice
支持Window
PPT有动态预览效果
- 转换效果相对较好
- 可以本地部署
缺点
- 部署要求较高
可以使用微软在线服务器或则自己搭建服务器
WPS WebOffice
体验地址 https://ljserver.cn/wpsonline/#/webFile
特点
- PPT有动态预览效果
- 转换效果相对较好
缺点
- 不支持本地部署
收费方案
aspose-words
使用该jar处理
PageOffice
收费好多功能用不着
需要安装,不能动态播放ppt
PPT无动态预览效果
WebOffice
i doc view
演示 https://www.idocv.com/examples.html
PPT无动态预览效果
office web 365
官网 http://www.officeweb365.com/
永中office
https://www.yozodcs.com/page/example.html
ppt不支持动画,把动画播放后的页面展示了,近期要发布支持动画版本;
支持本地文件预览
展示
网页上展示文档的三种方式
(1)转换为PDF后加载
1 |
|
或者使用pdf.js:https://github.com/mozilla/pdf.js
(2)转换为PDF后转为图片加载
(3)单独的预览服务,在新地址中(新标签/iframe)预览
总结
总得来说
基于MSOffice的处理效果都会相对较好,但是必须Windows环境。
基于OpenOffice/Ibreoffice的优点也就是跨平台了。
如果项目只要求预览
- 如果服务器为win推荐
微软 office web app
支持动态效果 - Centos推荐使用
kkfileview
不支持动态效果
如果项目要能获取到图片
推荐使用JobConverter + OpenOffice/Ibreoffice
kkfileview使用
拉取镜像
1 | docker pull keking/kkfileview |
运行
1 | docker run -it -p 8012:8012 keking/kkfileview |
访问
浏览器访问容器8012端口(http://xxx.xxx.xxx.xxx:8012 )即可看到项目演示用首页
http://doctest.xhkjedu.com:8200
当您的项目内需要预览文件时,只需要调用浏览器打开本项目的预览接口,并传入须要预览文件的url,示例如下:
1 | var previewUrl = 'http://127.0.0.1:8080/file/test.txt'; //要预览文件的访问地址 |
CentOS上部署JobConverter + Ibreoffice环境
官网:https://zh-cn.libreoffice.org/download/libreoffice/
参数说明:https://help.libreoffice.org/Common/Starting_the_Software_With_Parameters/zh-CN
安装Ibreoffice
用YUM安装
查看
1 | yum list libreoffice |
结果
可安装的软件包
libreoffice.x86_64 1:5.3.6.1-24.el7
可以看出yum上只有5.3版本
安装
1 | # 卸载原来的 |
查看版本
1 | soffice --version |
转换
1 | soffice --headless --convert-to pdf /usr/local/office_package/0.docx --outdir /usr/local/office_package/ |
注意
libreoffice和openoffice原来是一家,所以早期版本的libreoffice命令和openoffice一样,后来版本的libreoffice就变了
官方下载安装
下载
1 | wget https://mirror-hk.koddos.net/tdf/libreoffice/stable/6.4.4/rpm/x86_64/LibreOffice_6.4.4_Linux_x86-64_rpm.tar.gz |
移动
1 | mkdir /usr/local/office_package/ |
解压
1 | cd /usr/local/office_package/ |
安装
1 | cd /usr/local/office_package/LibreOffice_6.4.4.2_Linux_x86-64_rpm/RPMS/ |
下载汉化包
1 | cd /usr/local/office_package/ |
解压
1 | tar -zxvf LibreOffice_6.4.4_Linux_x86-64_rpm_langpack_zh-CN.tar.gz |
进入目录安装
1 | cd /usr/local/office_package/LibreOffice_6.4.4.2_Linux_x86-64_rpm_langpack_zh-CN/RPMS/ |
查看可执行文件位置
1 | which libreoffice6.4 |
查看具体安装位置
1 | ll /usr/bin/libreoffice6.4 |
卸载
1 | yum erase libreoffice\* |
安装字体
在转换中我们会发现转换的pdf和原文档字体是有差异的,是因为系统上没有我们需要的字体,所以我们要安装字体
查看现有字体
1 | fc-list |
在CentOS 4.x开始用fontconfig来安装字体库
所以输入以下命令即可:
1 | yum -y install fontconfig |
打开目录
1 | cd /usr/share/ |
我们会看到fonts
和fontconfig
目录
添加字体
创建目录并进入
1 | mkdir /usr/share/fonts/chinese |
在Windows上找到C://Windows/Fonts
下最后几列中文名称的字体都上传到/usr/share/fonts/chinese
设置目录权限
1 | chmod -R 755 /usr/share/fonts/chinese |
修改字体配置文件了,首先通过编辑器打开配置文件:
1 | vi /etc/fonts/fonts.conf |
可以看到一个Font list,即字体列表,在这里需要把我们添加的中文字体位置加进去:
1 | <dir>/usr/share/fonts/chinese</dir> |
接下来需要安装ttmkfdir来搜索目录中所有的字体信息,并汇总生成fonts.scale文件,
输入命令:
1 | yum -y install ttmkfdir |
然后执行ttmkfdir命令即可:
1 | cd /usr/share/fonts/chinese &&\ |
最后别忘了刷新内存中的字体缓存,这样就不用reboot重启了:
1 | fc-cache |
这样所有的步骤就算完成了,最后再次通过fc-list
看一下字体列表:
1 | fc-list |
转换测试
下载doc文档
1 | cd /usr/local/office_package/ |
转换参数
1 | --convert-to pdf:writer_pdf_Export 1.doc |
可以简写为
1 | --convert-to pdf 1.doc |
docx=>pdf
1 | libreoffice6.4 --headless --invisible --convert-to pdf /usr/local/office_package/5.docx --outdir /usr/local/office_package/ |
或者
1 | libreoffice6.4 --headless --invisible --convert-to pdf:writer_pdf_Export /usr/local/office_package/5.docx --outdir /usr/local/office_package/ |
或者
1 | libreoffice6.4 -env:UserInstallation=file:///$HOME/.libreoffice-headless/ \ |
我这里直接就成功了
docx=>jpg
1 | libreoffice6.4 --headless --invisible --convert-to jpg /usr/local/office_package/0.docx --outdir /usr/local/office_package/ |
或者
1 | libreoffice6.4 -env:UserInstallation=file:///$HOME/.libreoffice-headless/ \ |
docx=>html
1 | libreoffice6.4 -env:UserInstallation=file:///$HOME/.libreoffice-headless/ \ |
报错解决
错误1
/opt/libreoffice6.4/program/soffice.bin: error while loading shared libraries: libcairo.so.2: cannot open shared object file: No such file or directory
原因是 libcairo.so.2
这个库找不到,我们下载安装就可以了
安装命令如下
1 | yum install cairo -y |
错误2
问题描述:
Libreoffice发生转换不成功(比如转换wps文件),再做转换就会直接不做任何操作
当你运行其中一个LibreOffice的时候,再运行另外一个Libreoffice转换时,将不做任何操作。
解决方法 添加-env:UserInstallation=file:///$HOME/.libreoffice-headless/
参数
5.3版本
1 | soffice -env:UserInstallation=file:///$HOME/.libreoffice-headless/ \ |
6.4版本
1 | libreoffice6.4 -env:UserInstallation=file:///$HOME/.libreoffice-headless/ \ |
或者
1 | libreoffice6.4 -env:UserInstallation=file:///$HOME/.libreoffice-headless/ \ |
导致这种问题的原因时有转换进程一直在运行,所以我们也可以杀掉进程
1 | top |
或者
1 | top -bc |grep soffice.bin |
查看卡死的进程杀死即可
1 | kill -9 进程id |
后端中使用
运行命令形式
1 | /** |
使用三方库
添加依赖
1 | <dependency> |
Java
1 | public static String toPdf(String srcPath, String desPath) throws OfficeException { |
结论
- 字体没有会导致转换后差异
- WPS文件无论转为doc或docx都无法转换
- 图片类型为嵌入型时部分转换图片丢失
CentOS上部署JobConverter + OpenOffice环境
下载安装
打开目录
1 | cd /usr/local/office_package/ |
下载地址
1 | wget https://jaist.dl.sourceforge.net/project/openofficeorg.mirror/4.1.7/binaries/zh-CN/Apache_OpenOffice_4.1.7_Linux_x86-64_install-rpm_zh-CN.tar.gz |
解压
1 | tar -zxvf Apache_OpenOffice_4.1.7_Linux_x86-64_install-rpm_zh-CN.tar.gz |
进入
1 | cd zh-CN/RPMS/ |
安装
1 | yum localinstall *.rpm |
命令执行完成之后,在opt文件目录中,会出现”openoffice4“文件夹,说明安装成功。
启动转换
启动
1 | /opt/openoffice4/program/soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard & |
查看是否启动成功
1 | netstat -nltp|grep 8100 |
成功提示
tcp 0 0 127.0.0.1:8100 0.0.0.0:* LISTEN 14118/soffice.bin
下载地址
https://sourceforge.net/projects/jodconverter/files/JODConverter/
文件转换
1 | java -jar jodconverter-cli-2.2.2.jar 0.docx 00.pdf |
注意
只有jodconverter-cli-2.2.2.jar是不行的 压缩包中的jar都要使用
项目中使用
1 | <dependencies> |
工具类
1 | public static void Word2Pdf(String srcPath, String desPath) throws IOException { |
卸载
1 | rpm -e `rpm -qa |grep openoffice` `rpm -qa |grep ooobasis` |
常见错误
错误1
file /usr/bin/soffice from install of openoffice4.1.7-redhat-menus-4.1.7-9800.noarch conflicts with file from package libreoffice-core-1:5.3.6.1-24.el7.x86_64
原因是安装过libreoffice,卸载即可
1 | yum remove libreoffice-* |
错误2
javaldx: invalid settings. User must select a JRE from options dialog!
不影响运行不用处理
结论
- 字体没有会导致转换后差异
- WPS文件无论转为doc或docx都无法转换
- 图片类型为嵌入型时部分转换图片丢失
转换结果和Ibreoffice没啥差异 弊端也都一样
aspose-words处理
下载及测试
aspose-words-18.6-jdk16
链接: https://pan.baidu.com/s/1r1gEi7ek5XAfEz6cczX96A 提取码: tavz
1 | import com.aspose.words.Document; |
结论
- 处理文字行间距过大
- 部分wps创建的文件无法转换
使用WPS转换(Windows环境)
这个也是COM方案,不同的是MSOffice换成了WPS,从而解决部分文件转换失败的问题。
相关jar和DLL
链接: https://pan.baidu.com/s/1yWaqdL0a-YWRiSP75ZSUPA 密码: rvi4
DLL根据系统是否64位选择对应的放到JDK目录下的bin目录中
其它jar引入项目中
工具类
1 | import java.awt.Color; |
使用WPS转换(CentOS环境)
暂时还未找到CentOS下调用wps转换的方法。
下载地址http://community.wps.cn/download/
下载
1 | cd /usr/local/office_package/ &&\ |
安装依赖
1 | yum install -y libpng12 &&\ |
安装
1 | rpm -ivh wps-office-11.1.0.9522-1.x86_64.rpm |
PDF转图片
将pdf转成图片,安装ImageMagick
1 | yum install ImageMagick |
转换
1 | convert -verbose -density 160 -trim 0.pdf -quality 90 0.jpg |
会生成0-0.jpg
,0-1.jpg
,0-2.jpg