• 文件预览——一路躺过来的那些坑


    因为最近项目比较紧,所以dubbo源码系列是顾不上了。

    恰巧这周花了几天在做文件预览这块,两三天的时间下来,有过一些走弯路的经验教训(准确说,全都是弯路),在这里给大家分享下~

    背景

    基于产品需求,需要支持文件预览的功能。顾名思义,要支持类似word、excel、TXT、PDF等格式文件的在线预览。

    业界对于文件预览功能的实现也是各显神通。大体主要分为两种,一种是自主研发,另外就是购买成熟预览服务提供商的服务。

    既然说到躺坑,那自然是属于第一种自主研发的情况。

    自主研发主要还是借用现有的软件和类库组合,加上编码实现。网上搜罗一通,资料相对老旧,很多组件也有超过5年没有更新迭代了。解决方案大致分为两种:

    1、以Openoffice + swftools + Flexmapper + jodconverter技术组合的预览实现

    大体思路是将如doc等文件格式转为pdf格式,再将pdf经过swftools工具转为swf格式,有flexmapper负责最后的预览。

    上面这四个组件,没有一个是好惹的,各个脾气古怪,稍不顺心,就给你报个错,让你折腾半天。

    2、以https://github.com/kekingcn/kkFileView(下面简称kkFileView)该项目为首的基于jodconverter-core + Openoffice的解决方案

    大体思路是借助jodconverter-core和Openoffice将doc等文件转为pdf格式,再由前端通过第三方预览组件如pdf.js负责预览展示。

    调研

    既然市面上提供多种可行性的方案,那么就需要调研对比具体的效果。

    kkFileView

    首先调用的是kkFileView,相信只要找文档格式转换和预览相关的,最终都会看到这个项目。

    该项目托管在GitHub上,使用spring boot打造文件文档在线预览项目解决方案,支持doc、docx、ppt、pptx、xls、xlsx、zip、rar、mp4,mp3以及众多类文本如txt、html、xml、java、properties、sql、js、md、json、conf、ini、vue、php、py、bat、gitignore等文件在线预览。

    看上去完美,但是对接也并非一帆风顺。一些具体细节问题可以到QQ群咨询,在Github上有提供加入方式。

    • 环境配置

    该项目的思路是将如doc、xls等格式转为pdf格式供前端展示。但是应该是考虑到文件转换耗时较长的问题,所以使用了Redis做缓存,如果发现缓存中已经有转换过的记录就不再执行耗时的转换操作。所以需要配置Redis环境。

    该项目同样依赖Openoffice服务,所以要安装Openoffice软件。安装完成需要在项目的配置文件中配置安装软件路径。

    最后kkFileView项目application-dev.properties配置如下

    
    
    #redis连接
    spring.redisson.address = 127.0.0.1:6379
    ##资源映射路径
    file.dir = downloadfile/
    #spring.redisson.password=123
    spring.resources.static-locations = classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${file.dir}
    ## openoffice home路径
    office.home = /Applications/OpenOffice.app/Contents
    server.tomcat.uri-encoding = UTF-8
    converted.file.charset = GBK
    #文件上传限制
    spring.http.multipart.max-file-size=10000MB
    ##文本类型
    simText = txt,html,xml,java,properties,mp3,mp4,sql
    #多媒体类型
    media=mp3,mp4,flv,rmvb
    logging.level.root=debug
    
    
    

    如果Redis设置密码,需要配置“spring.redisson.password”属性

    另外,本机系统环境是macOS,所以启动Openoffice需要执行

    
    cd /Applications/OpenOffice.app/Contents/program
    
    ./soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard 
    
    
    • 文件转换

    本地搭建环境后,启动服务,测试各种常见文档如word、excel、ppt等,发现仍然存在一些问题。

    当上传word或其他文档过大时,预览翻页的时候会有明显的阴影和卡顿的情况,而且翻页速度变快时,会出现反复加载的情况。

    对于ppt文档的支持较差,尤其包含动画的ppt页,只是简单的叠加,导致内容失真。同时可能是电脑本地字体库的原因,有些文件在转换后预览的时候会出现乱码的情况。

    Openoffice + swftools + Flexmapper + jodconverter方案

    为了运行起该方案,走了太多弯路。

    • 环境配置

    安装swftools之前,一切都还顺利。但是对于macOS环境安装swftools安装各种报错。

    主要受影响的是需要使用的pdf2swf没有安装,通过http://blog.chinaunix.net/uid-21374062-id-3031316.html等资料解决了安装时不抱这个错。同时也换过使用brew直接安装的方式,但是最终结果都是一致的让人绝望,那就是pdf2swf一直没有成功安装。

    后来只能在虚拟机的Windows环境中安装swftools,安装过程中也会弹出一个错误,只需要以管理员的身份重新安装即可。

    最终在Windows环境下成功实现从doc->pdf->swf的转换。

    如需代码,请留下邮箱~~~

    • 文件转换

    该模式与上面方案存在同样的问题,如果需要支持高版本office文档的转换,也需要jodconverter-core的支持。

    而且,该方案,文件转换繁琐,需要转为pdf,再由pdf转为swf,最后进行预览。swf已经是极为过时的技术。

    使用

    • kkFileView

    刚开始仅仅依赖com.artofsolving.jodconverter的jar包完成文档转换。但是实际操作发现,该工具包不支持较高版本的office文档如docx、xlsx和pptx等。

    所以后来找了相关资料,发现要么重写BaseDocumentFormatRegistry类(参见https://blog.csdn.net/make_a_difference/article/details/53771136)或者引用jodconverter-core的jar包(参见http://huangronaldo.iteye.com/blog/1628339)。

    其实这里的orgartofsolving.jodconverter-core就是我们提到的kkFileView项目中的jodconverter-core子项目。

    关于引用jodconverter-core按照网上添加denpendency无法下载,后来根据下面的线索访问http://maven.jahia.org/maven2找到可用的版本是3.0-beta-4-jahia4

    因为本地的setting.xml文件没有添加这个repository,所以在当前项目的pom.xml文件中添加

    
    <repositories>
        <repository>
            <id>org.artofsolving.jodconverter</id>
            <name>Maven jahia Mirror</name>
            <url>http://maven.jahia.org/maven2/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>
    

    我本地有一个测试的完整项目代码,如果需要,下方留下你的邮箱。

    实测效果

    将一个近10M的xls文件转为pdf文档,本地耗时约为5分钟左右(不能忍)。

    总体,该项目考虑较为完整,但是仍然有不少细节需要优化和处理。

    • Openoffice + swftools + Flexmapper + jodconverter方案

    从实际转换后得到的swf文件可以看出,对于doc和xls的预览效果要比上面的好,不会出现卡顿的情况,但是对于ppt格式的支持仍然不理想,只是简单的叠加覆盖。

    整体对比下来,这两种方案都存在问题

    • 都依赖相对较多的第三方库和软件Openoffice、swftools等

    • 库和jar的版本没有持续维护,jodconverter的版本最新的是2008年,jodconverter-core最新版本是2012年。swftools最新版本是2012年。

    • 效率较低,从上面测试效果发现,在文档转换过程中占用资源较多,时间比较长,不能很好的满足用户的需求,只能通过一些补偿机制做补充,如添加缓存或落盘转换后的文件

    经过调研,协调运维和全后端开发人员,决定采用市面上较为成熟的预览服务提供商,这里就不说名称了,以免有打广告之嫌。

    通过对接后发现,只需要完成注册+配置域名+拼装http请求即可,同时预览同等大小的文件仅需5秒左右。

    毕竟,人民币玩家就是强!

    如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!如果您想持续关注我的文章,请扫描二维码,关注JackieZheng的微信公众号,我会将我的文章推送给您,并和您一起分享我日常阅读过的优质文章。

  • 相关阅读:
    gc buffer busy/gcs log flush sync与log file sync
    给Oracle年轻的初学者的几点建议
    Android 编程下帧动画在 Activity 启动时自动运行的几种方式
    Android 编程下 Touch 事件的分发和消费机制
    Java 编程下 static 关键字
    Java 编程下 final 关键字
    Android 编程下模拟 HOME 键效果
    Why Are Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit Deprecated ?
    Extjs4 大型项目目录结构重构
    [转]SQLServer 2008 允许远程连接的配置方法
  • 原文地址:https://www.cnblogs.com/bigdataZJ/p/FilePreviewTour.html
Copyright © 2020-2023  润新知