使用openOffice4在集群部署下的实现方式

304 阅读2分钟

最近系统需要升级部署集群环境,发现之前项目中使用jodconverter + openOffice4方式实现转PDF功能,引用了springboot支持包中的自动配置类,所以在yml文件中强依赖了openOffice4的安装路径,具体配置代码如下: image.png 如果office-home这项配置错误或者服务器上没有安装openOffice4都会导致项目启动报错:

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.jodconverter.office.OfficeManager]: Factory method 'localOfficeManager' threw exception; nested exception is java.lang.IllegalStateException: officeHome doesn't exist or is not a directory: D:\software\openOffice4
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185)
	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:622)
	... 47 common frames omitted
Caused by: java.lang.IllegalStateException: officeHome doesn't exist or is not a directory: D:\software\openOffice4
	at org.jodconverter.office.LocalOfficeUtils.validateOfficeHome(LocalOfficeUtils.java:351)

现在需要对这里进行改造,代码中不强依赖安装的具体路径,而且jar包所在的服务器上就算没有安装openOffice4也不影响系统正常运行。废话不多说,方案如下: 改为使用com.artofsolving连接openoffice服务的方式,需要的pom依赖:

            <dependency>
                <groupId>com.artofsolving</groupId>
                <artifactId>jodconverter</artifactId>
                <version>2.2.2</version>
            </dependency>

            <dependency>
                <groupId>com.artofsolving</groupId>
                <artifactId>jodconverter.cli</artifactId>
                <version>2.2.2</version>
            </dependency>

            <dependency>
                <groupId>juh</groupId>
                <artifactId>juh</artifactId>
                <version>3.0.1</version>
            </dependency>

            <dependency>
                <groupId>jurt</groupId>
                <artifactId>jurt</artifactId>
                <version>3.0.1</version>
            </dependency>

            <dependency>
                <groupId>ridl</groupId>
                <artifactId>ridl</artifactId>
                <version>3.0.1</version>
            </dependency>

            <dependency>
                <groupId>unoil</groupId>
                <artifactId>unoil</artifactId>
                <version>3.0.1</version>
            </dependency>

openOffice4服务的host和port做成可配置,根据不同环境调整,代码如下:

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 org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

/**
 * 文件格式转换工具类
 *
 * @version 1.0
 * @since JDK1.8
 */
@Component
public class FileConvertUtil {

    @Resource
    private Environment environment;

    /**
     * 默认转换后文件后缀
     */
    private static final String DEFAULT_SUFFIX = "pdf";

    private static final String HTML_SUFFIX = "html";

    /**
     * 方法描述 office文档转换为PDF(处理本地文件)
     *
     * @param sourcePath 源文件路径
     * @param suffix     源文件后缀
     * @return InputStream 转换后文件输入流
     */
    public InputStream convertLocaleFile(String sourcePath, String suffix) throws Exception {
        File inputFile = new File(sourcePath);
        InputStream inputStream = new FileInputStream(inputFile);
        return covertCommonByStream(inputStream, suffix);
    }

    /**
     * 方法描述  office文档转换为PDF(处理网络文件)
     *
     * @param netFileUrl 网络文件路径
     * @param suffix     文件后缀
     * @return InputStream 转换后文件输入流
     */
    public InputStream convertNetFile(String netFileUrl, String suffix) throws Exception {
        URL url = new URL(netFileUrl); // 创建URL
        URLConnection urlconn = url.openConnection(); // 试图连接并取得返回状态码
        urlconn.connect();
        HttpURLConnection httpconn = (HttpURLConnection) urlconn;
        int httpResult = httpconn.getResponseCode();
        if (httpResult == HttpURLConnection.HTTP_OK) {
            InputStream inputStream = urlconn.getInputStream();
            return covertCommonByStream(inputStream, suffix);
        }
        return null;
    }

    /**
     * 方法描述  将文件以流的形式转换
     *
     * @param inputStream 源文件输入流
     * @param suffix      源文件后缀
     * @return InputStream 转换后文件输入流
     */
    public InputStream covertCommonByStream(InputStream inputStream, String suffix) throws ConnectException{
        //openOffice4服务的ip
        String officeHost = environment.getProperty("jodconverter.local.office-host");
        //openOffice4服务的端口号
        String officePort = environment.getProperty("jodconverter.local.office-port");
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        OpenOfficeConnection connection = new SocketOpenOfficeConnection(officeHost,Integer.valueOf(officePort));
        connection.connect();
        DocumentConverter converter = new StreamOpenOfficeDocumentConverter(connection);
        DefaultDocumentFormatRegistry 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);
    }

    /**
     * 获取想要转换的格式类型
     *
     * @return
     */
    private static String getTargetFileExt(String originFileExt) {
        if (HTML_SUFFIX.contains(originFileExt)) {
            return HTML_SUFFIX;
        }
        return DEFAULT_SUFFIX;
    }

    /**
     * 方法描述 outputStream转inputStream
     *
     */
    public static ByteArrayInputStream outputStreamConvertInputStream(final OutputStream out) {
        ByteArrayOutputStream baos = (ByteArrayOutputStream) out;
        return new ByteArrayInputStream(baos.toByteArray());
    }

}

参考文章:springboot高级功能(九)jodconverter实现在线预览