office转pdf并添加水印


场景介绍

项目里有上传附件的功能,不同模块上传的方式还不同,附件的格式可以是任意的。

我们有上传视频的,然后大小还是好几个 G 的那种,这样的我们选择了阿里云的产品,叫视频点播,还可以通过客户端上传,最大可支持 10G,对我们来说足够了,并且还需要转码成 mp4,因为要支持 app 播放,阿里云也是可以做到的,这个会单独写一篇。

office 文档,先需要加水印,但只有 pdf 才可以加水印,还得把文档转成 pdf,上传完后,还要支持在线预览,所以这个就需要一整套相关的东西了。转换格式>加水印>上传>在线预览。这里就依次介绍。

环境要求

openOffice

  • window版本

    下载地址:http://www.openoffice.org/download/index.html

    安装后,右键启动图标查看安装路径,通过 cmd 进入 program 路径下:

    启动服务命令:soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;"

  • linux版本

    下载地址:https://pan.baidu.com/s/19ZUzTGZ2_QKVlfZEWpBicQ

    注:这个其实是一个文件预览的插件,并且这个预览也是在我们项目里有用到的,所以就一并安装了,在 linux 上解压启动,他会自动安装 openOffice,安装路径为:/opt/openoffice4,解决了 openOffice 安装的繁琐步骤。

    启动服务命令:/opt/openoffice4/program/soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &

    注:后来发现这种启动方式只能本地连接,远程不行将host=的ip地址写为0.0.0.0就可以通过java远程连接了

    查看端口:netstat -lnp |grep 8100

JodConverter

转 pdf 需要的 jar 包工具,maven 依赖如下:

<dependency>
    <groupId>com.artofsolving</groupId>
    <artifactId>jodconverter</artifactId>
    <version>2.2.1</version>
</dependency>
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.4.2</version>
</dependency>
<dependency>
    <groupId>org.openoffice</groupId>
    <artifactId>jurt</artifactId>
    <version>3.0.1</version>
</dependency>
<dependency>
    <groupId>org.openoffice</groupId>
    <artifactId>ridl</artifactId>
    <version>3.0.1</version>
</dependency>
<dependency>
    <groupId>org.openoffice</groupId>
    <artifactId>juh</artifactId>
    <version>3.0.1</version>
</dependency>
<dependency>
    <groupId>org.openoffice</groupId>
    <artifactId>unoil</artifactId>
    <version>3.0.1</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-jdk14</artifactId>
    <version>1.4.3</version>
</dependency>

注:jodconverter 在 maven 中的版本只有 2.2.1,但有一个问题,转 pdf 的时候不兼容 pptx,docx,xlsx 这样的文档,在 2.2.2 的版本解决了这个问题,但我们想用这个兼容的版本,就要改下一 BasicDocumentFormatRegistry 类中的 getFormatByFileExtension 方法:

  • 第一步:新建包:com.artofsolving.jodconverter

  • 第二步:新建类:BasicDocumentFormatRegistry,代码如下:

    package com.artofsolving.jodconverter;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    public class BasicDocumentFormatRegistry implements DocumentFormatRegistry {
        private List documentFormats = new ArrayList();
    
        public BasicDocumentFormatRegistry() {
        }
        public void addDocumentFormat(DocumentFormat documentFormat) {
            this.documentFormats.add(documentFormat);
        }
        protected List getDocumentFormats() {
            return this.documentFormats;
        }
        @Override
        public DocumentFormat getFormatByFileExtension(String extension) {
            if (extension == null) {
                return null;
            } else {
                if (extension.indexOf("doc") >= 0) {
                    extension = "doc";
                }
                if (extension.indexOf("ppt") >= 0) {
                    extension = "ppt";
                }
                if (extension.indexOf("xls") >= 0) {
                    extension = "xls";
                }
                String lowerExtension = extension.toLowerCase();
                Iterator it = this.documentFormats.iterator();
    
                DocumentFormat format;
                do {
                    if (!it.hasNext()) {
                        return null;
                    }
                    format = (DocumentFormat)it.next();
                } while(!format.getFileExtension().equals(lowerExtension));
    
                return format;
            }
        }
        @Override
        public DocumentFormat getFormatByMimeType(String mimeType) {
            Iterator it = this.documentFormats.iterator();
    
            DocumentFormat format;
            do {
                if (!it.hasNext()) {
                    return null;
                }
                format = (DocumentFormat)it.next();
            } while(!format.getMimeType().equals(mimeType));
    
            return format;
        }
    }

    其实就是修改了带×的处理方式跟不带×的一样,这样,就可以把 pptx,docx 等这样的文档转成 pdf,然后就可以加水印了。添加类后的项目结构

    image-20210424164520901

转PDF

环境好了,开始转 pdf。代码如下:


文章作者: 选手一号位
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 选手一号位 !
  目录