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

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

在这里插入图片描述
在这里插入图片描述

软件版本
SpringBoot2.2.2.RELEASE
LibreOffice6.3.2
unoconv0.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 文件功能环境搭建
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521774.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于CNN图像分类的一份综合设计指南

摘要&#xff1a; 本文是一篇关于使用CNN完成图像分类的综合设计指南&#xff0c;涵盖了一些模型设计、模型优化以及数据处理经验&#xff0c;是一份适合图像分类方向研究者参考的综合设计指南。对于计算机视觉任务而言&#xff0c;图像分类是其中的主要任务之一&#xff0c;比…

从GitHub中整理出来的15个最受欢迎的Python开源框架,你喜欢哪个

摘要&#xff1a; 从GitHub中整理出的15个最受欢迎的Python开源框架。这些框架包括事件I/O&#xff0c;OLAP&#xff0c;Web开发&#xff0c;高性能网络通信&#xff0c;测试&#xff0c;爬虫等。 Django: Python Web应用开发框架 Django 应该是最出名的Python框架&#xff0c;…

greenplum配置高可用_高可用hadoop集群配置就收藏这一篇,动手搭建Hadoop(5)

01 ssh免密安装02 jdk安装03 hadoop伪分布式安装04 hadoop全分布式完成了前面四步&#xff0c;现在做hadoop的高可用。其实和之前的lvs的高可用差不多的。如果我们有两个namenode节点&#xff0c;分别是node01和node02。假设node01是主节点&#xff0c;node02是从节点&#xff…

聊聊我是如何在面试别人Spring事务时“套路”对方的

戳蓝字“CSDN云计算”关注我们哦&#xff01;“中国最好面试官”我希望把面试当作是一次交流&#xff0c;像朋友那样&#xff0c;而不是像一场Q & A。但也有人觉得&#xff0c;我对应聘者“太好了”&#xff0c;这完全没必要&#xff0c;反正最后他也不会来。好吧&#xff…

JAVA 雪花算法 唯一ID生成工具类

package com.gblfy;/*** Author&#xff1a;JCccc* Description&#xff1a;* Date&#xff1a; created in 15:31 2019/6/12*/ public class SnowflakeIdUtils {// Fields/** 开始时间截 (2015-01-01) */private final long twepoch 1420041600000L;/** 机器id所占的位数 */p…

华为 | 泰山之巅 鲲鹏展翅 扶摇直上九万里

戳蓝字“CSDN云计算”关注我们哦&#xff01; 文 | 阿晶、王银发于上海华为HC大会现场出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;华为在计算产业究竟要怎样LU起袖子加油干&#xff1f;五岳之首、泰山之巅、初升之日、鲲鹏展翅、昇腾万里、华为计…

前端 Leader 如何做好团队规划?阿里内部培训总结公开

摘要&#xff1a; "行成于思&#xff0c;毁于随"——韩愈 在阿里从一线前端工程师到技术 TL&#xff08;Team Leader&#xff09; 也三年有余了&#xff0c;最重要最难的就是做规划&#xff0c;你可能会遇到如下几个问题&#xff1a; 业务压力巨大&#xff0c;前端是…

印象笔记编辑pdf_做笔记就用印象笔记,支持录音做笔记( 附插件下载)

印象笔记是全球闻名的效率软件和知识管理工具&#xff0c;印象笔记可以帮助我们简化工作、学习与生活。你可以在手机、电脑、平板、网页等多种设备和平台间&#xff0c;无缝同步每天的见闻、灵感与思考。一站式完成知识信息的收集备份、高效记录、分享、多端同步和永久保存。下…

(vue基础试炼_07)Vue实例生命周期函数

文章目录一、生命周期图示二、常见的生命周期函数三、生命周期函数执行场景四、测试代码五、项目开源地址一、生命周期图示 二、常见的生命周期函数 常见的生命周期函数执行的时间beforeCreateVue初始化createdVue初始化beforeMount模板未渲染到页面上mounted模板已经渲染到页…

独家专访阿里高级技术专家北纬:Dubbo开源重启半年来的快意江湖

摘要&#xff1a; 罗毅&#xff0c;花名北纬。这个名字&#xff0c;如果是混过天涯论坛的大龄网民应该都不陌生&#xff0c;北纬67度3分周公子&#xff08;简称北纬&#xff09;虐杀易烨卿MM的世纪大战至今还是天涯神贴 &#xff0c;当时更是有看客赋诗形容&#xff1a;“目睹此…

实践心得:从读论文到复现到为开源贡献代码

摘要&#xff1a; 本文讲述了从在fast.ai库中读论文&#xff0c;到根据论文复制实验并做出改进&#xff0c;并将改进后的开源代码放入fast.ai库中。介绍去年我发现MOOC网上有大量的Keras和TensorKow教学视频&#xff0c;之后我从零开始学习及参加一些Kaggle比赛&#xff0c;并在…

FPGA资源平民化的新晋- F3 技术解析

摘要&#xff1a; FPGA (现场可编程门阵列)由于其硬件并行加速能力和可编程特性&#xff0c;在传统通信领域和IC设计领域大放异彩。一路走来&#xff0c;FPGA并非一个新兴的硬件器件&#xff0c;由于其开发门槛过高&#xff0c;硬件加速算法的发布和部署保护要求非常高&#xf…

Vue计算属性、方法、侦听器

文章目录一、基础计算模板二、计算属性computed三、方法methods四、侦听器watch五、总结六、源码地址一、基础计算模板 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Vue计算属性、方法、侦听器<…

漫画:五分钟看懂车联网

戳蓝字“CSDN云计算”关注我们哦&#xff01;福利扫描添加小编微信&#xff0c;备注“姓名公司职位”&#xff0c;加入【云计算学习交流群】&#xff0c;和志同道合的朋友们共同打卡学习&#xff01;推荐阅读&#xff1a;华为 | 泰山之巅 鲲鹏展翅 扶摇直上九万里聊聊我是如何在…

对数据科学家来说最重要的算法和统计模型

摘要&#xff1a; 本文提供了工业中常用的关键算法和统计技术的概要&#xff0c;以及与这些技术相关的短缺资源。作为一个在这个行业已经好几年的数据科学家&#xff0c;在LinkedIn和QuoLa上&#xff0c;我经常接触一些学生或者想转行的人&#xff0c;帮助他们进行机器学习的职…

华为愿出售5G技术渴望对手;苹果将向印度投资10亿美元;华为全联接大会首发计算战略;腾讯自研轻量级物联网操作系统正式开源……...

戳蓝字“CSDN云计算”关注我们哦&#xff01;嗨&#xff0c;大家好&#xff0c;重磅君带来的【云重磅】特别栏目&#xff0c;如期而至&#xff0c;每周五第一时间为大家带来重磅新闻。把握技术风向标&#xff0c;了解行业应用与实践&#xff0c;就交给我重磅君吧&#xff01;重…

数组元素反序

和前面的字符串逆向输出有异曲同工之妙 第一位和最后一位交换位置&#xff0c;然后用比大小循环 那么接下来修改一下这个程序&#xff0c;我们接下来解释一下p的概念 画图解释&#xff1a; 在最前面的 定义的时候&#xff0c;我们将p&#xff08;0&#xff09;定义在了1上&…

如何计算Java对象所占内存的大小

摘要&#xff1a; 本文以如何计算Java对象占用内存大小为切入点&#xff0c;在讨论计算Java对象占用堆内存大小的方法的基础上&#xff0c;详细讨论了Java对象头格式并结合JDK源码对对象头中的协议字段做了介绍&#xff0c;涉及内存模型、锁原理、分代GC、OOP-Klass模型等内容。…

hilbert谱 matlab,怎么在matlab中做信号hilbert边际谱分析

摘要&#xff1a;传统的数字滤波器的设计过程复杂&#xff0c;计算工作量大&#xff0c;滤波特性调整困难&#xff0c;影响了它的应用。本文介绍了一种利用MATLAB信号处理工具箱(Signal Processing Toolbox)快速有效的设计由软件组成的常规数字滤波器的设计方法。给出了使用MAT…

时间序列数据的处理

摘要&#xff1a; 随着云计算和IoT的发展&#xff0c;时间序列数据的数据量急剧膨胀&#xff0c;高效的分析时间序列数据&#xff0c;使之产生业务价值成为一个热门话题。阿里巴巴数据库事业部的HiTSDB团队为您分享时间序列数据的计算分析的一般方法以及优化手段。演讲嘉宾简介…