前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >springboot实战之office文档在线预览

springboot实战之office文档在线预览

作者头像
lyb-geek
发布于 2019-11-27 06:26:33
发布于 2019-11-27 06:26:33
7.8K00
代码可运行
举报
文章被收录于专栏:Linyb极客之路Linyb极客之路
运行总次数:0
代码可运行
前言

文档在线预览在企业级应用开发也算是比较常遇见的需求了,通常处理这方面的需求大致有如下的方案,

1、购买成熟的第三方产品

比如永中DCS,其产品介绍可以查看如下链接

http://dcs.yozosoft.com/help.html

在比如idocv,其产品介绍可以查看如下链接

https://www.idocv.com/docs.html

2、自研实现文档预览服务器

标题取得高大上,常用的方法基本上也是基于第三方类库进行实现

  • 比如flash的flexpaper将文档转换为swf格式,然后使用flash在网页中浏览
  • 在比如java可以使用jodConverter+openoffice/libreoffice

3、文档预览是选择成熟第三产品还是自研?

如果公司成本预算充足,建议使用第三方成熟的产品,俗话说术业有专攻,正常专门做这方面的产品,不管是在技术上还是运维上都会比较成熟可靠,如果成本有限,还是自研吧,实现一个简单版本的文档预览服务器还是比较容易,但就是可能会采坑比较多。这边的选择只是针对文档预览,而非所有技术、产品选择都按这样选择,毕竟很多时候的自研的成本远远大于购买第三方服务,要具体情况具体分析

下边以jodconverter+LibreOffice为例,来实现一个简单的文档预览。这边为啥选LibreOffice而不选OpenOffice,其原因可以参考如下如下文章

OpenOffice与LibreOffice,哪个更适合你 https://www.linuxdashen.com/openoffice%E4%B8%8Elibreoffice%EF%BC%8C%E5%93%AA%E4%B8%AA%E6%9B%B4%E9%80%82%E5%90%88%E4%BD%A0 Apache OpenOffice 与 LibreOffice 之间的抉择 https://yq.aliyun.com/articles/81336

技术产品选型,可以从产品官方文档入手,产品的更新迭代活跃度、社区活跃度、是否易用等维度来进行考量,总归一句话不管黑猫白猫,能抓住老鼠的猫就是好猫,能够满足需求就行

正文

实现流程

安装LibreOffice

1、window环境

可以通过下方链接下载,并按提示一步一步安装

https://zh-cn.libreoffice.org/download/download/

2、centos环境

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#安装文件

    yum -y install libreoffice

    #安装中文包

    yum -y install libreoffice-langpack-zh-Han*

    #安装的目录在/usr/lib64/libreoffice

通过命令行测试LibreOffice

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#centos
  /usr/bin/libreoffice  --invisible --convert-to pdf  <待转换的word路径> --outdir <生成的pdf路径>

  比如:/usr/bin/libreoffice  --invisible --convert-to pdf  test.txt --outdir abc


  # windows
  soffice.exe --headless --invisible --convert-to pdf test.txt --outdir d:\abc

代码实现

1、pom.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- office预览相关-->
    <dependency>
      <groupId>org.jodconverter</groupId>
      <artifactId>jodconverter-core</artifactId>
    </dependency>
    <dependency>
      <groupId>org.jodconverter</groupId>
      <artifactId>jodconverter-local</artifactId>
    </dependency>
    <dependency>
      <groupId>org.jodconverter</groupId>
      <artifactId>jodconverter-spring-boot-starter</artifactId>
    </dependency>
    <dependency>
      <groupId>org.jodconverter</groupId>
      <artifactId>jodconverter-online</artifactId>
    </dependency>
    <dependency>
      <groupId>org.libreoffice</groupId>
      <artifactId>ridl</artifactId>
    </dependency>

2、application.yml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
jodconverter:
  local:
    enabled: true
    office-home: ${office.home}
    port-numbers: 8100,8101,8102
    max-tasks-per-process: 100
  store:
    path: ${store.path}

其中office.home和store.path,这两个属性一个是LibreOffice的安装路径,一个是LibreOffice转换后存放文档的路径,其中这两个属性的具体内容配置在pom.xml,内容如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<profiles>
    <profile>
      <id>win</id>
      <properties>
        <office.home>D:/Program Files/LibreOffice</office.home>
        <store.path>D:/data/preview</store.path>
      </properties>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
    </profile>
    <profile>
      <id>linux</id>
      <properties>
        <office.home>/usr/lib64/libreoffice</office.home>
        <store.path>/data/preview</store.path>
      </properties>
      <activation>
        <activeByDefault>false</activeByDefault>
      </activation>
    </profile>
  </profiles>

通过maven的profile来指定环境,默认是window环境,如果要切换到linux环境,则打包是执行

mvn clean package -P linux

或者打包时,改下pom.xml,把默认环境切换为linux

3、转换文档的核心代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Service
@Slf4j
public class PreviewServiceImpl implements PreviewService {

  @Value("${jodconverter.store.path}")
  private String storePath;

  @Autowired
  private DocumentConverter documentConverter;

  @Override
  public FileConvertResultDTO convertFile2pdf(File sourceFile,String fileExt) {
    FileConvertResultDTO fileConvertResultDTO = new FileConvertResultDTO();
    try {
      fileExt = fileExt.toLowerCase();
      String fileName = FileUtil.getWithoutExtension(sourceFile.getName());
      String targetFileExt = getTargetFileExt(fileExt);
      File targetFile = new File(storePath+ FileUtil.SLASH_ONE + fileName + FileUtil.DOT + targetFileExt);
      documentConverter.convert(sourceFile).as(DefaultDocumentFormatRegistry.getFormatByExtension(fileExt))
          .to(targetFile).as(DefaultDocumentFormatRegistry.getFormatByExtension(targetFileExt)).execute();
      fileConvertResultDTO.setStatus("success");
      fileConvertResultDTO.setTargetFileName(targetFile.getName());
    } catch (OfficeException e) {
      log.error("convertFile2pdf error : " + e.getMessage(),e);
      fileConvertResultDTO.setStatus("fail");
    }
    return fileConvertResultDTO;

  }

  @Override
  public FileConvertResultDTO convertInputStream2pdf(InputStream in, String fileName, String fileExt) {
    FileConvertResultDTO fileConvertResultDTO = new FileConvertResultDTO();
    try {
      fileExt = fileExt.toLowerCase();
      fileName = FileUtil.getWithoutExtension(fileName);
      String targetFileExt = getTargetFileExt(fileExt);
      File targetFile = new File(storePath+ FileUtil.SLASH_ONE + fileName + FileUtil.DOT + targetFileExt);
      documentConverter.convert(in).as(DefaultDocumentFormatRegistry.getFormatByExtension(fileExt))
          .to(targetFile).as(DefaultDocumentFormatRegistry.getFormatByExtension(targetFileExt)).execute();
      fileConvertResultDTO.setStatus("success");
      fileConvertResultDTO.setTargetFileName(targetFile.getName());
    } catch (OfficeException e) {
      log.error("convertInputStream2pdf error : " + e.getMessage(),e);
      fileConvertResultDTO.setStatus("fail");
    }
    return fileConvertResultDTO;
  }

  /**
   * 获取想要转换的格式类型
   * @return
   */
  private String getTargetFileExt(String originFileExt){
     if(Constants.fileType2Htmls.contains(originFileExt)){
       return FileUtil.HTML;
     }
     return FileUtil.PDF;
  }

  @PostConstruct
  private void init(){
    File targetDir = new File(storePath);
    if(!targetDir.exists()){
      targetDir.mkdirs();
    }
  }
}

4、拉取office服务器文档代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@GetMapping(value="/readFile")
  public ResponseEntity<byte[]> readFile(String fileName){
    if(StringUtils.isBlank(fileName)){
      log.warn("fileName is blank");
      return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
    }

    String fileExt = FileUtil.getExtension(fileName);
    if(StringUtils.isBlank(fileExt)){
      fileName = fileName + FileUtil.PDF;
    }
    String filePath = storePath + FileUtil.SLASH_ONE + fileName;
    File file = new File(filePath);


    if(!file.exists()){
        log.warn("fileName:{} is not found",fileName);
        return new ResponseEntity<>(HttpStatus.NOT_FOUND);
    }

    try {
      //判断文件类型
      String mimeType = URLConnection.guessContentTypeFromName(file.getName());
      if(mimeType == null) {
        mimeType = "application/octet-stream";
      }
      response.setContentType(mimeType);

      //设置文件响应大小
      response.setContentLengthLong(file.length());

      byte[] bytes = FileUtil.readFileToByteArray(file);
      response.getOutputStream().write(bytes);
      return new ResponseEntity<>(bytes,HttpStatus.OK);
    } catch (IOException e) {
      log.error("readFile error:"+e.getMessage(),e);
    }
    return new ResponseEntity<>(HttpStatus.EXPECTATION_FAILED);

  }

5、测试验证

测试步骤按上方的流程图来测试 a、上传文档

b、点击确定按钮,进行跳转预览

参考文档

https://www.libreofficechina.org/

文档在线预览方案

https://blog.csdn.net/xiaqingxue930914/article/details/81121581

SpringBoot使用LibreOffice转换PDF

https://segmentfault.com/a/1190000015129654

总结

java版的office文档预览,本质上就利用jodconverter去连接openoffice或libreoffice服务,相当于我们自己实现的office服务器本质上算是一个openoffice或libreoffice代理服务器。在实现过程中,当excel转换pdf时,会存在一些坑点,比如excel的列的宽度大的时候生成的pdf会自动换行,有多个sheet页的时候默认也只能生成出来一个。解决的方案是,当遇到文档类型为excel时,就不要转换为pdf格式,而是转换为html格式

demo链接

https://github.com/lyb-geek/springboot-learning/tree/master/springboot-office-preview

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Linyb极客之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring Boot整合OpenOffice实现Word、Excel、PPT在线预览
Apache OpenOffice是一款先进的开源 办公软件套件,它包含文本文档、电子表格、演示文稿、绘图、数据库等。它能够支持许多语言并且在所有普通计算机上工作。它将你所有的数据以国际开放标准格式存储下来,并能够读写从其它常用办公软件包来的文件。它可以被完全免费下载并使用于任何用途。
闫同学
2022/10/31
4.1K0
Spring Boot整合OpenOffice实现Word、Excel、PPT在线预览
Ubuntu上部署JobConverter + Ibreoffice环境
本文内容主要目的在于测试Ibreoffice转换docx文档失败的原因是否和系统有关,之前我在CentOS上和MacOS上均转换不成功,但是使用一个开源的项目却可以,而他用的就是Ubuntu和Ibreoffice,抱着找到原因的心态在Ubuntu上进行测试。
码客说
2020/06/22
1.6K0
Java实现word、excel、ppt、txt等办公文件在线预览功能
Java实现办公文件在线预览功能是一个大家在工作中也许会遇到的需求,网上些公司专门提供这样的服务,不过需要收费。
Java旅途
2021/11/26
3K0
分享一个超牛逼的 Java 文件在线预览项目
基于 OpenOffice 服务将文件 (.doc、.docx、.xls、.ppt) 转化为pdf、html格式,然后直接在浏览器渲染输出。
全栈程序员站长
2022/07/25
6700
分享一个超牛逼的 Java 文件在线预览项目
Java实现word文档在线预览,读取office(word,excel,ppt)文件
想要实现word或者其他office文件的在线预览,大部分都是用的两种方式,一种是使用openoffice转换之后再通过其他插件预览,还有一种方式就是通过POI读取内容然后预览。 一、使用openoffice方式实现word预览 主要思路是: 1.通过第三方工具openoffice,将word、excel、ppt、txt等文件转换为pdf文件 2.通过swfTools将pdf文件转换成swf格式的文件 3.通过FlexPaper文档组件在页面上进行展示 我使用的工具版本: openof:3.4.1 swfT
二十三年蝉
2018/05/09
38.3K4
Java实现在线预览–openOffice实现[通俗易懂]
#Java实现在线预览–openOffice实现 ##简介 之前有写了poi实现在线预览的文章,里面也说到了使用openOffice也可以做到,这里就详细介绍一下。 我的实现逻辑有两种: 一、利用jodconverter(基于OpenOffice服务)将文件(.doc、.docx、.xls、.ppt)转化为html格式。 二、利用jodconverter(基于OpenOffice服务)将文件(.doc、.docx、.xls、.ppt)转化为pdf格式。 转换成html格式大家都能理解,这样就可以直接在浏览器上查看了,也就实现了在线预览的功能;转换成pdf格式这点,需要用户安装了Adobe Reader XI,这样你会发现把pdf直接拖到浏览器页面可以直接打开预览,这样也就实现了在线预览的功能。 ##将文件转化为html格式或者pdf格式 话不多说,直接上代码。
全栈程序员站长
2022/06/27
2.8K1
jodconverter4.1.0版本改进解析
jodconverter 4.1.0版本的话,改进了api的结构,同时新增了local以及online的模块,本文就来分析一下。
code4it
2018/09/17
3.6K0
分享一个超牛逼的 Java 文件在线预览项目
基于 OpenOffice 服务将文件 (.doc、.docx、.xls、.ppt) 转化为pdf、html格式,然后直接在浏览器渲染输出。
Leetcode名企之路
2021/03/25
9130
Java 渲染 docx 文件,并生成 pdf 加水印
一顿google以后发现了 StackOverflow 上的这个回答:Converting docx into pdf in java 使用如下的 jar 包:
用户2060079
2018/10/11
3.2K0
Java实现OpenOffice将word转换为pdf
1、因项目需求,使用openoffice+jodconverter,在服务器端将word转换为pdf。本案例是一种解决方法,但不是最好的解决方法,因为服务端需要安装openoffice软件,依赖的jodconverter jar版本2.2.1比较老,不支持office07以后的版本,而2.2.2版本在中央仓库没有。所以,后续可采用其他解决方法。
leehao
2025/02/11
3680
Spring Boot搭建的一个在线文件预览系统!支持ppt、doc等多种类型文件预览
总的来说我觉得 kkFileView 是一个非常棒的开源项目,在线文件预览这个需求非常常见。感谢开源!
Guide哥
2020/10/30
7.1K0
Spring Boot搭建的一个在线文件预览系统!支持ppt、doc等多种类型文件预览
SpringBoot实现万能文件在线预览,已开源,真香!!!
kkFileView,一款成熟且开源的文件文档在线预览项目解决方案,对标业内付费产品有【永中office】【office365】【idocv】等,免费!
程序员小猿
2021/12/15
1.3K0
SpringBoot实现万能文件在线预览,已开源,真香!!!
OFFICE 文档转换为html在线预览
网上一般介绍的都是使用JODConverter ,通过java来调用转换服务,其实还有一种替代方案,就是使用pyodconverter,python版本的转换脚本https://github.com/mirkonasato/pyodconverter/
JadePeng
2022/03/24
5.2K0
OFFICE 文档转换为html在线预览
java实现word转pdf
目前发现可用的实现方式有两种,一种是使用e-iceblue的免费版api,此方法最为简单但存在限制,导出页数不能超过三页。 另一种是使用openoffice,但较上一种方法麻烦一些,需要安装openoffice的软件,但没有导出限制,请根据自身需求自行选用。
华创信息技术
2022/05/28
3.1K0
office系列文档的在线预览解决方案 - 在linux平台下转为pdf
office系列文档包括:.ppt .pptx .doc .docx .xls .xlsx 等常用格式。
王亚昌
2018/08/03
1.9K0
SpringBoot实现文件在线预览
最近公司内部oa系统升级,需要增加文件在线预览服务,最常见的文件就是office文档,一开始构思几个方案,比如office软件自带的文件转换,openoffice转换,offce365服务,aspose组件转换,最终采用了aspose转换,原因是组件功能完善,不依赖其它软件安装环境
code2roc
2023/07/19
7340
SpringBoot实现文件在线预览
OpenSource - 文件在线预览模块(多格式转 PDF 文件)
本地启动后访问页面地址为:http://localhost:8301/index
小小工匠
2024/05/25
4490
OpenSource - 文件在线预览模块(多格式转 PDF 文件)
对于FastDFS你必须知道的事(最全,精美版)
客户端上传文件后存储服务器将文件 ID 返回给客户端,此文件 ID 用于以后访问该文件的索引信息。文件索引信息
编程张无忌
2021/01/26
7760
对于FastDFS你必须知道的事(最全,精美版)
文件预览——一路躺过来的那些坑
因为最近项目比较紧,所以dubbo源码系列是顾不上了。 恰巧这周花了几天在做文件预览这块,两三天的时间下来,有过一些走弯路的经验教训(准确说,全都是弯路),在这里给大家分享下~ 背景 基于产品需求,需要支持文件预览的功能。顾名思义,要支持类似word、excel、TXT、PDF等格式文件的在线预览。 业界对于文件预览功能的实现也是各显神通。大体主要分为两种,一种是自主研发,另外就是购买成熟预览服务提供商的服务。 既然说到躺坑,那自然是属于第一种自主研发的情况。 自主研发主要还是借用现有的软件和类库组合,加上
JackieZheng
2018/04/16
4K3
文件预览——一路躺过来的那些坑
万能在线预览 kkFileView v4.2.0 正式发布
kkFileView 自 2017 年开源至今,已经支持 23 种文件类型,上百种文件后缀的文件在线预览。已在 Gitee 收获 17.2K 、Github 收获 8.2K star, 我们一直在精心打磨 kkFileView ,旨在打造开源里最好用最强大的文件在线预览项目。
kl博主
2023/04/13
4.4K0
推荐阅读
相关推荐
Spring Boot整合OpenOffice实现Word、Excel、PPT在线预览
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验