poi-tl+jodconverter+LibreOffice
poi-tl这个是专门用来进行word模板合成的开源库,文档很详细。
LibreOffice 下载最新的稳定版本即可。下载地址
实操
1.maven依赖
<!-- word合成 -->
<!-- 这里注意版本,1.5版本依赖的poi 3.x的版本 -->
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.5.1</version>
</dependency>
<!-- jodconverter word转pdf -->
<!-- jodconverter-core这个依赖,理论上不用加的,jodconverter-local已经依赖了,但测试的时候不添加依赖找不到 -->
<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>
<!-- 工具类,非必须 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.4.3</version>
</dependency>
1. 主要代码
JodConverterConfig配置类
@Configuration
public class JodConverterConfig {
@Autowired
private OfficeManager officeManager;
@Bean
public DocumentConverter documentConverter() {
return LocalConverter.builder()
.officeManager(officeManager)
.build();
}
}
yml配置文件
jodconverter:
local:
enabled: true
#LibreOffice 安装地址
office-home: "C:\\Program Files\\LibreOffice"
PdfService合成导出代码
@Slf4j
@Component
public class PdfService {
@Autowired
private DocumentConverter documentConverter;
public void docxToPDF(InputStream inputStream,HttpServletResponse response,String fileName) {
response.setContentType("application/pdf");
try {
String fullFileName = new String(fileName.getBytes(), StandardCharsets.ISO_8859_1);
response.setHeader("Content-disposition","attachment;filename=\\"+fullFileName+".pdf\\");
documentConverter
.convert(inputStream)
.as(DefaultDocumentFormatRegistry.DOCX)
.to(response.getOutputStream())
.as(DefaultDocumentFormatRegistry.PDF)
.execute();
} catch (OfficeException |IOException e) {
log.error("word转pdf失败:{}",e.getMessage());
}
}
public void exportByLocalPath(HttpServletResponse response, String fileName, String path, Object params) throws Exception {
BufferedOutputStream outputStream = null;
BufferedInputStream wordInputStream = null;
try (InputStream in = PdfService.class.getClassLoader().getResourceAsStream(path)) {
// 生成临时文件
String outPutWordPath = System.getProperty("java.io.tmpdir").replaceAll(File.separator + "$", "") + fileName+".docx";
File tempFile = FileUtil.touch(outPutWordPath);
outputStream = FileUtil.getOutputStream(tempFile);
// word模板合成写到临时文件
WordUtil.replaceWord(outputStream, in, params);
// word 转pdf
wordInputStream = FileUtil.getInputStream(tempFile);
docxToPDF(wordInputStream, response,fileName);
// 移除临时文件
FileUtil.del(tempFile);
} catch (Exception e) {
log.error("docx文档转换为PDF失败", e.getMessage());
} finally {
IoUtil.close(outputStream);
IoUtil.close(wordInputStream);
}
}