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

因为最近项目比较紧,所以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

619240-20180415000240589-267890922.png

因为本地的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的微信公众号,我会将我的文章推送给您,并和您一起分享我日常阅读过的优质文章。
1240

转载于:https://www.cnblogs.com/bigdataZJ/p/FilePreviewTour.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值