最近系统需要升级部署集群环境,发现之前项目中使用jodconverter + openOffice4方式实现转PDF功能,引用了springboot支持包中的自动配置类,所以在yml文件中强依赖了openOffice4的安装路径,具体配置代码如下:
如果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());
}
}