简介
引入jodconverter相关jar,配合libreOffice、openOffice两款软件,只需进行简单编码可以实现各种文档转换。
应用
目前已在两个项目中应用:
- F项目需要滚动播放视频、文档(Excel/Word...)功能,使用jodconverter将文档转成pdf,结合pdfjs实现。由于个人独立开发,只要结果,故选型自由。后端Spring boot,前端阿里飞冰。可以直接使用jodconverter的starter:
<!-- jodconverter newer 4.2 --><dependency> <groupId>org.jodconverter</groupId> <artifactId>jodconverter-core</artifactId> <version>4.2.0</version></dependency><dependency> <groupId>org.jodconverter</groupId> <artifactId>jodconverter-local</artifactId> <version>4.2.0</version></dependency><dependency> <groupId>org.jodconverter</groupId> <artifactId>jodconverter-spring-boot-starter</artifactId> <version>4.2.0</version></dependency>
使用也非常方便,注入可用:
import java.io.File;import javax.annotation.Resource;import org.jodconverter.DocumentConverter;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import com.foton.common.Constants;@Componentpublic class DocumentConverterUtil { private final Logger logger = LoggerFactory.getLogger(this.getClass());// @Value("${office.home}")// String officeHome; @Resource private DocumentConverter documentConverter; public String convert(File in, File out) {// DocumentFormat pdf = documentConverter.getFormatRegistry().getFormatByExtension("pdf"); try { String fileName=in.getName(); String fileType=fileName.substring(fileName.lastIndexOf(".")+1,fileName.length()); // Excel尺寸控制 if(fileType.equals("xls")) ConverterUtil.setXlsFitToWidth(in); long startTime = System.currentTimeMillis(); documentConverter.convert(in).to(out).execute(); long conversionTime = System.currentTimeMillis() - startTime; logger.info(String.format("successful conversion: %s to %s in %dms",in.getName(), "pdf", conversionTime)); } catch (Exception e) { e.printStackTrace(); return Constants.FAIL; } return Constants.SUCCESS; }}
- H项目应审查要求,原本开发的导出Excel功能需调整为导出pdf,因此在原来基础功能上用jodconvert额外增加一次转换。由于公司要求限制,该项目在jdk1.7下开发,非maven,因此需要传统jar方式引入相关依赖jar包。值得注意的是,jodconvert在4.1.0不支持jdk7,而4.1.0版本仅会吃libreOffice 5(libreOffice升级到6后目录变更,作者在4.2.0版本中调整,但该版本不支持jdk7)。此外,convert的启动与结束需要自己控制。
import com.eos.runtime.core.IRuntimeListener;import com.eos.runtime.core.RuntimeEvent;public class JodConverterStartupListener implements IRuntimeListener { @Override public void start(RuntimeEvent arg0) { DocumentConverterUtil.start(); // 项目启动时调用 } @Override public void stop(RuntimeEvent arg0) { DocumentConverterUtil.stop(); // 结束时关闭 }}
import java.io.File;import org.jodconverter.DocumentConverter;import org.jodconverter.LocalConverter;import org.jodconverter.office.LocalOfficeManager;import org.jodconverter.office.OfficeException;import org.jodconverter.office.OfficeManager;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class DocumentConverterUtil { private static final Logger logger = LoggerFactory.getLogger(DocumentConverterUtil.class); public static DocumentConverter documentConverter; public static OfficeManager officeManager; public static void start() { officeManager = LocalOfficeManager.builder().build(); documentConverter = LocalConverter.make(officeManager); try { officeManager.start(); logger.info(">>> office转换服务启动成功!"); } catch (OfficeException e) { e.printStackTrace(); } } public static void converter(String inputFilePath, String outputFilePath) throws Exception { File inputFile = new File(inputFilePath); if (inputFile.exists()) {// 找不到源文件, 则返回 File outputFile = new File(outputFilePath); if (!outputFile.getParentFile().exists()) { // 假如目标路径不存在, 则新建该路径 outputFile.getParentFile().mkdirs(); } String fileType = inputFilePath.substring(inputFilePath.lastIndexOf(".")+1,inputFilePath.length()); if(fileType.equals("xls")) ConverterUtil.setXlsFitToWidth(inputFile); documentConverter.convert(inputFile) .to(outputFile) .execute(); } } public static void stop() { if (officeManager.isRunning()) { try { officeManager.stop(); } catch (OfficeException e) { e.printStackTrace(); } logger.info(">>> office转换服务完成。"); } }}
关于我
rebey.cn