永中那个在线文档预览的DCS功能是怎么回事

永中文档下载 ·
永中那个在线文档预览的DCS功能是怎么回事

永中DCS到底是什么东西

我第一次听说永中DCS,是在一个搞OA系统的朋友那儿。他让我帮忙测试一个文档预览功能,说用的是永中的一个新东西,叫DCS。我当时愣了半天,想着永中不是做办公套件的吗,怎么又捣鼓出一个DCS来。后来查了才知道,DCS全称是Document Conversion Service,就是文档转换服务。简单说,它专门负责把各种文档转成能在网页上直接看的样子,比如PDF、图片,甚至HTML流式页面。核心目的就一个:让你在浏览器里打开文档时,不用下载原件,也不用装Office或WPS,就能原样看到内容。这对那些做在线教育、企业网盘、合同管理平台的人来说,真是个宝贝。

我当时在一个项目里正好需要这个功能。客户要求内部系统能预览员工上传的合同,格式五花八门,有docx、xlsx、pdf,甚至还有图片和txt。刚开始我想着用开源的方案,搞个LibreOffice转PDF那一套,结果折腾了几天,问题一堆:字体丢失、复杂表格错乱、图片显示不出来,又慢又痛苦。后来试了下永中DCS,坦白说,第一次跑起来的时候真是松了口气。它像是一个黑盒子,你扔进去文件,它吐出能在网页上显示的东西,而且效果基本和本地打开一样。它不是给你做二次开发的,而是一个完整的转换和预览服务,你只需要配置文件上传和预览接口就行。

免费使用无需付费解锁官方正版安装包带数字签名高速下载多线程·稳定不限速

DCS下载安装那些坑

DCS这东西不是普通软件,它是一个服务器端服务,拿到的安装包一般是个压缩文件,里面包含了启动脚本、配置文件,还有一个内嵌的Tomcat。我第一次下载就是点本页下载按钮,下来一个大概三四百兆的zip包。解压后目录结构有点类似Tomcat的套路,有个start和stop脚本,还有一个名为dcs的文件夹,里面放着核心的jar包和配置。安装过程官方有文档,但说实话,开始我没仔细看,直接双击start.bat,结果弹出一个黑框然后马上消失。折腾了半天才发现,DCS默认占用了8080端口,和本地的Tomcat冲突了。改端口很简单,打开conf目录下的server.xml文件,找到Connector那行,把port改成8090就行了。改完再跑,这次控制台老老实实出来一堆日志,显示Service started,总算成功了。

不过第一次跑的时候会报一个警告,说找不到字体。DCS转换文档时依赖系统中的字体库,如果缺了中文字体,输出PDF或图片里可能出现乱码或者方块字。解决方案也很笨:把自己系统的中文字体,比如宋体、黑体、微软雅黑,拷贝到DCS的fonts目录下。注意,这个fonts目录不在解压出来的文件夹里,需要你自己建一个,然后修改启动脚本,加上一条路径参数指向这个目录。我在Windows上试过,直接把C盘的Fonts文件夹复制过去也挺好用的,就是有点大,三百多兆。后来朋友推荐用更轻量的方案,只复制常用字体的ttf文件,比如simsun.ttc、msyh.ttf这些,能省不少空间。启动脚本里设置环境变量,比如-Ddcs.font.dir=/usr/local/dcs/fonts,记得在Linux下要把字体权限改成644,否则DCS不认。

配置和参数调优

DCS装好之后,我最头疼的是它的参数调节。默认配置其实够用,但如果你转换量比较大,或者文件特别复杂,就得好好调一调了。它有个核心配置文件叫dcs.properties,里面密密麻麻一堆键值对。我印象最深的是thread.pool.size,默认设置是4,意思是同时最多处理4个文档转换任务。当时我在压测时发现,一旦并发超过4个文件,后面的就得排队,界面预览响应变得特别慢。我把这个数值调到了8,同时把queue.size也从默认的100调到了200,这样队列能存更多等待任务,不会轻易丢请求。不过要注意,这个线程数和服务器CPU核心数有关,我那台测试机是8核的,8个线程刚好跑满,再往上调反而会因为上下文切换导致效率下降。

还有一个参数我折腾了很久:office.temporary.folder。DCS在转换Office文档时,会先把它转换成中间格式,再生成最终输出。默认临时文件夹在系统tmp目录,转换大文件时容易把磁盘塞满,而且清理不及时可能导致永久占用的空间。我后来把它改到一个独立的目录,比如/data/dcs_temp,同时配合系统cron脚本,每天凌晨自动清理三天前的临时文件。另外,pdf.switch.font替换开启后,能解决PDF预览中的字体丢失问题,但会增加转换时间。我自己试了试,关闭这个选项后,很多PDF里的特殊字体直接变成点阵,效果很差。最终还是开着它,同时把输出图片的分辨率从默认的72dpi调到了150dpi,这样预览的文字边角清晰,客户看了也没再挑剔。

实际使用场景

真正用上DCS后,最大的感受就是省心。比如我那个合同管理项目,用户上传合同后,系统自动调用DCS接口转成PDF流,然后前端用Viewer.js展示。只要注意一点:上传的文件名最好不要有中文和特殊符号。我踩过一次坑,一个用户上传的合同叫「采购合同1025(修订版)V2_最终.doc」,结果DCS转换时返回了一个500错误,后来看了日志发现是文件名里的括号和空格导致路径解析出问题。解决办法是上传前在代码里对文件名做一次URL编码,或者干脆把所有非ASCII字符替换成数字和字母。这个小改动之后,再也没出现类似异常。

还有一个场景是移动端预览。公司的销售系统要支持手机上看产品手册,本来用的是云端方案,但每次加载特别慢,一个几十MB的PDF要转成图片显示,在4G网络下体验很糟。后来改用DCS把文档提前转成HTML5流式页面,这样手机浏览器就能直接像翻书一样浏览,而且只加载当前页的内容。配置上需要在请求参数里加上outputType=html,DCS就会生成一个包含所有内容的HTML包。不过要注意,这种模式下如果原文档字体很花哨,转换效果偶尔会偏差,比如列表缩进对不齐。我给客户演示的时候特地用了纯文本和简洁排版的产品手册,效果就很好,他们也就接受了。

常见问题:乱码、超时、服务挂掉

DCS最常见的问题就是乱码,尤其是Linux服务器上。前面说了字体缺失,但还有一个容易忽略的地方:区域设置。我一开始装的CentOS 7,系统locale是en_US.UTF-8,结果转换出来英文文档完美,中文文档里的标点符号全变成问号。后来查资料发现,DCS转化时需要读取系统的字符编码,如果locale没设好,中文字符就处理不了。解决办法很简单,在启动脚本开头加上export LANG=zh_CN.UTF-8,再重启服务就好了。如果你系统里没装中文locale,先用localedef命令生成一个,具体命令我就不写了,网上大把教程。

超时问题也闹心。默认DCS对单次转换有60秒超时限制,但有些大型Excel文件,里面带几十个sheet和图表,转起来可能要两分钟。碰到这种情况,用户端会收到504网关超时,然后抱怨预览失败。我后来在dcs.properties里找到convert.timeout这个参数,改成了300秒。但仅仅这样还不够,因为前端调用接口时,如果nginx或apache也有超时限制,同样会被截断。我这儿配合运维调整了nginx的proxy_read_timeout为600秒,才算彻底解决。另外,如果服务频繁挂掉,记得检查内存。DCS默认JVM堆内存是512MB,遇到大文件转图片,内存很快爆满。我一般改成-Xms1024m -Xmx2048m,分配两吉内存,跑小峰值够用了。

小技巧和替代方案

用了两年多DCS,我攒了几个小技巧。一个是预览时直接控制参数,比如在预览地址后面加上?page=3,能直接跳到指定页,省得用户自己翻。还有watermark参数,可以在预览画面添加水印文字,我用来给合同预览加上「预览版本,仅供参考」。还有个trick是请求时带上convertOnDemand=false,这样DCS会在上传时立即转换,而不是等到第一次预览才转。对于价格昂贵的大体积文件,这种做法能提前发现转换失败,避免用户等半天。不过代价是存储消耗大,因为你要保存转换结果,我一般结合定时清理策略一起用。

如果你觉得DCS太重或者公司预算有限,也有替代方案。开源界有LibreOffice配合jodconverter,能实现类似的转换,但效果和稳定性差很多,尤其是复杂Office文件。我还试过OnlyOffice的文档预览插件,它自带一个转换服务,对docx支持不错,但pptx里动画和特效经常丢失。再往上的选择是Google Docs预览,纯云端,免费但限制文件大小和次数,企业用也不合规。综合下来,如果追求省钱且不介意偶尔调试字体、表格这些小问题,LibreOffice方案可以折腾一下。但如果想让内部系统稳定运行,少让IT人员半夜爬起来看日志,DCS算是性价比最高的选择。