springboot 实现office在线预览功能

1. 实际应用场景

最近需要做个文件上传,遇到office办公类文档需求需要能够在现预览,文件存储采用的是阿里云oss,但是阿里在线预览功能收费比较贵,所以放弃了,因为谷歌支持PDF在线预览,所以改用生成PDF文档实现在线预览功能。

百度了一下实现office办公类文档转换成PDF文档的博客,收集到以下几种方案,在别人的博客中这样说道:

springboot 实现office在线预览功能

我综合对比了一下,咳咳,以最小成本为参考,最终选择两种方案openoffice和libreoffice,我在实际操作中,在用openoffice的时候出现了一些问题:

  • jar包找不到问题:需要自己先下载下来放到maven仓库中,因为jodconverter-maven-plugin 2.2.1 不支持docx格式的转换,需要2.2.2的jar包
  • 在上面问题解决之后,我测试了docx文档转换成PDF,发现转换过程中,目录页丢失,一开始以为是我代码问题,测试了三个小时还是这样,所以我就大胆的判定可能是openoffice转换出了问题。

最后测试了libreoffice的转换功能,完美转换,其他的我没有测,暂时只是发现了这一个问题,但是解决了我目前所遇到的问题,也算有个交差了。

2. 安装libreoffice

个人习惯用docker,所以接下来都是以docker的方式来安装

2.1 下载libreoffice安装文件

下载libreoffice

springboot 实现office在线预览功能

2.2 部署(docker)

2.2.1 下载jdk安装包

jdk官网

2.2.2 打包中文字体

windows系统下的字体包

springboot 实现office在线预览功能

tar -zcvf chinese.tar.gz *

2.2.3 编写Dockerfile

文件显示如下:

springboot 实现office在线预览功能

#基于centos7版本镜像
FROM centos:7
#以下设置中文语言环境与修改时区
ENV LANG=zh_CN.UTF-8 /
        LANGUAGE=zh_CN:zh /
        LC_ALL=zh_CN.UTF-8
RUN yum update -y && /
        yum reinstall -y glibc-common && /
        yum install -y telnet net-tools && /
        yum clean all && /
        rm -rf /tmp/* rm -rf /var/cache/yum/* && /
        localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8 && /
        ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#加入windows字体包
ADD chinese.tar.gz /usr/share/fonts/
#将下载好的包解压到相应文件下
ADD LibreOffice_6.4.3_Linux_x86-64_rpm.tar.gz /home/
#执行安装
RUN cd /home/LibreOffice_6.4.3.2_Linux_x86-64_rpm/RPMS/ /
        && yum localinstall *.rpm -y /
        #安装依赖
        && yum install ibus -y /
        #加入中文字体支持并赋权限
        && cd /usr/share/fonts/ /
        && chmod -R 755 /usr/share/fonts /
        && yum install mkfontscale -y /
        && mkfontscale /
        && yum install fontconfig -y /
        && mkfontdir /
        && fc-cache -fv /
        && mkdir /usr/local/java/ /
        #清理缓存,减少镜像大小
        && yum clean all
#加入安装java环境
ADD jdk-8u161-linux-x64.tar.gz /usr/local/java/
RUN ln -s /usr/local/java/jdk1.8.0_161 /usr/local/java/jdk
#配置环境变量
ENV JAVA_HOME /usr/local/java/jdk
ENV JRE_HOME ${JAVA_HOME}/jre
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH ${JAVA_HOME}/bin:$PATH
CMD ["bash"]

2.2.4 构建libreoffice镜像

docker build -t libreoffice:v1 .

2.2.5 打包推送到harbor私有仓库

首先先登录到harbor仓库

docker login --username=zhangsan --password=123456 https://www.example.com

docker tag libreoffice:v1 https://www.example.com/test/libreoffice:latest

docker push https://www.example.com/test/libreoffice:latest

等待上传成功, https://www.example.com/test 为你私有镜像仓库地址,以及你项目前缀

2.2.6 SpringBoot使用LibreOffice转换PDF

  • maven配置
<dependency>
    <groupId>org.jodconverter</groupId>
    <artifactId>jodconverter-core</artifactId>
    <version>4.2.0</version>
</dependency>
<dependency>
    <groupId>org.jodconverter</groupId>
    <artifactId>jodconverter-local</artifactId>
    <version>4.2.0</version>
</dependency>
<dependency>
    <groupId>org.jodconverter</groupId>
    <artifactId>jodconverter-spring-boot-starter</artifactId>
    <version>4.2.0</version>
</dependency>
 <dependency>
    <groupId>org.libreoffice</groupId>
    <artifactId>ridl</artifactId>
    <version>5.4.2</version>
</dependency>
  • 配置application.yaml
jodconverter:
  local:
    enabled: true
    kill-existing-process: true
    max-tasks-per-process: 100
    office-home: @pom.office.home@
    portNumbers: 8100,8101,8102,8103,8104
  • 使用Maven的多环境配置
<profiles>
        <profile>
            <!-- windows环境 -->
            <id>win</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>
                <pom.office.home>C:/Program Files/LibreOffice</pom.office.home>
            </properties>
        </profile>
        <profile>
            <!-- linux环境 -->
            <id>linux</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <pom.office.home>/opt/libreoffice6.4</pom.office.home>
            </properties>
        </profile>
    </profiles>
  • 调用方法
import org.jodconverter.DocumentConverter;

@Resource
private DocumentConverter documentConverter;

// 具体转换方法,参数是java.io.File
documentConverter.convert(sourceFile).to(targetFile).execute();
  1. convert方法 接受参数 java.io.File 或 java.io.InputStream
  2. to方法 接受参数 java.io.File 或 java.io.OutputStream

2.2.7 springboot编写docker打包文件

新建Dockerfile放在src目录

FROMhttps://www.example.com/test/libreoffice:latest
MAINTAINER zhouxinlei
VOLUME /tmp
EXPOSE 8901
ADD demo-1.0-SNAPSHOT.jar app.jar

ENTRYPOINT ["java","-Xms360m","-Xmx360m","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar","--spring.profiles.active=prod"]

2.2.8 构建项目运行环境镜像

docker build -t demo:v1 .

2.2.9 运行测试

docker run -d -p 8080:8901 -v /home/:/home/ demo:v1

springboot 实现office在线预览功能

2.2.10 谷歌浏览器测试

springboot 实现office在线预览功能

测试成功

3 总结

本次测试加开发。总耗时8个小时,也是自己走了一些坑,希望能为大家带来收获,少走一些坑。

下期为大家带来 itext 操作pdf文档,支持在线生成智能填充,智能缩放字体,行间距的控制。下期满满的干货哦,都是自己操作PDF时候总结的算法。

本文由 凛冬王昭君 创作,采用 知识共享署名4.0 国际许可协议进行许可

本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名

最后编辑时间为: May 3,2020

原文 

https://www.sparksys.top/archives/36

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » springboot 实现office在线预览功能

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址