0
点赞
收藏
分享

微信扫一扫

使用Unoconv和LibreOffice进行格式转换实现在线预览 doc,doxc,xls,xlsx,ppt,pptx 文件


此项目根据企业真实需求制作而成,希望能帮助大家解决在线预览的问题!
此项目已开源,欢迎大家来STAR

使用Unoconv和LibreOffice进行格式转换实现在线预览 doc,doxc,xls,xlsx,ppt,pptx 文件_在线预览封装


使用Unoconv和LibreOffice进行格式转换实现在线预览 doc,doxc,xls,xlsx,ppt,pptx 文件_在线预览_02

软件

版本

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和LibreOffice进行格式转换实现在线预览 doc,doxc,xls,xlsx,ppt,pptx 文件_在线预览封装


使用Unoconv和LibreOffice进行格式转换实现在线预览 doc,doxc,xls,xlsx,ppt,pptx 文件_在线预览_02

三、安装Unoconv

①yum安装Unoconv

unoconv 在线预览 doc,doxc,xls,xlsx,ppt,pptx 文件功能环境搭建​

②源码安装Unoconv

(企业内部)Linux环境_源码安装Unoconv实现文件在线预览doc,doxc,xls,xlsx,ppt,pptx 文件​

四、安装LibreOffice

(企业内部)Linux环境_源码安装LibreOffice实现文件在线预览doc,doxc,xls,xlsx,ppt,pptx 文件​

友情链接:
(企业内部)SpringBoot 使用LibreOffice 在线预览 doc,doxc,xls,xlsx,ppt,pptx 文件​


举报

相关推荐

0 条评论