springboot 实现office在线预览功能
in Docker with 0 comment

springboot 实现office在线预览功能

in Docker with 0 comment

1. 实际应用场景

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

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

image.png

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

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

2. 安装libreoffice

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

2.1 下载libreoffice安装文件

下载libreoffice

image.png

2.2 部署(docker)

2.2.1 下载jdk安装包

jdk官网

2.2.2 打包中文字体

windows系统下的字体包

image.png

tar -zcvf chinese.tar.gz *

2.2.3 编写Dockerfile

文件显示如下:
image.png

#基于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

<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>
jodconverter:
  local:
    enabled: true
    kill-existing-process: true
    max-tasks-per-process: 100
    office-home: @pom.office.home@
    portNumbers: 8100,8101,8102,8103,8104
<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

image.png

2.2.10 谷歌浏览器测试

image.png

测试成功

3 总结

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

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