OpenOffice在线预览文档

使用OpenOffice在线预览文档

开发中遇到了一个需求,需要在线预览word文档,excel表格,pdf等等文件,于是经过一圈Google,发现了这个工具,openoffice会把文档转为pdf文件再打开,话不多说,直接上代码

百度下载OpenOffice,打开服务即可,这里不做过多解释

导入依赖

	   <!--openoffice依赖-->
       <dependency>
           <groupId>com.artofsolving</groupId>
           <artifactId>jodconverter</artifactId>
           <version>2.2.1</version>
       </dependency>

OpenOfficeUtil工具类

import com.artofsolving.jodconverter.BasicDocumentFormatRegistry;
import com.artofsolving.jodconverter.DefaultDocumentFormatRegistry;
import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.DocumentFormat;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.StreamOpenOfficeDocumentConverter;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

/**
 * @program: hongjiesuan-service-image
 * @description: openOffice工具类
 * @author: jiachaoyang
 * @create: 2022-05-27 11:21
 **/
public class OpenOfficeUtil {
    /** 默认转换后文件后缀 */
    private static final String DEFAULT_SUFFIX = "pdf";
    /** openoffice_port */
    private static final Integer OPENOFFICE_PORT = 8100;

    /**
     * @Description office文档转换为PDF(处理本地文件)
     * @Params [sourcePath 文件路径, suffix 文件后缀名]
     * @Return InputStream
     * @Author Mr.Jia
     * @Date 2022/5/27 11:21
     */
    public static InputStream convertLocaleFile(String sourcePath, String suffix) throws Exception {
        File inputFile = new File(sourcePath);
        InputStream inputStream = new FileInputStream(inputFile);
        return covertCommonByStream(inputStream, suffix);
    }

    /**
     * @Description office文档转换为PDF(处理网络文件)
     * @Params [netFileUrl, suffix]
     * @Return InputStream
     * @Author Mr.Jia
     * @Date 2022/5/27 11:21
     */
    public static InputStream convertNetFile(String netFileUrl, String suffix) throws Exception {
        // 创建URL
        URL url = new URL(netFileUrl);
        // 试图连接并取得返回状态码
        URLConnection urlconn = url.openConnection();
        try{
            urlconn.connect();
            System.out.println("连接成功");
            InputStream inputStream = urlconn.getInputStream();
            if (inputStream == null){
                System.out.println("--------- input stream is null");
                return null;
            }
            HttpURLConnection httpconn = (HttpURLConnection) urlconn;
            int httpResult = httpconn.getResponseCode();
            if (httpResult == HttpURLConnection.HTTP_OK) {
                return covertCommonByStream(inputStream, suffix);
            }
        }catch (Exception e){
            System.out.println("连接失败");
        }
        return null;
    }

    /**
     * @Description 将文件以流的形式转换
     * @Params [inputStream, suffix]
     * @Return InputStream
     * @Author Mr.Jia
     * @Date 2022/5/27 11:21
     */
    public static InputStream covertCommonByStream(InputStream inputStream, String suffix) throws Exception {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        OpenOfficeConnection connection = new SocketOpenOfficeConnection(OPENOFFICE_PORT);
        connection.connect();
        DocumentConverter converter = new StreamOpenOfficeDocumentConverter(connection);
        BasicDocumentFormatRegistry formatReg = new DefaultDocumentFormatRegistry();
        DocumentFormat targetFormat = formatReg.getFormatByFileExtension(DEFAULT_SUFFIX);
        DocumentFormat sourceFormat = formatReg.getFormatByFileExtension(suffix);
        converter.convert(inputStream, sourceFormat, out, targetFormat);
        connection.disconnect();
        return outputStreamConvertInputStream(out);
    }

    /**
     * @Description outputStream转inputStream
     * @Params [out]
     * @Return ByteArrayInputStream
     * @Author Mr.Jia
     * @Date 2022/5/27 11:21
     */
    public static ByteArrayInputStream outputStreamConvertInputStream(final OutputStream out) throws Exception {
        ByteArrayOutputStream baos=(ByteArrayOutputStream) out;
        return new ByteArrayInputStream(baos.toByteArray());
    }
}

只需要调用convertLocaleFile方法或者convertNetFile即可

但是OpenOffice不支持docx和xlsx和pptx等扩展的文件(暂时还没搞清楚是不是版本的问题),需要重写getFormatByFileExtension,让OpenOffice把docx等文件按照doc这种形式转换

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 void addDocumentFormat(DocumentFormat documentFormat) {
        documentFormats.add(documentFormat);
    }

    protected List/* <DocumentFormat> */ getDocumentFormats() {
        return documentFormats;
    }

    /**
     * 重写openOffice的方法,将后缀名重新赋值
     * @param extension
     * @return
     */
    @Override
    public DocumentFormat getFormatByFileExtension(String extension) {
        if (extension == null) {
            return null;
        }

        //转化文件后缀名
        if (extension.contains("docx")) {
            extension = "doc";
        }
        if (extension.contains("pptx")) {
            extension = "ppt";
        }
        if (extension.contains("xlsx")) {
            extension = "xls";
        }
        String lowerExtension = extension.toLowerCase();
        for (Iterator it = documentFormats.iterator(); it.hasNext(); ) {
            DocumentFormat format = (DocumentFormat) it.next();
            if (format.getFileExtension().equals(lowerExtension)) {
                return format;
            }
        }
        return null;
    }

    @Override
    public DocumentFormat getFormatByMimeType(String mimeType) {
        for (Iterator it = documentFormats.iterator(); it.hasNext(); ) {
            DocumentFormat format = (DocumentFormat) it.next();
            if (format.getMimeType().equals(mimeType)) {
                return format;
            }
        }
        return null;
    }
}

注:最好新建一个包路径跟openoffice一样的路径

这是我的路径

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值