Java中如何实现文件预览的功能

article/2025/9/6 1:14:08

文件预览方法总结

  • 前言
  • 一、kkfileview 文件在线预览
  • 二、officetohtml纯前端的方式
  • 三、JODConverter
  • 四、Aspose
  • 总结

前言

日常开发中常见的文件格式有pdf,word,Excel,PPT,Html,txt,图片等。pdf,Html,txt,图片这种实现在线预览非常简单,有一些前端的插件可以满足要求。word,Excel,PPT如果要实现在线预览,就非常的困难。word,Excel,PPT实现在线预览常用的方式就是先转换成pdf,然后在进行预览。下面我就介绍常用的几种方案

一、kkfileview 文件在线预览

此项目为文件文档在线预览项目解决方案,项目使用流行的 spring boot 搭建,易上手和部署,部署好后可以独立提供预览服务,使用 http 接口访问,不需要和应用集成,具有跨系统跨语言使用的特性。提供 zip/tar.gz 发行包、自定义配置文件、和启动 / 停止脚本等,极大方便部署使用,同时官方发布 Docker 镜像,方便容器环境中部署使用。基本支持主流办公文档的在线预览,如 doc,docx,dwg, ofd, xls,xlsx,ppt,pptx,pdf,txt,zip,rar,7z,mp3,mp4,flv 图片等等。
项目地址:https://gitee.com/kekingcn/file-online-preview
项目官网:https://kkfileview.keking.cn

二、officetohtml纯前端的方式

用纯 javascript 编写的 jQuery 插件,用于将现代 Microsoft Office 文件、pptx、docx、xlsx 和 pdf 转换为 html。
实际上它是一个应用程序,它集成了其他库,如PPTXjs, mammoth.js,SheetJs结合 handsontable 和PDF.js,旨在将 Office 文件和 pdf 文件转换为 HTML。
项目官网:https://officetohtml.js.org/index.html

三、JODConverter

JODConverter是一种Java OpenDocument转换器,能够转换不同格式的文档,它依赖于Apache OpenOffice或 LibreOffice ,它为OpenDocument和Microsoft Office提供了最好的免费导入/导出的过滤器。
JODConverter可以用在这几种地方:
作为一个Java类库,嵌入到你的Java应用程序中。
作为一个命令行工具,可以在你的脚本中调用。
作为一个简单的web应用,上传文档,选择转换的格式并下载转换后的版本。
可以用openoffice,实现原理就是:
通过第三方工具openoffice,将word、excel、ppt、txt等文件转换为pdf文件流;这样就可以在浏览器上实现预览了。
先去openoffice官网下载进行安装,官网地址:https://www.openoffice.org/download/ 安装完成后启动。
在这里插入图片描述

java中的代码如下:
Maven中添加如下依赖

    <dependency><groupId>com.artofsolving</groupId><artifactId>jodconverter</artifactId><version>2.2.1</version></dependency>

将word、excel、ppt转换为pdf流的工具类代码

  import com.artofsolving.jodconverter.DefaultDocumentFormatRegistry;
import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.DocumentFormat;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.StreamOpenOfficeDocumentConverter;import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;/*** 文件格式转换工具类** @version 1.0* @since JDK1.8*/
public class FileConvertUtil {/** 默认转换后文件后缀 */private static final String DEFAULT_SUFFIX = "pdf";/** openoffice_port */private static final Integer OPENOFFICE_PORT = 8100;/*** 方法描述 office文档转换为PDF(处理本地文件)** @param sourcePath 源文件路径* @param suffix     源文件后缀* @return InputStream 转换后文件输入流* @author tarzan*/public static InputStream convertLocaleFile(String sourcePath, String suffix) throws Exception {File inputFile = new File(sourcePath);InputStream inputStream = new FileInputStream(inputFile);return covertCommonByStream(inputStream, suffix);}/*** 方法描述  office文档转换为PDF(处理网络文件)** @param netFileUrl 网络文件路径* @param suffix     文件后缀* @return InputStream 转换后文件输入流* @author tarzan*/public static InputStream convertNetFile(String netFileUrl, String suffix) throws Exception {// 创建URLURL url = new URL(netFileUrl);// 试图连接并取得返回状态码URLConnection urlconn = url.openConnection();urlconn.connect();HttpURLConnection httpconn = (HttpURLConnection) urlconn;int httpResult = httpconn.getResponseCode();if (httpResult == HttpURLConnection.HTTP_OK) {InputStream inputStream = urlconn.getInputStream();return covertCommonByStream(inputStream, suffix);}return null;}/*** 方法描述  将文件以流的形式转换** @param inputStream 源文件输入流* @param suffix      源文件后缀* @return InputStream 转换后文件输入流* @author tarzan*/public static InputStream covertCommonByStream(InputStream inputStream, String suffix) throws Exception {ByteArrayOutputStream out = new ByteArrayOutputStream();OpenOfficeConnection connection = new SocketOpenOfficeConnection(OPENOFFICE_PORT);connection.connect();DocumentConverter converter = new StreamOpenOfficeDocumentConverter(connection);DefaultDocumentFormatRegistry formatReg = new DefaultDocumentFormatRegistry();DocumentFormat targetFormat = formatReg.getFormatByFileExtension(DEFAULT_SUFFIX);DocumentFormat sourceFormat = formatReg.getFormatByFileExtension(suffix);converter.convert(inputStream, sourceFormat, out, targetFormat);connection.disconnect();return outputStreamConvertInputStream(out);}/*** 方法描述 outputStream转inputStream** @author tarzan*/public static ByteArrayInputStream outputStreamConvertInputStream(final OutputStream out) throws Exception {ByteArrayOutputStream baos=(ByteArrayOutputStream) out;return new ByteArrayInputStream(baos.toByteArray());}public static void main(String[] args) throws IOException {//convertNetFile("http://172.16.10.21/files/home/upload/department/base/201912090541573c6abdf2394d4ae3b7049dcee456d4f7.doc", ".pdf");//convert("c:/Users/admin/Desktop/2.pdf", "c:/Users/admin/Desktop/3.pdf");}
}

serve层在线预览方法代码

 /*** @Description:系统文件在线预览接口*/public void onlinePreview(String url, HttpServletResponse response) throws Exception {//获取文件类型String[] str = SmartStringUtil.split(url,"\\.");if(str.length==0){throw new Exception("文件格式不正确");}String suffix = str[str.length-1];if(!suffix.equals("txt") && !suffix.equals("doc") && !suffix.equals("docx") && !suffix.equals("xls")&& !suffix.equals("xlsx") && !suffix.equals("ppt") && !suffix.equals("pptx")){throw new Exception("文件格式不支持预览");}InputStream in=FileConvertUtil.convertNetFile(url,suffix);OutputStream outputStream = response.getOutputStream();//创建存放文件内容的数组byte[] buff =new byte[1024];//所读取的内容使用n来接收int n;//当没有读取完时,继续读取,循环while((n=in.read(buff))!=-1){//将字节数组的数据全部写入到输出流中outputStream.write(buff,0,n);}//强制将缓存区的数据进行输出outputStream.flush();//关流outputStream.close();in.close();}

四、Aspose

Aspose.Words是一款先进的类库,通过它可以直接在各个应用程序中执行各种文档处理任务。Aspose.Words支持DOC,OOXML,RTF,HTML,OpenDocument, PDF, XPS, EPUB和其他格式。使用Aspose.Words,可以生成,更改,转换,渲染和打印文档而不使用Microsoft Word。
实现原理也是通过Aspose把文件转换成pdf然后在预览,实现步骤如下:
添加jar包,下载地址:https://download.csdn.net/download/xinghui_liu/85931977
配置License.xml,去掉水印

<?xml version="1.0" encoding="UTF-8" ?>
<License><Data><Products><Product>Aspose.Total for Java</Product><Product>Aspose.Words for Java</Product></Products><EditionType>Enterprise</EditionType><SubscriptionExpiry>20991231</SubscriptionExpiry><LicenseExpiry>20991231</LicenseExpiry><SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber></Data><Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>
</License>

添加如下工具类,程序中调用doc2pdf即可实现文件转pdf

package com.weemambo.util;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;import com.aspose.words.Document;
import com.aspose.words.License;
import com.aspose.words.SaveFormat;public class Word2PdfAsposeUtil {public static boolean getLicense() {boolean result = false;InputStream is = null;try {Resource resource = new ClassPathResource("license.xml");is = resource.getInputStream();//InputStream is = Word2PdfAsposeUtil.class.getClassLoader().getResourceAsStream("license.xml"); // license.xml应放在..\WebRoot\WEB-INF\classes路径下License aposeLic = new License();aposeLic.setLicense(is);result = true;} catch (Exception e) {e.printStackTrace();}finally {if (is != null) {try {is.close();} catch (IOException e) {e.printStackTrace();}}}return result;}public static boolean doc2pdf(String inPath, String outPath) {if (!getLicense()) { // 验证License 若不验证则转化出的pdf文档会有水印产生return false;}FileOutputStream os = null;try {long old = System.currentTimeMillis();File file = new File(outPath); // 新建一个空白pdf文档os = new FileOutputStream(file);Document doc = new Document(inPath); // Address是将要被转化的word文档doc.save(os, SaveFormat.PDF);// 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF,// EPUB, XPS, SWF 相互转换long now = System.currentTimeMillis();System.out.println("pdf转换成功,共耗时:" + ((now - old) / 1000.0) + "秒"); // 转化用时} catch (Exception e) {e.printStackTrace();return false;}finally {if (os != null) {try {os.flush();os.close();} catch (IOException e) {e.printStackTrace();}}}return true;}
}

如上代码在window下不会出现乱码,在Linux系统中会出现乱码,原因为Linux系统中缺少相应的字体。解决方案如下:
获取window字体C:\Windows\Fonts目录下字体复制到 Linux /usr/share/fonts/win,具体步骤如下:
1.把字体上传到ninux服务器。这里上传到 /home 目录。
2.把刚刚上传的字体解压:unzip Fonts.zip -d Fonts
3.创建字体目录:mkdir /usr/share/fonts/win
4.把解压后的字体复制到创建的字体目录中:cp /home/Fonts/Fonts/* /usr/share/fonts/win
5.安装字体:

cd /usr/share/fonts
sudo mkfontscale
sudo mkfontdir 
sudo fc-cache -fv

6.执行命令让字体生效

source /etc/profile

7.如果安装失败,可以考虑修改字体权限

chmod 755 *.ttf

8.重启服务器就可以正常转换了

总结

上面介绍了四种文件预览的方法,每种方法的优缺点如下:
方法一:kkfileview支持文件格式多,而且不用开发。不过需要单独部署一个文件预览的服务,而且服务器也需要安装openoffice。
方法二:officetohtml纯前端的方式可以不用安装任何插件及服务,但是目前只支持文件地址的方式预览,如果是文件流的话无法使用
方法三:JODConverter 依赖于openoffice,需要在服务器单独安装openoffice。
方法四:Aspose使用的是破解版的,如果商用使用需要考虑版权问题。

综上所述,如果不能在服务器安装相应的软件,而且程序中的附件是以地址的方式访问的话使用officetohtml。如果服务器可以安装插件,优先kkfileview,Aspose,JODConverter 。

三,四都是将文件转换成pdf,前端可以使用pdfjs,官网地址为:http://mozilla.github.io/pdf.js/getting_started/#download
下载完成后放入到项目中,如下:
在这里插入图片描述
在项目中新建一个viewPdf.jsp页面:

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>	
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!DOCTYPE html>
<html>
<title>文件预览</title>
<head>
<meta charset="UTF-8">
<meta name="renderer" content="webkit|ie-comp|ie-stand">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
<meta http-equiv="Cache-Control" content="no-siteapp" />
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/resources/layui/css/layui.css">
<script type="text/javascript" src="<%=request.getContextPath()%>/resources/layui/layui.js?v=1.1"></script>
<script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-1.8.3.js"></script><script type="text/javascript">$(function() {$("#pdf").attr("height", $(document).height());var fileId='${fileId}';var url = "${pageContext.request.contextPath}/pdfjs/web/viewer.html?file=${pageContext.request.contextPath}/xxxx.do?fileId="+fileId;$("#pdf").attr("src", url);})</script>
</head>
<body>
<div class="main"><iframe id="pdf" width="100%"></iframe>
</div>
</body>
</html>

file后面可以直接写一个文件地址,如果是文件流的方式写一个后端的请求并传递相应的参差。文件流要注意的地方是下面这个要设置为inline
response.setHeader(“Content-disposition”, “inline; filename=” + fileName);

参考:
https://blog.csdn.net/weixin_40986713/article/details/109527294

https://blog.csdn.net/qq_20143059/article/details/106427297

https://blog.csdn.net/wybaby168/article/details/122842866


http://chatgpt.dhexx.cn/article/8VEfORhB.shtml

相关文章

前端技术实现文件预览(word、excel、pdf、ppt、mp4、图片、文本)

前言 因为业务需要&#xff0c;很多文件需要在前端实现预览&#xff0c;今天就来了解一下吧。 Demo地址[1]&#xff1a;https://zhuye1993.github.io/file-view/dist/index.html 实现方案 找了网上的实现方案&#xff0c;效果看起来不错&#xff0c;放在下面的表格里&#xff0…

localStorage怎样存取数据 怎样清除localStorage存储的数据

localStorage很多时候用来存储数据非常好&#xff0c;方便在页面中使用某些数据的时候调用 首先&#xff0c;通过setItem(key,value)即可存储数据 然后用getItem(key)的方式即可取得数据 可以看到&#xff0c;设置之后在浏览器的localStorage中看到存储的数据 使用localStoage…

Android App清除数据的方案

前言 最近MIUI13上出了个未经应用商店安装&#xff0c;算是未知来源。AndroidID&#xff0c;通知&#xff0c;网络权限没授权则默认关闭。 安装app时允许虚拟身份ID&#xff1a; 允许允许虚拟身份ID前获取一次AndroidId&#xff1a; attachBaseContext获取AndroidId, 此时还没…

kafka清理数据

由于项目原因&#xff0c;最近经常碰到Kafka消息队列拥堵的情况。碰到这种情况为了不影响在线系统的正常使用&#xff0c;需要大家手动的清理Kafka Log。但是清理Kafka Log又不能单纯的去删除中间环节产生的日志&#xff0c;中间关联的很多东西需要手动同时去清理&#xff0c;否…

Kafka数据清理

目录 kafka数据清理日志删除&#xff08;Log Deletion&#xff09;1. 基于时间的保留策略2. 基于日志大小的保留策略3. 基于日志起始偏移量保留策略 日志压缩&#xff08;Log Compaction&#xff09; 原文地址&#xff1a;https://program-park.github.io/2021/09/18/kafka_11/…

mysql数据库要定期清除吗_数据库mysql定时清除数据

数据库mysql定时清除数据 数据库mysql定时清除数据 https://www.jiangweishan.com/article/2384238490809808.html 作者&#xff1a;andy0012019.11.22来源&#xff1a;Web前端之家浏览&#xff1a;2081评论:0 关键词&#xff1a;jsmysql 一个项目如果规划不合理&#xff0c;每…

SDN是什么,与传统分布式网络有什么区别

传统的的分布式网络 分布式网络也叫网状网络&#xff0c;它是由分布在不同地点的计算机系统互连而成&#xff0c;网中无中心节点。通信子网是封闭式结构&#xff0c;通信控制功能分布在各节点上。 分布式网络的特点是&#xff1a;可靠性高&#xff1b;网内节点共享资源容易&am…

软件定义网络(SDN)

SDN基本概述 参考文章&#xff1a;SDN基本概述、解读SDN的东西、南北向接口 传统网络数据控制与转发 传统网络是分布式控制的架构&#xff0c;每台设备都包含独立的控制平面&#xff0c;数据平面。 传统网络是分布式控制的架构&#xff1a; 这里的分布式控制指在传统IP网络…

sdn通俗介绍

拼客学院服务号 前言 SDN&#xff08;Software Defined Network&#xff09;即软件定义网络&#xff0c;是一种网络设计理念&#xff0c;或者一种推倒重来的设计思想。只要网络硬件可以集中式软件管理&#xff0c;可编程化&#xff0c;控制转发层面分开&#xff0c;则可以认为这…

SDN — Google B4 SDN WAN 网络架构

目录 文章目录 目录Google B4 SDN WAN 网络B4 网络架构物理设备层局部网络控制层全局控制层Google B4 SDN WAN 网络 Google 的 WAN 有 2 张网络(Two Backbones): B2(Internet-facing WAN,I-Scale Network):数据中心互联 Internet(POP)的网络,用于面向 Internet 用户…

SDN基础理解

1. 何为SDN 1) 为什么需要一个全新的网络架构&#xff0c;比如SDN&#xff1f; 在传统的架构中&#xff0c;交换机和路由器不得不在操作6000种分布式协议的控制下实施整个网络的智能。这就意味着&#xff0c;即使只有一个网元增加了一种新的协议&#xff0c;也需要所有其他网元…

SDN概述

SDN概述1 SDN是什么 ONRC是 SDN创始人斯坦福大学教授Nick McKeown和加州大学伯克利分校教授 Scott Shenker&#xff0c;以 Larry Peterson教授 共同创建的研究架构。ONRC对SDN的定义是&#xff1a;“SDN是一种逻辑集中控制的新网络架构&#xff0c;其关键属性包括&#xff1a…

SDN网络架构简述

SDN的特点之一就是控制平面与数据平面分离&#xff0c;其主张通过集中式的控制器平台实现网络的控制。在SDN架构中&#xff0c;控制平面是逻辑集中的&#xff0c;通过某种协议将控制信息下发至底层的数据平面去执行。所以&#xff0c;控制平面被称为SDN的大脑&#xff0c;指挥整…

什么是SDN

为什么要推出SDN&#xff1f; SDN的起源 • SDN ( Software Defined Networking &#xff09;即软件定义网络。是由斯坦福大学Clean Slate研究组提出的一种新型网络创新架构。 真核心理念通过将网络设备控制平面与数据平面分离&#xff0c;从而实现了网络控制平面的集中 控制&…

SDN概述,SDN是什么?

软件定义网络(Software Defined Network, SDN)在InfoWorld于2011年11月公布的将影响未来10年的十项新技术中排名第二。2012年7月&#xff0c;SDN代表厂商Nicira被 VMware以12.6亿美元收购&#xff0c;随后Google宣布成功在其全球10个IDC网络中部署SDN&#xff0c;这促使SDN引起…

SDN网络概述

SDN是一种存在逻辑上集中控制的新型网络结构&#xff0c;其主要特征是数据平面与控制平面分离。数据平面与控制平面之间通过标准的开放接口OpenFlow实现信息交互。 一、SDN的主要内容 SDN在数据平面、控制平面、应用平面的研究内容主要涉及以下方面&#xff1a; 1&#xff0…

SDN基本概念

文章目录 SDN基本概念SDN的概念与体系结构背景传统网络数据控制与转发传统网络结构体系传统网络缺点 SDN概述SDN网络体系架构SDN架构下的接口SDN基本原理OpenFlow的思想和功能OpenFLow网络交换模型 SDN价值网络业务快速创新简化网络网络设备白牌化业务自动化网络路径流量优化 传…

SDN技术概述

1.SDN架构定义 软件定义网络&#xff08;Software Defined Networking&#xff0c;SDN&#xff09;是一种数据平面与控制分离、软件可编程的新型网络体系架构&#xff0c;开放网络基金会&#xff08;Open Network Foundation&#xff0c;ONF&#xff09;作为目前SDN最重…

SDN基本概述

SDN的概念与体系结构 传统网络数据控制与转发&#xff1a; 传统网络是分布式控制的架构&#xff0c;每台设备都包含独立的控制平面&#xff0c;数据平面。 传统网络是分布式控制的架构&#xff1a; 这里的分布式控制指在传统IP网络中&#xff0c;用于协议计算的控制平面和报…

【网络】初识SDN架构

什么是SDN 1.定义 &#xff08;1&#xff09;ONRC: SDN 是一种逻辑集中控制的新网络架构&#xff0c;其关键属性包括&#xff1a;数据平面和控制平面分离&#xff1b;控制平面和数据平面之间有统一的开放接口OpenFlow。 > 强调数控分离和集中控制等表现形式 &#xff08;2…