基于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.

相关文章!
  • 融合正向建模与反求计算的车用

    崔庆佳 周兵 吴晓建 李宁 曾凡沂<br />
    摘 要:针对减振器调试过程中工程师凭借经验调试耗时耗力等局限性,引入反求的思想,开展了

  • 浅谈高校多媒体教育技术的应用

    聂森摘要:在科学技术蓬勃发展的今天,我国教育领域改革之中也逐渐引用了先进技术,如多媒体技术、网络技术等,对于提高教育教学水平有很

  • 卫星天线过顶盲区时机分析

    晁宁+罗晓英+杨新龙<br />
    摘 要: 分析直角坐标框架结构平台和极坐标框架平台结构星载天线在各自盲区状态区域附近的发散问题。通过建