此项目根据企业真实需求制作而成,希望能帮助大家解决在线预览的问题!
此项目已开源,欢迎大家来STAR
文章目录
一、配置管理
① pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.gblfy</groupId>
<artifactId>business-online-preview</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>business-online-preview</name>
<url>https://gblfy.com</url>
<description>在线预览</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
② yml
空
③ controller
package com.gblfy.onlinepreview.controller;
import com.gblfy.onlinepreview.utils.FileFormatConverToPDF;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
/**
* @author gblfy
* @ClassNme FileController
* @Description 文件在在线预览
* @Date 2020/01/08 8:09
* @version1.0
*/
@RestController
public class FileOnlinePreviewController {
/**
* 在线预览测试方法
* 企业真实需求:
* 文件的路径 文件名 都需要动态获取
*
* @param response http响应网页来实现在线预览
* @throws Exception
*/
@RequestMapping("/viewPDF")
public void reviewWord(HttpServletResponse response) throws Exception {
FileFormatConverToPDF linuxPageDIsplsyFileUtil = new FileFormatConverToPDF();
//文件存储路径
String fileStoragePath = "/app/ftpFileDir/testFileDir/businessLearning/";
//转换前的文件名
String beforeConversion = "知识库建设方案2019-11-11.docx";
/**
* 文件格式转换+在线预览
*/
linuxPageDIsplsyFileUtil.conversionFile(response, fileStoragePath, beforeConversion);
}
}
④ 文件格式转换工具类FileFormatConverToPDF
package com.gblfy.onlinepreview.utils;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.util.IOUtils;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
/**
* @Author:
* @Date: 2019/1/15 0015 15:04
* @describe 文档在线预览 (服务器环境为Linux环境) 目前文档类型 仅开放 Excel 03/07 word 03/07 ppt 03/07
*/
@Slf4j
public class FileFormatConverToPDF {
//libreoffice 文件格式转换shell命令
public static final String LIBREOFFICE_SHELLCMD = "/usr/bin/soffice --headless --invisible --convert-to pdf ";
//unoconv 文件格式转换shell命令
public static final String UNOCONV_SHELLCMD = "/usr/bin/unoconv -f pdf ";
//previewfile_dir 需要预览的pdf目录
public static final String PREVIEWFILE_DIR = "/root/";
private static FileFormatConverToPDF linuxPageDIsplsyFileUtil;
public static synchronized FileFormatConverToPDF getSwitchUtil() {
if (linuxPageDIsplsyFileUtil == null) {
linuxPageDIsplsyFileUtil = new FileFormatConverToPDF();
}
return linuxPageDIsplsyFileUtil;
}
/**
* 文档在线预览
*
* @param response
* @param fileStoragePath 文件存储路径 (前段获取文件存储路径返给后台)
* @param beforeConversion 文件名(必须带文件后缀名,这里指的就是文件全名称)
* @throws Exception
*/
public void conversionFile(HttpServletResponse response, String fileStoragePath, String beforeConversion) throws Exception {
String fileNamePath = fileStoragePath + beforeConversion;
log.info("文件路径====" + fileNamePath);
File file = new File(fileNamePath);
if (!file.exists()) {
log.info("库存中没有指定文件。。。。");
return;
}
//获取到文件名
String interceptFileName = beforeConversion.substring(0, beforeConversion.lastIndexOf("."));
//截取文件后缀名
String fileNameSuffix = beforeConversion.substring(beforeConversion.lastIndexOf(".") + 1);
String command = null;
System.out.println("获取到文件名====" + interceptFileName);
System.out.println("截取文件后缀名====" + fileNameSuffix);
if ("doc".equals(fileNameSuffix)
|| "docx".equals(fileNameSuffix)
|| "xls".equals(fileNameSuffix)
|| "xlsx".equals(fileNameSuffix)
|| "ppt".equals(fileNameSuffix)
|| "pptx".equals(fileNameSuffix)) {
System.out.println("此文件属于" + fileNameSuffix + "开始进行转换");
command = LIBREOFFICE_SHELLCMD + fileNamePath;
executeLinuxCmd(command);
} else {
command = UNOCONV_SHELLCMD + fileNamePath;
executeCommand(command);
}
System.out.println("openPDF的参数====" + fileStoragePath + interceptFileName);
previewPDFUtils.openPdf(response, PREVIEWFILE_DIR + interceptFileName + ".pdf");
}
/**
* 使用LibreOffice进行格式转换 to pdf
*
* @param cmd
* @return
* @throws IOException
*/
public static List<String> executeLinuxCmd(String cmd) throws IOException {
log.info("执行文件转换的命令:" + cmd);
Runtime run = Runtime.getRuntime();
Process process = run.exec(new String[]{"/bin/sh", "-c", cmd});
InputStream in = process.getInputStream();
BufferedReader bs = new BufferedReader(new InputStreamReader(in));
List<String> list = new ArrayList<String>();
String result = null;
while ((result = bs.readLine()) != null) {
log.info("job result [" + result + "]");
list.add(result);
}
in.close();
process.destroy();
return list;
}
/**
* 使用Unoconv进行格式转换 to pdf
*
* @param command
* @throws Exception
*/
private static void executeCommand(String command) throws Exception {
log.info("执行文件转换的命令:" + command);
StringBuffer output = new StringBuffer();
Process process;
InputStreamReader inputStreamReader = null;
BufferedReader reader = null;
try {
process = Runtime.getRuntime().exec(command);
process.waitFor();
inputStreamReader = new InputStreamReader(process.getInputStream(), "UTF-8");
reader = new BufferedReader(inputStreamReader);
String line = "";
while ((line = reader.readLine()) != null) {
output.append(line + "\n");
}
//p.destroy();//这个一般不需要
} catch (Exception e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(reader);
IOUtils.closeQuietly(inputStreamReader);
}
}
}
⑤ 在线预览previewPDFUtils
package com.gblfy.onlinepreview.utils;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
/**
* @author gblfy
* @ClassNme previewPDF
* @Description TODO
* @Date 2020/1/8 12:47
* @version1.0
*/
public class previewPDFUtils {
/**
* 在线预览pdf文件
*
* @param response
* @param previewFile 预览pdf文件的绝对路径
* @throws Exception
*/
public static void openPdf(HttpServletResponse response, String previewFile) throws Exception {
InputStream inputStream = null;
OutputStream outputStream = null;
System.out.println("进入openPDF=====" + previewFile);
//String path ="/home/tubiao/桌面/优化数据库.pdf";
inputStream = new FileInputStream(previewFile);
response.setContentType("application/pdf");
outputStream = response.getOutputStream();
int a = 0;
byte[] b = new byte[1024];
while ((a = inputStream.read(b)) != -1) {
outputStream.write(b, 0, a);
}
if (outputStream != null) {
outputStream.close();
}
if (inputStream != null) {
inputStream.close();
}
}
}
⑥ 启动类
package com.gblfy.onlinepreview;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 在线预览统一入口
*/
@SpringBootApplication
public class OnlinePreviewApplication {
public static void main(String[] args) {
SpringApplication.run(OnlinePreviewApplication.class, args);
System.out.println("启动成功!!!");
}
}
二、测试验证
①测试链接
浏览器测试链接:http://localhost:8888/viewPDF
②测试效果
三、安装Unoconv
①yum安装Unoconv
unoconv 在线预览 doc,doxc,xls,xlsx,ppt,pptx 文件功能环境搭建
https://gblfy.blog.csdn.net/article/details/102847276
②源码安装Unoconv
(企业内部)Linux环境_源码安装Unoconv实现文件在线预览doc,doxc,xls,xlsx,ppt,pptx 文件
https://gblfy.blog.csdn.net/article/details/103540694
四、安装LibreOffice
(企业内部)Linux环境_源码安装LibreOffice实现文件在线预览doc,doxc,xls,xlsx,ppt,pptx 文件
https://gblfy.blog.csdn.net/article/details/103861905
友情链接:
(企业内部)SpringBoot 使用LibreOffice 在线预览 doc,doxc,xls,xlsx,ppt,pptx 文件
https://gblfy.blog.csdn.net/article/details/103861607
来源:CSDN
作者:gblfy
链接:https://blog.csdn.net/weixin_40816738/article/details/103890765