首先是最簡單的 首先,對於快速的人可讀性、粗略的字數統計等而言,用字符串掃描 .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 文檔的抓屏 為了使編程更加結構化、可伸縮和可維護,請使用 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 的所有功能和生產,可以“接進”外部數據源、轉換內容等。
結束語 別指望問題能自己解決。作為服務器端開發人員,部分責任就是檢查身邊的操作中的矛盾。如果有報表頻繁丟失或編碼錯誤,那麼有個方法,就是勸誡雇員工作得久一些或更細心點。有時這很管用。但您可以用自動化工具系統地設計有效的過程。 自動化不僅僅只是能減少錯誤。將內容生成或處理過程自動化時,在定制和更佳質量的服務方面,會出現新的可能性。挑選下列參考資料中最符合您情況的內容,用它們解決那些在組織中已經消耗了很多時間的問題,並繼續接受更有趣更有益的挑戰。