简介
引入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;
@Component
public 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转换服务完成。");
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。