【SpringBoot集成】SpringBoot下集成Libreoffice实现在线预览功能
linux-dash
A beautiful web dashboard for Linux
项目地址:https://gitcode.com/gh_mirrors/li/linux-dash
免费下载资源
·
SpringBoot下集成Libreoffice实现在线预览功能
一、准备
首先,需要在服务器或者本机安装Libreoffice。下面是Linux下的Libreoffice安装笔记。【Linux学习笔记】Linux下安装Libreoffice
二、相关jar包
在pom中添加相关的jar包
<dependency>
<groupId>org.jodconverter</groupId>
<artifactId>jodconverter-spring-boot-starter</artifactId>
<version>4.2.2</version>
</dependency>
<dependency>
<groupId>org.jodconverter</groupId>
<artifactId>jodconverter-local</artifactId>
<version>4.2.2</version>
</dependency>
<dependency>
<groupId>org.jodconverter</groupId>
<artifactId>jodconverter-core</artifactId>
<version>4.2.2</version>
</dependency>
<dependency>
<groupId>org.libreoffice</groupId>
<artifactId>ridl</artifactId>
<version>6.4.0</version>
</dependency>
三、核心代码
3.1、转换pdf代码
@Override
public void onlinePreview(Long fileId) throws Exception {
FileInfo fileInfo = fileMapper.selectById(fileId);
// InputStream inputStream = mossFtpService.downLoadFileToStream(fileInfo.getPath(), fileInfo.getName());
File outputFile = null;
// 如果当前预览的文件的格式在可预览的范围内,并且预览的文件并非pdf格式则转换
if (fileSuffixes.contains(fileInfo.getType().toLowerCase()) && !"pdf".equals(fileInfo.getType().toLowerCase())) {
String pathName = fileInfo.getObjectName().substring(0, 8);
String fileName = fileInfo.getObjectName().substring(9, 27);
String pdfFileName = fileName + ".pdf";
String[] fileArray = Objects.requireNonNull(fileInfo.getName()).split("\\.");
//获取去掉文件名后缀的文件名
String name = fileArray[0];
String pdfFileShowName = name + ".pdf";
// 1.将源文件转换成pdf文件。
String output = checkSystem() + File.separator + pdfFileShowName;
outputFile = new File(output);
File fileParent = outputFile.getParentFile();
if (!fileParent.exists()) {
outputFile.mkdirs();
}
if (!outputFile.exists()) {
outputFile.createNewFile();
}
try (InputStream inputStream = mossFtpService.downLoadFileToStream(fileInfo.getPath(), fileInfo.getName())) {
documentConverter.convert(inputStream).as(Objects.requireNonNull(documentConverter.getFormatRegistry().getFormatByExtension(fileInfo.getType())))
.to(outputFile).as(documentConverter.getFormatRegistry().getFormatByExtension("pdf"))
.execute();
// 2.将转换后的文件给前台展示
InputStream pdfInputStream = new FileInputStream(outputFile);
previewToResponse(pdfInputStream, pdfFileName);
// 3.将转换后的pdf上传到ftp文件服务器
// boolean flag = mossFtpService.uploadFile(pathName, pdfFileName, inputStream);
// if (!flag) {
// log.error("PDF预览附件上传失败!原文件路径为:[" + fileInfo.getPath() + "]");
// throw new BusinessException("PDF预览附件上传失败!");
// }
} catch (IOException e) {
log.error(e.getMessage());
e.printStackTrace();
} finally {
outputFile.delete();
}
} else {
try (InputStream inputStream = mossFtpService.downLoadFileToStream(fileInfo.getPath(), fileInfo.getName())) {
previewToResponse(inputStream, fileInfo.getName());
}
}
}
3.2、将文件以特定格式返回给response
/**
* @param inputStream pdf文件流
* @param fileName pdf文件名
*/
private void previewToResponse(InputStream inputStream, String fileName) {
try (BufferedInputStream bis = new BufferedInputStream(inputStream, 512); OutputStream toClient = new BufferedOutputStream(response.getOutputStream());) {
response.reset();
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
//获取oss端文件的文件名,用作于下载文件的名称
response.setContentType("application/octet-stream");
//处理文件名为中文的情况
response.setHeader("Content-Disposition", "attach;filename=" + new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
//*处理oss文件流传输*
int number;
byte[] buffer = new byte[ZE_4M];
while ((number = bis.read(buffer)) != -1) {
toClient.write(buffer, 0, number);
}
toClient.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
四、前端部分实现代码
PDF.js下载传送门
将下载好的插件放到如下目录中,各项目可能不同。
GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e
added ecosystem file for PM2 4 年前
5def40a3
Add host customization support for the NodeJS version 4 年前
更多推荐
已为社区贡献2条内容
所有评论(0)