此項目根據企業真實需求制作而成,希望能幫助大家解決線上預覽的問題!
此項目已開源,歡迎大家來STAR

軟體 | 版本 |
SpringBoot | 2.2.2.RELEASE |
LibreOffice | 6.3.2 |
unoconv | 0.6 |
文章目錄
- 一、配置管理
- ① pom
- ② yml
- ③ controller
- ④ 檔案格式轉換工具類FileFormatConverToPDF
- ⑤ 線上預覽previewPDFUtils
- ⑥ 啟動類
- 二、測試驗證
- ①測試連結
- ②測試效果
- 三、安裝Unoconv
- ①yum安裝Unoconv
- ②源碼安裝Unoconv
- 四、安裝LibreOffice
一、配置管理
① 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 檔案功能環境搭建
②源碼安裝Unoconv
(企業内部)Linux環境_源碼安裝Unoconv實作檔案線上預覽doc,doxc,xls,xlsx,ppt,pptx 檔案