0


在线文档解决方案非常推荐2种(开源免费)

项目背景

office办公文档,如doc、docx、xls、xlsx、ppt、pptx是无法直接在浏览器中打开的,但很多OA办公软件都要求office文档能直接在线预览功能,解决方法如下:

1、office文档转为html,使用POI将文档转为html文件,直接浏览器打开预览。

优点:简单,方便不需要安装其他插件

缺点:对拓展名为docx、xlsx、pptx格式文档,最终转换输出的格式样式会出错,影响客户阅读,对于客户需求度不高的可以使用该方法处理

2、office文档转为pdf,使用POI和fr.opensagres.xdocreport将文档转为pdf文件,让浏览器内置pdf阅读器浏览。

优点:简单,方便不需要安装其他插件

缺点:doc、xls、ppt输出格式问题不是很大,docx、xlsx、pptx格式文档输出样式错误并且会出现文字丢失等情况,影响客户阅读

3、office文档转为pdf,使用Apache提供的openOffice将文件转为pdf文件;保证文档格式、文件转换输出稳定,满足在线预览条件。【推荐】

优点:免费,完美解决转换格式出错问题。

缺点:需要下载安装第三方工具openOffice

通过poi实现word、excel、ppt转pdf流,这样就可以在浏览器上实现预览了。

4、kkFileView为文件文档在线预览解决方案,该项目使用流行的spring boot搭建,易上手和部

署,基本支持主流办公文档的在线预览,如doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip,rar,图片,视频,音

频等等。【推荐

一、openOffice 实现在线文档预览

1、官网下载openOffice 安装包,运行安装(不同系统的安装请自行百度,这里不做过多描述)

去官网下载:点击去官网下载

img

2、pom中引入依赖

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

3、office文件转为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;
import java.nio.file.Files;
 
/**
 * 文件格式转换工具类
 */
public class FileConvertUtil {
 
    /**
     * 默认转换后文件后缀
     */
    private static final String DEFAULT_SUFFIX = "pdf";
    /**
     * 端口
     */
    private static final Integer OPENOFFICE_PORT = 8100;
 
    /**
     * office文档转换为PDF(处理本地文件)
     *
     * @param sourcePath 源文件路径
     * @param suffix     源文件后缀
     * @return InputStream 转换后文件输入流
     */
    public static InputStream convertLocaleFile(String sourcePath, String suffix) throws Exception {
        File inputFile = new File(sourcePath);
        InputStream inputStream = Files.newInputStream(inputFile.toPath());
        return covertCommonByStream(inputStream, suffix);
    }
 
    /**
     * office文档转换为PDF(处理网络文件)
     *
     * @param netFileUrl 网络文件路径
     * @param suffix     文件后缀
     * @return InputStream 转换后文件输入流
     */
    public static InputStream convertNetFile(String netFileUrl, String suffix) throws Exception {
        // 创建URL
        URL url = new URL(netFileUrl);
        // 试图连接并取得返回状态码
        URLConnection urlConnection = url.openConnection();
        urlConnection.connect();
        HttpURLConnection httpUrlConnection = (HttpURLConnection) urlConnection;
        int httpResult = httpUrlConnection.getResponseCode();
        if (httpResult == HttpURLConnection.HTTP_OK) {
            InputStream inputStream = urlConnection.getInputStream();
            return covertCommonByStream(inputStream, suffix);
        }
        return null;
    }
 
    /**
     * 将文件以流的形式转换
     *
     * @param inputStream 源文件输入流
     * @param suffix      源文件后缀
     * @return InputStream 转换后文件输入流
     */
    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
     */
    public static ByteArrayInputStream outputStreamConvertInputStream(final OutputStream out) throws Exception {
        ByteArrayOutputStream outputStream = (ByteArrayOutputStream) out;
        return new ByteArrayInputStream(outputStream.toByteArray());
    }
 
}

4、service层代码

    @Override
    public void onlinePreview(String url, HttpServletResponse response) {
        // 获取文件类型
        String[] str = SmartStringUtil.split(url, "\\.");
 
        if (str.length == 0) {
            throw new Exception("文件格式不正确");
        }
        String suffix = str[str.length - 1];
        if (!"txt".equals(suffix) && !"doc".equals(suffix) && !"docx".equals(suffix) && !"xls".equals(suffix)
                && !"xlsx".equals(suffix) && !"ppt".equals(suffix) && !"pptx".equals(suffix)) {
            throw new Exception("文件格式不支持预览");
        }
        try {
            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();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

5、controller层代码

@PostMapping("/file/onlinePreview")
public void onlinePreview(@RequestParam("url") String url, HttpServletResponse response) throws Exception{
    fileService.onlinePreview(url,response);
}

二、kkfileview 实现在线文档预览

1、项目介绍

此项目为文件文档在线预览项目解决方案,项目使用流行的 spring boot 搭建,易上手和部署,部署好后可以独立提供预览服务,使用 http 接口访问,不需要和应用集成,具有跨系统跨语言使用的特性。提供 zip/tar.gz 发行包、自定义配置文件、和启动 / 停止脚本等,极大方便部署使用,同时官方发布 Docker 镜像,方便容器环境中部署使用。

基本支持主流办公文档的在线预览,如 doc,docx,dwg, ofd, xls,xlsx,ppt,pptx,pdf,txt,zip,rar,7z,mp3,mp4,flv 图片等等。

KKFileView是一款文件浏览器,它提供了方便的文件浏览和管理功能。如果要去除切换图标,可以按以下步骤操作:打开KKFileView,进入设置页面;在“UI Settings”选项中找到“Toolbar Style”选项,在下拉菜单中选择“Icon Only”;确认设置后,返回文件浏览器页面,即可看到切换图标已被去除。这样,用户可以更加专注于文件浏览和管理操作,减少其他无关信息的干扰,提高操作效率。

b1267b54c174770e1a8a85cfc094f48f.png

项目文档(Project documentation)

  • 详细使用文档:kkFileView - 在线文件预览

项目地址:kkFileView: 使用spring boot打造文件文档在线预览项目解决方案,支持doc、docx、ppt、pptx、wps、xls、xlsx、zip、rar、ofd、xmind、bpmn 、eml 、epub、3ds、dwg、psd 、mp4、mp3以及众多类文本类型文件在线预览

项目官网:https://kkfileview.keking.cn

Docker 镜像:https://hub.docker.com/r/keking/kkfileview

发行版下载:

kkFileView-4.1.0.zip(Windows 版)

kkFileView-4.1.0.tar.gz (Linux 或 MacOS 版)

kkFileView-4.1.0-docker.tar (Docker 离线文件)

Docker 版本在线使用方式:

docker pull keking/kkfileview:4.1.0

docker run -it -p 8012:8012 keking/kkfileview:4.1.0

Docker 离线文件使用方式:

wget http://kkfileview.keking.cn/kkFileView-4.1.0-docker.tar

docker load -i kkFileView-4.1.0-docker.tar

docker run -it -p 8012:8012 keking/kkfileview:4.1.0

2、项目特性

支持的文件类型

我们一直在扩展支持的文件类型,不断优化预览的效果,如果您有什么建议,欢迎在kk开源社区留意反馈:https://t.zsxq.com/09ZHSXbsQ。

  1. 支持 doc, docx, xls, xlsx, xlsm, ppt, pptx, csv, tsv, dotm, xlt, xltm, dot, dotx, xlam, xla, pages 等 Office 办公文档
  2. 支持 wps, dps, et, ett, wpt 等国产 WPS Office 办公文档
  3. 支持 odt, ods, ots, odp, otp, six, ott, fodt, fods 等OpenOffice、LibreOffice 办公文档
  4. 支持 vsd, vsdx 等 Visio 流程图文件
  5. 支持 wmf, emf 等 Windows 系统图像文件
  6. 支持 psd, eps 等 Photoshop 软件模型文件
  7. 支持 pdf ,ofd, rtf 等文档
  8. 支持 xmind 软件模型文件
  9. 支持 bpmn 工作流文件
  10. 支持 eml 邮件文件
  11. 支持 epub 图书文档
  12. 支持 obj, 3ds, stl, ply, gltf, glb, off, 3dm, fbx, dae, wrl, 3mf, ifc, brep, step, iges, fcstd, bim 等 3D 模型文件
  13. 支持 dwg, dxf, dwf, iges , igs, dwt, dng, ifc, dwfx, stl, cf2, plt 等 CAD 模型文件
  14. 支持 txt, xml(渲染), md(渲染), java, php, py, js, css 等所有纯文本
  15. 支持 zip, rar, jar, tar, gzip, 7z 等压缩包
  16. 支持 jpg, jpeg, png, gif, bmp, ico, jfif, webp 等图片预览(翻转,缩放,镜像)
  17. 支持 tif, tiff 图信息模型文件
  18. 支持 tga 图像格式文件
  19. 支持 svg 矢量图像格式文件
  20. 支持 mp3,wav,mp4,flv 等音视频格式文件
  21. 支持 avi,mov,rm,webm,ts,rm,mkv,mpeg,ogg,mpg,rmvb,wmv,3gp,ts,swf 等视频格式转码预览
  22. 支持 dcm 等医疗数位影像预览
  23. 支持 drawio 绘图预览

kkFileView于2008年1月2日发布了首个V0.0.2发行版本并于2021年7月6日发布了V4.0.0版本。对于Office文件文档的在线预览,kkFileView的底层是基于开源openoffice或libreoffice上构建的。

先简单介绍一下kkFileView V4.0.0的主要功能改进基于LibreOffice7.1底层,兼容性更强,预览效果更好,具体如下:

1.底层集成OpenOffice替换为LibreOffice,Office文件兼容性增强,预览效果提升

2.修复压缩文件目录的穿越漏洞

3.修复PPT预览使用PDF模式无效。

4.修复PPT图片预览模式前端显示异常

5.新增功能:首页文件上传功能可通过配置实时开启或禁用。

6.优化增加Office进程关闭日志。

**7.优化Windows环境下,查找Office组件逻辑(内置的LibreOffice优先)**。

8.优化启动Office进程改同步执行

3、在线体验

请善待公共服务,会不定时停用。

地址:https://file.keking.cn

4、预览展示

1. 文本预览

支持所有类型的文本文档预览, 由于文本文档类型过多,无法全部枚举,默认开启的类型如下 txt,html,xml,properties,md,java,py,c,cpp,sql 如有没有未覆盖全面,可通过配置文件 指定文本类型 文本预览效果如下

文本预览效果如下

2. 图片预览

支持 jpg,jpeg,png,gif 等图片预览(翻转,缩放,镜像),预览效果如下

3. word 文档预览

支持 doc,docx 文档预览,word 预览有两种模式:一种是每页 word 转为图片预览,另一种是整个 word 文档转成 pdf,再预览 pdf。两种模式的适用场景如下

  • 图片预览:word 文件大,前台加载整个 pdf 过慢
  • pdf 预览:内网访问,加载 pdf 快 默认为每页 word 转为图片预览,可通过点击右边的 pdf 图标转,也可通过配置文件 设置默认预览模式 图片预览模式预览效果如下word文档预览1pdf 预览模式预览效果如下word文档预览2
4. ppt 文档预览

支持 ppt,pptx 文档预览,和 word 文档一样,有两种预览模式 图片预览模式预览效果如下

ppt文档预览1

pdf 预览模式预览效果如下

ppt文档预览2

5. pdf 文档预览

支持 pdf 文档预览,和 word 文档一样,有两种预览模式 图片预览模式预览效果如下

pdf文档预览1

pdf 预览模式预览效果如下

pdf文档预览2

6. excel 文档预览

支持 xls,xlsx 文档预览,预览效果如下

excel文档预览

ps,如碰到 excel 预览乱码问题,可参考 预览乱码

7. 压缩文件预览

支持 zip,rar,jar,tar,gzip 等压缩包,预览效果如下

压缩文件预览1

可点击压缩包中的文件名,直接预览文件,预览效果如下

压缩文件预览2

8. 多媒体文件预览

理论上支持所有的视频、音频文件,由于无法枚举所有文件格式,默认开启的类型如下 mp3,wav,mp4,flv 如有没有未覆盖全面,可通过配置文件指定多媒体类型 视频预览效果如下

多媒体文件预览1

音频预览效果如下

多媒体文件预览2

5、快速开始

1.项目使用技术
  • spring boot: spring boot 开发参考指南
  • freemarker
  • jodconverter
  1. 第一步:pull 项目 https://github.com/kekingcn/file-online-preview.git
  2. 第二步:运行 FilePreviewApplication 的 main 方法,服务启动后,访问 http://localhost:8012/ 会看到如下界面,代表服务启动成功 。
2.Windows版本安装
1、将上面打包好的zip的包解压

img

解压包目录结构

2、运行bin文件夹中的startup.bat

查看log文件夹中的kkFileView.log文件,出现如下图所示的信息(服务启动完成,演示页访问地址)则表示启动成功。

3、输入地址进行访问,后续操作就和在编辑器上启动时是一样的了

6、访问地址

http://localhost:8012/

标签: java

本文转载自: https://blog.csdn.net/qq_30713721/article/details/132666695
版权归原作者 cxzm_java 所有, 如有侵权,请联系我们删除。

“在线文档解决方案非常推荐2种(开源免费)”的评论:

还没有评论