レベル: 初級 Cameron Laird (Cameron@Lairds.com), Vice President, Phaseit, Inc.
2002年 12月 01日 事務系の仕事をしている人々は、よくMicrosoft Wordの.DOC フォーマットの文書をやりとりします。豊富にあるオープン・ソースのツールを使えば、そうしたフォーマットの内容の管理も自動化できます。
サーバーでのPDF活用は、この連載でも人気のあるコラムの1つでした。もっと正確にいうなら、電子メールでの反響が最も多いコラムでした。サーバー・クリニック で、同じようにMicrosoft Word文書を扱ってほしい、Wordの文書をプログラムで管理する方法を紹介してほしい、という読者も多くいました。
そのような管理は、重要なことです。Microsoftなどが、スクリプティングや「アクティブ文書」などのテクノロジーに多大な投資を行っているにもかかわらず、事務職の人で自動化の要点を理解している人は多くはありません。「一般市民」は、概して、コンピューターからプリンター出力されたデータをタイプするという作業に慣らされています。多くの職場では、そのような方法に疑問を発することすら稀です。
他方、(エンド・ユーザーがさまざまな作業の流れを統合化するのを手助けする)専門知識を備えたシステム・プログラマーの多くは、Microsoft Wordのフォーマットを、サーバー・サイド・プログラミングの対象としては捉えていません。文書管理用のパッケージも商品化されていますが、それには2万ドル以上の費用がかかります。
しかし実際には、Linuxや他のUNIX系サーバーで大して費用をかけずにWordの文書を対象に行えることはたくさんあります。以下では、どんなことができるのかを考えてみたいと思います。
まずは一番簡単なものから
まず、人がざっと目を通したり、だいたいのワード数を知りたいというようなときは、.DOC 文書の文字列を拾ってくるだけで充分な場合がよくあります。通常、
strings something.doc | wc -w
のようなコマンドは、実際のワード数の10%以下のワード数を返してきます。
この大雑把なやり方で精度を上げるのは、驚くほど難しい話です。問題の核心は、.DOC が、フォーマットとして年々かなり変化していることにあります。変化を追っていくのは大変です。
一方、それと同族の.RTF には、いろいろな利点があります。ASCIIでコード化され、ほとんど人の目で判読でき、汚染されていることも、まずありません。長年時間が経過しても、それほど変化していないようで、1997年製の読み出しツールでも、多分、今年作成された.RTF を読むことができ、その逆も可能なはずです。私が管理しているネットワークの中には、トラフィックから.DOC を除外しているものもあります。.RTF にすれば、悪意のあるコードを予防できるからです。この場合、ユーザーは、基本的に、.DOC でないと利用できないワード・プロセッシング機能を利用できなくなります。しかし、実際のところ、.RTF では実現できない効果を実際に使用しているユーザーは、これまでのところ、いません でした。
稿末の参考文献一覧に、wvWareやcatdocなど、軽量のWord読み取りツール (reader) をいくつか掲げておきます。これらの読み取りツールは、一般的に、インストールも使い勝手も、軽快かつ簡単です。今では、ほとんどのUNIXデスクトップ・ユーザーが、一般的な使い方をするときのWindows Wordの代わりとしてOpenOffice-on-UNIXを遜色なく使うことができ、.DOC 文書の読み書きもまったく問題なく行うことができることを知っています。OpenOfficeは、スクリプト型のインターフェースを備えており、文書の内容をJavaやC++、Python、OpenOffice.org Basic、StarScript、CORBA、およびOLE Automationのいずれかでプログラムできるようになっています。OpenOfficeは、また、このテクノロジーを用いてマクロを記録する機能も搭載しています。基本的に、商業製品であるStarOffice(TM) についても同じことが言えます。
StarOfficeとOpenOfficeは、形式的には別物ですが、本稿では、完全に後者だけに的を絞って話を進めたいと思います。というのも、OpenOfficeのWebサイトによると (参考文献参照)、「StarOfficeの将来の6.0以降のバージョンは、OpenOffice.orgのソース、API (アプリケーション・プログラミング・インターフェース)、ファイル・フォーマット、および参照実装を使って構築されることになっている」とのことだからです。将来のOpenOfficeの実装では、「インターフェースを基礎にしたコンポーネント・モデルとして、UNO (汎用ネットワーク・オブジェクト: Universal Network Objects) が使用されます」
といっても、OpenOfficeは、Word文書を扱うには、けっこう「重い」方法です。少なくともグラフィカル・ユーザ・インターフェース (GUI) サービスを必要としますし、インストールも、かなり慎重を行う必要があり、複数のプログラム化されたプロセスが必要です。XML指向の「フォーマティング・オブジェクト (FO)」の場合も、ほとんど似たようなもので、強力ではありますが、稼働させようとすると、かなりの仕掛けを用意する必要があります。私がだいたい常日頃行っているような単純な作業を行いたいと思っているのであれば、たとえば、.RTF で定型の伝票を作成したり、送られてくる週報を「かき集め」たり、読み取りツールに固有な情報でWebダウンロードをカスタマイズするといった類の作業なら、.RTF 関係のライブラリーを直接言語にバインドする方法を検討したほうがよいのではないでしょうか。中でも、秀逸なのは、Robert Rothenburg作のPerlによるAPIです。
RTF::Documents
一番簡単に.RTF を作成したければ、単純にカット & ペーストを行うだけで充分です。シェル・スクリプトを使って、図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のすべての能力と生産性を即座に利用でき、外部のデータの挿入や内容の変換も可能になります。
まとめ
問題は、自然と収まっていくものだと考えてはいけません。皆さんの周りで行われている作業で何かうまくいかないことがないか探して回ることも、サーバー・サイドの開発者としての皆さんの責任に含まれます。よく、どうしてよいかわからなくなるとか、コーディングがうまくいかないという知らせを受けたとき、社員にもっと時間をかけなさいとか、もっと注意深くやりなさいと諭すのも1つのやり方でしょう。それでうまく行くときもあります。しかし、自動化のツールを使えば、効果的な処理を体系的に作り上げることができます。
自動化すれば、単にエラーを減らすこと以上のことが実現できるのです。文書の中身の生成や処理を自動化すると、カスタマイズとかサービス品質の向上といった新しい可能性が開けます。以下の参考文献の中から、皆さんの置かれた状況にふさわしいものを選択し、皆さんの組織ですでに多くの時間が割かれてきている問題の解決に役立ててください。そして、もっと面白くて実りのある課題に取り組んでください。
参考文献
-
Rich Text Format (RTF) Specification, version 1.6 は、マイクロソフトが1999年から公開している文書です。
-
Antiword は、LinuxおよびRISCオペレーティング・システム向けの無料のMS Word読み取りツールです。UNIXの商用ディストリビューションの中には、一般によく使われているWindowsのファイル・フォーマットの所有権ありの読み取りツールを含めているものもあります。これらのツールは、Linuxでは利用できませんので、本稿では、これ以上言及しません。
-
wvWare は、Word文書を変換するためのライブラリーです。
- Read Cameronの記事サーバーでのPDF活用 (developerWorks、2002年9月)。
-
CPANのRTF のディレクトリーには、RTF文書の解析や生成を行うためのPerlモジュールが掲載されています。作者のRobert Rothenbergは、「実験的」とか「アルファ」と称していますが、実稼働環境でも充分使用できる作品です。
-
Docserver は、
.DOC や関連するフォーマットを、より標準的なテキスト・フォーマットにレンダーするためのPerlでコーディングされているアプリケーションです。ネットワーク経由でアクセス可能なWindowsホスト上にMicrosoft Officeを (ライセンスを得て) インストールしてある必要があります。
-
Open Officeのホームページ およびStar Officeのホームページから、
.DOC および.RTF を扱うためのたくさんの情報をたどっていくことができます。
-
UNO Development Kit Project には、OpenOfficeでのスクリプティングの方法が説明されています。詳細については、UNO技術文書 を参照してください。
-
Zope は、Pythonを使ってコンテンツ管理を行っている人気のあるアプリケーション・サーバーです。
-
Windward Reports は、
.RTF->{XML,TXT,HTML,...} の変換機能を備えたJavaコードによる商業製品です。Windwardは、FO準拠 (xsl:fo) ではありません が、外見的には、それと同様の働きをします。
- 「XSL-FOを使って文書を印刷用に加工する」は、FOを紹介するとともに、FOを使ってRTFの処理が可能であることについて触れています (developerWorks、2001年11月)。
- developerWorks のLinuxゾーンには、他にもLinux開発者向けの参考文献が多数掲載されています。
著者について  | 
|  | Cameronは、Phaseit, Inc. の常勤のコンサルタントです。オープン・ソースなどの技術的なトピックについて、数々の執筆や発言を行っています。Cameronのメール・アドレスはclaird@phaseit.net です。 |
記事の評価
|