package com.vincent.rsf.server.common.utils;
|
|
import com.vincent.rsf.framework.common.Cools;
|
import org.artofsolving.jodconverter.OfficeDocumentConverter;
|
import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration;
|
import org.artofsolving.jodconverter.office.OfficeManager;
|
|
import java.io.File;
|
import java.util.Arrays;
|
import java.util.Base64;
|
|
/**
|
* OpenOfficeUtil
|
*
|
* @author vincent
|
* @since 2018-12-14 08:38:19
|
*/
|
public class OpenOfficeUtil {
|
// 支持转换pdf的文件后缀列表
|
private static final String[] CAN_CONVERTER_FILES = new String[]{
|
"doc", "docx", "xls", "xlsx", "ppt", "pptx"
|
};
|
|
/**
|
* 文件转pdf
|
*
|
* @param filePath 源文件路径
|
* @param outDir 输出目录
|
* @param officeHome OpenOffice安装路径
|
* @return File
|
*/
|
public static File converterToPDF(String filePath, String outDir, String officeHome) {
|
return converterToPDF(filePath, outDir, officeHome, true);
|
}
|
|
/**
|
* 文件转pdf
|
*
|
* @param filePath 源文件路径
|
* @param outDir 输出目录
|
* @param officeHome OpenOffice安装路径
|
* @param cache 是否使用上次转换过的文件
|
* @return File
|
*/
|
public static File converterToPDF(String filePath, String outDir, String officeHome, boolean cache) {
|
if (Cools.isEmpty(filePath)) {
|
return null;
|
}
|
File srcFile = new File(filePath);
|
if (!srcFile.exists()) {
|
return null;
|
}
|
// 是否转换过
|
String outPath = Base64.getEncoder().encodeToString(filePath.getBytes())
|
.replace("/", "-").replace("+", "-");
|
File outFile = new File(outDir, outPath + ".pdf");
|
if (cache && outFile.exists()) {
|
return outFile;
|
}
|
// 转换
|
OfficeManager officeManager = null;
|
try {
|
officeManager = getOfficeManager(officeHome);
|
OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);
|
return converterFile(srcFile, outFile, converter);
|
} catch (Exception e) {
|
e.printStackTrace();
|
} finally {
|
if (officeManager != null) {
|
officeManager.stop();
|
}
|
}
|
return null;
|
}
|
|
/**
|
* 转换文件
|
*
|
* @param inFile 源文件
|
* @param outFile 输出文件
|
* @param converter OfficeDocumentConverter
|
* @return File
|
*/
|
public static File converterFile(File inFile, File outFile, OfficeDocumentConverter converter) {
|
if (!outFile.getParentFile().exists()) {
|
if (!outFile.getParentFile().mkdirs()) {
|
return outFile;
|
}
|
}
|
converter.convert(inFile, outFile);
|
return outFile;
|
}
|
|
/**
|
* 判断文件后缀是否可以转换pdf
|
*
|
* @param path 文件路径
|
* @return boolean
|
*/
|
public static boolean canConverter(String path) {
|
try {
|
String suffix = path.substring(path.lastIndexOf(".") + 1);
|
return Arrays.asList(CAN_CONVERTER_FILES).contains(suffix);
|
} catch (Exception e) {
|
return false;
|
}
|
}
|
|
/**
|
* 连接并启动OpenOffice
|
*
|
* @param officeHome OpenOffice安装路径
|
* @return OfficeManager
|
*/
|
public static OfficeManager getOfficeManager(String officeHome) {
|
if (officeHome == null || officeHome.trim().isEmpty()) return null;
|
DefaultOfficeManagerConfiguration config = new DefaultOfficeManagerConfiguration();
|
config.setOfficeHome(officeHome); // 设置OpenOffice安装目录
|
OfficeManager officeManager = config.buildOfficeManager();
|
officeManager.start(); // 启动OpenOffice服务
|
return officeManager;
|
}
|
|
}
|