软件下载地址:https://www.libreoffice.org/download/download/
pom.xml依赖:
<!-- liboffice -->
<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-online</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.jodconverter</groupId>
<artifactId>jodconverter-spring-boot-starter</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.libreoffice</groupId>
<artifactId>ridl</artifactId>
<version>5.4.2</version>
</dependency>
yml配置文件:
jodconverter:
#在线方式(docker部署libreoffice)
online:
enabled: true
#服务地址
url: http://localhost:9980/lool/convert-to/pdf
pool-size: 10
#本地方式:linux和windows均可,注意配置路径
local:
enabled: true
#安装路径
office-home: C:\Program Files\LibreOffice
#多实例
portNumbers: 8100,8101,8102
#最大处理数量
maxTasksPerProcess: 100
转换代码:
@Component
public class LibOfficeUtils {
private static final Logger logger = LoggerFactory.getLogger(LibOfficeUtils.class);
//DocumentConvert是个接口,以下两个bean是其实现,分别对应在线和本地转换
@Autowired
private OnlineConverter onlineDocumentConverter;
@Autowired
private LocalConverter localConverter;
/**
* @Author xd
* @Description office转pdf
* @Date 2021/1/31 15:54
* @Param [fromPath--源文件, toPath--目标文件]
* @return void
**/
public void convert(String fromPath,String toPath){
File from = new File(fromPath);
File to = new File(toPath);
try {
//如果在线转换失败
onlineDocumentConverter.convert(from).to(to).execute();
}catch (Exception e){
e.printStackTrace();
try {
//使用本地方式转换
localConverter.convert(from).to(to).execute();
} catch (OfficeException officeException) {
logger.info("文件转换失败,请检查");
officeException.printStackTrace();
}
}
}
}
针对评论区:调用/lool/convert-to/pdf接口提示failed to respond错误,没记错的话应该是源文件路径中有中文存在导致的。我们可以采用以下方式转换:
在jar包中有个json文件是关于文件后缀和媒体类型的对应关系:
//根据文件类型获取对应的DocumentFormat,括号里的参数是源文件的mediaType
DocumentFormat docx = onlineDocumentConverter.getFormatRegistry().getFormatByMediaType("application/pdf");
//这是另一种转换方法,这种转换方式为了解决在线转换源文件有中文路径的问题
onlineDocumentConverter.convert(new FileInputStream(from)).as(docx).to(to).execute();