基于Web 的Word 文档管理系统设计
何怡璇++熊棠
摘要:在Windows系统中,使用Ruby on Rails 4框架设计一个基于Web的word文档管理系统。系统具有在线预览、全文检索、版本控制、文本比较和可控下载等功能。
关键词:word;文档管理;Ruby on Rails 4
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)11-0053-03
企业日常运营中会大量使用到电子文档,一般以微软word文档、excel文档、图片、音视频等形式存在;其中word文档应用范围广泛、数量巨大。从内容上说,包括商务合同、会议记录、产品手册、客户资料、设计文档、推广文案、竞争对手资料、项目文档、心得等。为了有效地存储、管理大量的文档,文档管理系统应运而生。一个实用性的文档管理系统,应具有在线预览、全文检索、版本控制、文本比较和可控下载等功能;其余如访问控制、加密存储、在线协作等不是本文讨论的重点。
在Windows系统中,使用Ruby on Rails 4框架(以下简称RoR4),配合第三方软件设计一个基于Web的word文档管理系统,使其具有上述功能。
1 软件
为了实现前述功能,除RoR4产品环境所需的必要软件外,还需安装以下软件。
1.1 DocToText
DocToText是一个跨平台的命令行工具,支持把DOC、RTF和DOCX等格式转换为UTF-8编码的纯文本。将DocToText.exe保存到服务器,并将所在路径添加到系统环境变量Path中即可。命令格式如下:
doctotext [文件名] >> [文本文件]
[文本文件]中的内容即为获取的纯文本内容。
1.2 Beyond Compare 4
Beyond Compare 4是一款商业软件(以下简称BC4),主要用于文件,文本的比较;支持doc、docx、pdf、html等文件,目前最新版本为4.1.5。BC4还支持命令行操作,将安装路径添加到系统环境变量Path中后,即可使用BCompare命令对两个文件进行比较;比较完成后会生成一个html文件用以存储及现实比较结果。命令格式如下:
BCompare.exe /silent @[参数文件] [文件1] [文件2] [输出网页文件]
1.3 word2pdf
word2pdf是一款免费软件,能够批量将doc、docx、rtf、txt和htm文件转换为pdf文件。word2pdf还支持命令行操作,将安装路径添加到系统环境变量Path中后,即可使用word2pdf.exe命令进行命令行下的批量转换。命令格式如下:
word2pdf.exe /source "[文件1]" "[文件2]" "[文件3]" /target "[输出路径]"
1.4 ImageMagick
ImageMagick是一个跨平台的、用于图像处理的软件包,能对多种格式的图片进行读写操作[1],能够把pdf文件转换为图片。
1.4.1 Ghostscript
Ghostscript是PDF和PostScript语言的解释器[2]。ImageMagick转换pdf文件时需要调用到它。直接下载安装即可,目前最新版本为9.19。
1.4.2 安装并配置ImageMagick
根据系统情况下载合适的ImageMagick并默认安装。在Windows系统中,convert是系统内置命令,和ImageMagick的命令冲突,所以要人工修改。进入ImageMagick安装目录,将convert.exe重命名,如IMconvert.exe。打开注册表编辑器,搜索ImageMagick安装目录,如“C:\Program Files\ImageMagick-6.9.3-Q16”,将搜索到的名为AutoRun的键,值改为修改后的程序路径,如“C:\Program Files\ImageMagick-6.9.3-Q16\IMconvert.exe $*”。
使用ImageMagick将pdf文件转换为jpg等图片时,会按页转换。即在PDF中的一页对应一张图片,图片以数字后缀的形式排列,后缀0表示第一页。命令格式如下:
IMconvert -density [分辨率] [pdf文件][页码范围] [jpg文件]
分辨率即图片的DPI,普通图片72即可,如果对清晰度要求较高,或有较多文字,建议设置为150,如果有大幅打印需求,可以设置为300或更高。
页码范围可缺省,缺省时表示整个文件;页码0表示第一页,支持逗号分隔及连字符,如[0-3,12-25,29]。
jpg文件为输出文件名,当pdf文件多页输出时,输出图片自动添加连字符页码作为新的文件名,如“output-0.jpg”、“output-1.jpg”。
1.5 前端插件
1.5.1 PDF.js
PDF.js 是Mozilla实验室开发的关于HTML5技术的一个开源项目,用于在网页上显示PDF文档,而不需要任何浏览器插件等原生代码[3]。代码托管于GitHub,需要获取源码并构建到本地。也可以直接下载第三方编译好的项目,直接拷贝到服务器目录中使用。在RoR4项目中,也可以通过安装pdfjs-rails这个Gem来实现,后述即基于此方法。
1.5.2 FlippingBook
FlippingBook是一款收费的图书翻页效果的插件,包含swf和js文件。可以使用图片创造出翻页书本的效果。
2 数据结构
在RoR4项目的模型中做如下定义:
2.1 Doc类
Doc表示一个文档,属性title为文档的标题,应据有全局唯一性;另还应有属性定义文档的状态、分类、归属、访问权限、文档说明等。
2.2 Edition类
Edition表示一个具体的文件,与存储在硬盘中的word文件是一一对应的。属性path为文件的存储路径,一个word文件独占一个存储路径;属性version为文件的版本号;属性text为文件的纯文本内容;另还应有属性定义文件的上传者、上传时间等。
2.3 Doc与Edition的关系
一个Doc实例可以包含一个或多个Edition实例,一个Edition实例必属于一个Doc实例。
3 word文档预处理
word文件通过上传组件上传时及成功后,需要做一些预先处理。
3.1 文档识别
客户端word文件通过浏览器上传,文件上传类根据上传时间生成一个全局唯一的无序字符串@path,作为该文件的工作路径;生成路径@path,同时生成word、text、pdf、jpg四个子目录;word文件保存在该路径下的word目录中,文件名为字符串“uploaded.doc”或“uploaded.docx”。文件上传类返回文件路径、文件尺寸、原文件名等信息。对原文件名进行文本处理,去除扩展名、时间标签等可以预见的干扰字符后得到字符串_title,数据库中搜索title属性等于_title的Doc实例,如果返回结果长度为0,则新建一个Doc实例@doc,title值为_title;如果返回一个长度为1的对象@docs,则将@doc赋值为@docs[0];如果@docs长度超过1,则进入异常警告。
如无异常,新建一个Edition实例@edition,@edition属于@doc。@edition.path的值为@path;@edition的version值为@doc的所有edtion对象个数加一,即@edition.version = @doc. editions.size + 1 。
3.2 获取文本
使用docToText工具获取word文件的纯文本内容。原理是使用Ruby的system方法调用命令行工具,后述所有命令行调用均基于此方法。脚本为_status = system(_cmd);_cmd是字符串类型的变量,其值即为需运行的命令;_status是布尔类型的变量,表示运行是否成功。首先针对@edition对象构建_cmd:
_cmd = 'docToText ' + @edition.path + '/word/uploaded.doc' + ' >>' + @edition.path + '/text/uploaded.txt'
system执行后,即在@path/text目录下生成文件uploaded.txt,再使用Ruby的File类将uploaded.txt内容读出,赋值给@edition.text即可,具体脚本不再赘述。
3.3 生成pdf文件
生成pdf文件的原理同上,使用system方法调用命令行工具word2pdf,从word文件生成pdf文件,具体脚本不再赘述。生成的pdf文件位于@path/pdf目录中,文件名为uploaded.pdf。
3.4 生成分页图片
原理同上,调用ImageMagick的IMconvert工具由uploaded.pdf文件生成分页图片,存储在@path/jpg目录中,文件名为uploaded[-页码].jpg格式。
4 主要功能
4.1 在线预览
实现在线预览有两种方式,一是PDF.js展示uploaded.pdf文件;二是flash或js展示分页图片。
4.1.1 展示pdf文件
使用pdfjs-rails可以很便捷地生成pdf预览,在视图文件中使用如下脚本即可:
<%= pdf_viewer @pdf_url %>
@pdf_url即pdf文件的路径。pdfjs-rails会自动生成PDF.js脚本,PDF.js在展示pdf文档时还原精确、功能强大且不再需要其他插件支持。但是有两个问题:一是PDF.js运行在HTML5平台上,不支持HTML5的浏览器无法运行。二是客户端可以复制pdf文档中的纯文本,不利于内容保护。
4.1.2 展示分页图片
另一个思路是使用flash或js加载分页图片创建书籍效果,可以规避前述两个问题。FlippingBook是一款优秀的图书翻页效果flash插件,可以自由灵活的设置导航、尺寸、颜色、背景音乐等参数,以实现不同的浏览效果;FlippingBook是一款收费软件,免费版只能载入10张图片。也可以选择其他flash或js插件实现类似效果。
另外,还可以使用flash插件展示pdf文件,或将pdf文件转化成swf文件再由FlexPaper来做前端展示,由于没有明显优势,此处不做详细说明。
4.2 全文检索
在3.2小节中已获得了纯文本内容并存储在text属性中,因此很容易使用RoR4的SQL查询功能实现全文检索。全文检索会消耗大量服务器资源,可采用以下方法提高检索效率,降低负载:
第一、 对常用关键字及其检索结果建立数据缓存,即把全文检索转换为关键字检索;
第二、 在客户端采用AJAX异步载入部分检索结果,每次只进行有限次数的后台检索。
4.3 版本控制
在数据结构设计时,已将Doc与Edition分开,Doc对应一个文档,Edition对应一个具体的word文件,一个Doc可以对应多个Edition。这种结构可以很容易的做到版本控制。一个word文件在上传的时候被归属到一个文档,并且自动生成版本号。在Edition的属性里面可以记录上传者,上传时间,简要说明与上一版的差别等。一个文档在归档时可以将定版以外的其余版本清除,以节省空间。
4.4 文本比较
可采用Beyond Compare 4命令行工具对两个文件进行文本比较。经过预处理,一个文件有word、txt、pdf、jpg图片4种存在形式。经测试得出如下结论:
第一、 比较doc文件的准确率较高,比较docx文件结果不准确;
第二、 比较txt文件准确率较高,但格式差异无法比较;
第三、 比较pdf文件准确率较高,格式变化也能反映出来;
第四、 无法正常比较jpg图片。
因此,选用pdf文件作为比较对象。首先要建立静态文件BCconfig.txt,完整路径记为_BCconfig,用来定义配置脚本,基本配置如下:
file-report layout:side-by-side &
options:ignore-unimportant,display-context,line-numbers &
output-to:%3 output-options:html-color,wrap-word %1 %2
其次要建立输出文件,BCompare工具不能新建文件,使用Ruby的File类新建一个HTML文件作为输出文件。所有输出文件可以放到一个目录中,文件名为作比较的两个@edition.path连接而成,形如1eu98y-2dg38k.html;文件路径记为_result_path。
第三要生成命令行字符串。记被比较的两个文件路径分别为_pdf_1、_pdf_2,命令格式如下:
BCompare /silent /solo @_BCconfig _pdf_1 _pdf_2 _result_path
silent参数表示静默运行,solo参数表示新建一个BCompare会话实例。最后用system方法调用即可。通过展示结果文件,即可获得比较结果。存储的结果文件可以多次使用,不需要每次都重新比较;也可以读出其内容储存在数据库中,以避免目录下文件过多降低性能。
4.5 可控下载
在RoR4中,较成熟的可控下载方案是采用Apache的xsendfile下载机制。通过服务器端程序判断下载请求是否合法,接受合法请求打开相应文件,读取文件内容并发送给客户端[4]。发送文件时,后端并不直接读取文件,而是在 X-Sendfile 头中指定一个文件的地址来通告前端web服务器。当web服务器检测到后端发送的这个header后,它将忽略后端的其他输出[4],而将文件发送给客户端。并且,X-Sendfile属性不会被发送给客户端,文件路径得到了保护。[4]具体实现方法不再赘述。
5 结束语
通过上述设计,文档管理系统实现了在线预览、全文检索、版本控制、文本比较和可控下载等功能。需要注意的是,本文涉及的第三方软件中有多个商业软件,使用时需注意版权问题。
参考文献:
[1] ImageMagick Studio LLC.ImageMagick: Convert, Edit, Or Compose Bitmap Images[EB/OL]. [2016-03-09].http://www.imagemagick.org/script/index.php.
[2] Artifex Software. Ghostscript[EB/OL]. [2016-03-09]. http://ghostscript.com.
[3] Mozilla Labs. pdf.js/README.md at master· mozilla/pdf.js· GitHub[EB/OL]. [2016-03-09].https://github.com/mozilla/pdf.js/blob/master/README.md.
[4] 熊棠, 唐勇. Windows平台下xsendfile下载机制的实现[J]. 电脑知识与技术, 2014, 10(32), 7619-7656.