IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Linux  >

服务器诊所: 服务器上的 RTF

用低代价的服务器过程将文档处理自动化

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

Cameron Laird (claird@phaseit.net), 副总裁, Phaseit, Inc.

2002 年 12 月 01 日

办公室工作人员习惯交换用 Microsoft Word .DOC 格式编码的文档。丰富的开放源码工具使得自动化管理这些文档的内容成为可能。

用于服务器的 PDF”是本系列中较受欢迎的专栏文章之一。更准确地说,它是收到反馈电子邮件最多的文章。一些读者请求 服务器诊所能同样处理 Microsoft Word 文档:描述该如何用程序去管理它们。

这样做很重要。极少有办公室工作人员能实现自动化,尽管 Microsoft 和其它公司已经在脚本编制、“活动文档”和相关技术方面投入了巨额资金。“文员们”普遍都习惯了这样的日常事务:输入来自计算机打印输出的数据。我看到在大量的工作场所中,甚至于对这样的惯例提出质疑都认为是不寻常的。

另一方面,许多系统程序员,他们身怀可以帮助最终用户集成复杂工作流的专业技能,却并不认为 Microsoft Word 格式是服务器端编程切实可行的目标。可以使用商业文档管理软件包,但价格都在 20,000 美元以上。

事实上,在 Linux 或其它 UNIX 服务器上您可以用适度的代价对 Word 文档进行大量的处理工作。请考虑这些可能性:

首先是最简单的

首先,对于快速的人可读性、粗略的字数统计等而言,用字符串扫描 .DOC 文档通常是足够了。像

strings something.doc | wc -w

这样的命令返回的字数统计值通常误差在 10% 以内。

对这样粗糙的方法进行改进会非常困难。问题的核心在于 .DOC 作为一种格式,在这些年里已经进行了很大的更改。难于跟踪。

相关的 .RTF 有几个优势:它用 ASCII 进行编码,几乎具有人工可读性,并且它不太可能被病毒传染。而且,这些年里它已经显得稳定多了;1997 年的阅读器多半能理解今年编写的 .RTF ,反之也是。在我所管理的一些网络上,我进行了流量限制:把 .DOC 排除在外,而赞成使用 .RTF ,以预防恶意代码。原则上说,这剥夺了用户使用某些字处理特性的权利,而这些特性只能从 .DOC 获得。实际情况是,我 从未遇到过一个这样的用户:他(或她)真正使用了一种用 .RTF 无法达到的效果。

下面的参考资料一节,列出了几个轻量级 Word 阅读器:wvWare、catdoc 等。这些通常能快速简便地进行安装和使用。大多数 UNIX 桌面用户现在都知道,UNIX 上的 OpenOffice 完全可以用来替代 Windows Word 的常见用途,而且非常擅长读和写 .DOC 文档。OpenOffice 公开了可编制脚本的接口,这使得它可以用 Java、C++、Python、OpenOffice.org Basic、StarScript、CORBA 或 OLE Automation 对文档内容进行编程。OpenOffice 还集成了使用这种技术的宏录制。本质上需要商业许可证的产品 StarOffice(TM)也是如此。

事实上,尽管 StarOffice 在形式上与 OpenOffice 是有区别的,本专栏文章完全着重于描述后者,因为根据后者的网站,“StarOffice 软件的未来版本,从 6.0 开始,将使用 OpenOffice.org 源代码、API(应用程序编程接口)、文件格式和参考实现进行构建”(请参阅 参考资料)。在今后的 OpenOffice 实现中,“UNO(通用网络对象,Universal Network Object)是个基于接口的组件模型”。

可是,OpenOffice 是处理 Word 文档相当“笨重的”方式。它至少需要图形用户界面(GUI)服务,通常还需要相当细致的安装和多个编程的过程。面向 XML 的“格式化对象”(FO)与它非常相像:尽管功能很强大,但是它在开始工作之前需要进行许多工作。如果您不想进行这些我常常碰到的简单操作 - 生成固定格式的 .RTF 发票、“擦掉”收入状况周报表、用特定于阅读器的信息定制 Web 下载等等这类的事 - 那么您应该研究 .RTF 库的直接语言绑定。其中最好的是 Robert Rothenburg 的 Perl API。





回页首


RTF::Document

对于最简单的 .RTF 生成过程来说,进行简单的剪贴就够了。您可以用 shell 脚本,用参数表示象 图 1这样的生成。


清单 1. invoice.sh 的源代码(部分)
  
    #!/bin/sh
    
    AMOUNT="1234.56"
    DATE="06 October 2002"
    NUMBER="9999/3333"
    PO="6543"
    
    FORM="{\rtf1\ansi\deff0\deftab720{\fonttbl...
    \par \pard\plain\f3\fs20 
    \par \pard\qr\plain\f2\fs24\cf0 $DATE
    \par \pard\plain\f2\fs24\cf0 Phaseit, Inc.
    \par #$NUMBER
    \par 
    \par Please pay \$$AMOUNT to
    ...
   


图 1. 在 Linux 服务器上生成的简单 Word 文档的抓屏
在 Linux 服务器上生成的简单 Word 文档的抓屏

为了使编程更加结构化、可伸缩和可维护,请使用 Perl 的 RTF 模块。这些模块使得有可能编写出像清单 2 中所示的代码。


清单 2. invoice.pl 的源代码(部分)
  
     use RTF::Document;
     
     $rtf = new RTF::Document({
         doc_page_width => '8.5in',
         doc_page_height => '11in'
     });                 
     $fCourier = $rtf->add_font ("Courier",
         { family=>monospace, pitch=>fixed,
           alternates=>["Courier New", "American Typewriter"]
         }
     ); 
     $fTime s= $rtf->add_font ("Times New Roman",
         { default => 1
         }
     ); 
     
     $rtf->add_text( $rtf->root(), "Invoice", ...    
   

当然,用这个办法,我手头立即拥有了 Perl 的所有功能和生产,可以“接进”外部数据源、转换内容等。





回页首


结束语

别指望问题能自己解决。作为服务器端开发人员,部分责任就是检查身边的操作中的矛盾。如果有报表频繁丢失或编码错误,那么有个方法,就是劝诫雇员工作得久一些或更细心点。有时这很管用。但您可以用自动化工具系统地设计有效的过程。

自动化不仅仅只是能减少错误。将内容生成或处理过程自动化时,在定制和更佳质量的服务方面,会出现新的可能性。挑选下列参考资料中最符合您情况的内容,用它们解决那些在组织中已经消耗了很多时间的问题,并继续接受更有趣更有益的挑战。



参考资料

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文.

  • Rich Text Format (RTF) Specification, version 1.6”是 Microsoft 于 1999 年首次发布的文档。


  • Antiword是个用于 Linux 和 RISC 操作系统的免费 MS Word 阅读器。一些商业的 UNIX 分发版也包括了常见的 Windows 文件格式的专用阅读器。因为这些阅读器不能用于 Linux,所以本专栏文章没有更深入地描述它们。


  • catdoc Word 阅读器紧凑而又简单。


  • wvWare是用于转换 Word 文档的库。


  • 阅读 Cameron 的文章“ 用于服务器的 PDF”( developerWorks,2002 年 9 月)。


  • CPAN RTF目录包括了用于解析和生成 RTF 文档的 Perl 模块。而作者 Robert Rothenberg 将它分为“experimental”和“alpha”两类,它们即使在生产环境中也相当有用。


  • Docserver 是用 Perl 编码的应用程序,它将 .DOC 及相关格式表示成更标准的文本格式。它需要安装(获得许可的)在 Windows 主机上运行的 Microsoft Office,主机可以通过网络访问。


  • Open Office 主页Star Office 主页指向大量关于使用 .DOC.RTF 的信息。


  • UNO Development Kit Project描述了 OpenOffice 进行脚本编制的方法。有关更多的详细信息,请参阅 UNO 技术文档


  • NuxDocument是 Zope 产品,它将 Microsoft Word 和其它格式转换为 HTML 和纯文本。 Zope是很受欢迎的基于 Python 的内容管理和应用程序服务器。


  • Windward Reports 是用 Java 编码的商业产品,它包括了 .RTF ->{XML,TXT,HTML,...} 功能。Windward 是基于 FO(xsl:fo)的,尽管它具有类似的外观。


  • HtmlToHlp是用 Java 编码的转换工具,将 HTML 文件转换成 RTF。


  • JRTF使用 servlet 动态生成 Word RTF 文档。


  • Using XSL-FO to create printable documents”介绍了 FO 并略微谈到了其使用 RTF 的可能性( developerWorks,2001 年 11 月)。


  • developerWorksLinux 专区查找更多 针对 Linux 开发人员的参考资料


关于作者

Cameron 是 Phaseit, Inc. 的一名全职顾问,他经常就开放源码及其它技术主题撰写文章并发表演说。可以通过 claird@phaseit.net与他联系。




对本文的评价










回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款