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; } }