网上有很多教程,但是很多坑,比如jobconvert2.2.1无法转pptx等格式的文件 而jobconvert2.2.2可以 但是maven仓库又没有 对于公司开发 这是个问题 毕竟公司的仓库不能让你随意操作。
由于公司使用的springboot 上网搜索了一下有相关的jar包 这就比较好办了 但是也有一些坑 下面是我的工作实践总结:
1
首先下载openoffice(外网下载很慢):http://www.openoffice.org/download/index.html
对于window版本 可以直接百度然后在国内网站下载 比较快 对于linux版本的可以在服务器用wget指令下载 这样比较快
我的版本是:Apache_OpenOffice_4.1.6_Linux_x86-64_install-rpm_zh-CN.tar.gz
2 下载相应jar包
<!--ppt转换为pdf word转换为pdf-->
<dependency>
<groupId>org.jodconverter</groupId>
<artifactId>jodconverter-spring-boot-starter</artifactId>
<version>4.2.2</version>
</dependency>
<dependency>
<groupId>org.jodconverter</groupId>
<artifactId>jodconverter-core</artifactId>
<version>4.2.2</version>
</dependency>
<!--jodconverter 本地支持包 -->
<!-- https://mvnrepository.com/artifact/org.jodconverter/jodconverter-local -->
<dependency>
<groupId>org.jodconverter</groupId>
<artifactId>jodconverter-local</artifactId>
<version>4.2.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
3 相信对于springboot有了解的应该知道 **--start 这种jar包一般都有自动配置 这个jar包也是有自动配置的 当我们配置了 相应的openOffice 相关配置
jodconverter:
local:
port-numbers: 8100
enabled: true
4 启动openOffice
启动OpenOffice服务
windows下
OpenOffice 4的program目录下cmd
./soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard
linux下:
cd /opt/openoffice4/program
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &
注:window 安装完program目录一般在:C:\Program Files (x86)\OpenOffice 4\program
5 注入工具类 转换
@Autowired
private Converter converter;
//转换
converter.rconvert(sourceFile).to(tartgetFile).execute()
由于自动配置就注入了一个工具类 我们可以直接在自己代码中注入这个类实现转码工作
但是这个前提是 我们在本地安装了openOffice 并且已经启用了 启用的端口为配置的端口 不然就会注入失败
由于笔者是公司合作开发 当其他同事拉取我的代码后 由于本地没有这个程序 所以注入会失败 然后导致项目启动不了 所以笔者没有采用这种方式 而且这种方式很死 无法控制openOffice的开关
方式二
我们不用它自动注入的converter 我们自己配置相应的属性 然后自己new一个转换器实现转换功能
1
首先在配置文件配置相应的配置 名字随意 自己能找到就行
officeconverter:
local:
#office-home: /opt/openoffice4/
office-home: C:\Program Files (x86)\OpenOffice 4
ports: 8100
2 在执行需要转码的处理器时才new一个转换器 (这个转换器应该时单例的 不应该new多个) 所以我写了一个工具类
public class OpenOfficeConvert {
private static OfficeManager officeManager;
private OpenOfficeConvert(){
}
public static void initOfficeMnnager(int [] ports,String officeHome){
if(officeManager!=null){
return;
}
if(ports==null||ports.length==0||officeHome==null||officeHome.equals("")){
throw new BusinessException("参数未配置");
}
officeManager= LocalOfficeManager.builder().portNumbers(ports).officeHome(officeHome).build();
}
public static void convert(File sourceFile,File tartgetFile) throws OfficeException {
if(officeManager==null){
throw new BusinessException("未初始化转换器,请先初始化");
}
if(!officeManager.isRunning()){
officeManager.start();
}
LocalConverter make = LocalConverter.make(officeManager);
make.convert(sourceFile).to(tartgetFile).execute();
//officeManager.stop();
}
public static void stopProcess() throws OfficeException {
if(officeManager!=null){
officeManager.stop();
}
}
}
3 使用工具类 转换文件 在需要转换文件的处理器哪里 我们首先初始化转化器 然后就可以转化了
int [] ports=environment.getProperty("officeconverter.local.ports",int[].class);
String officeHome=environment.getProperty("officeconverter.local.office-home");
try {
OpenOfficeConvert.initOfficeMnnager(ports,officeHome);
OpenOfficeConvert.convert(toFile,pdfFile);
} catch (OfficeException e) {
e.printStackTrace();
throw new BusinessException("转换文件出错");
}
上面的 ports 和officeHome为我们在配置文件中填写的 这样相当于告诉程序 我们的程序openOffice 安装在哪里 我们希望它运行的端口 初始化的时候 先检测这个端口的openOffice 服务是否已经启动 若没有启动 那么程序会自动启动 (这样不需要我们手动启动openOffice服务了)
方式二比较灵活