プログラム研究室
第3回 リッチテキストの変換
リッチテキストおさらい

Wikipediaに拠れば、リッチテキストは「Rich Text Format (RTF, リッチテキストフォーマット) は、文書ファイルフォーマットの1つ。交換・編集可能なクロスプラットフォームの文書フォーマットとして1987年からマイクロソフトにより開発され、仕様の策定が進められた。」とある。2007年1月時点でMicrosoft RTF1.9仕様まで公開されている。

RTFファイルは通常 7-bit ASCIIのプレーンテキストで、制御語(control words), 制御記号(control symbols)及びその組み合わせから成る。制御語の基本構成はこうなっている。

\(ASCII Letter Sequence)(Delimiter)

.お決まりのHello world!は以下のような表記になる。

{\rtf
Hello {\b world!}\par
}

日本語の文字はシフトJISコードをASCII形式で表した表記法が用いられる。たとえば、ハローワールドは、

{\rtf
\'83\'6e\'83\'8d\'81\'5c {\b \'83\'8f\'81\'5c\'83\'8b\'83\'68}\par
}

と表記される。さらにハローワールドにしたい場合は、rgb値を示すカラーテーブルを用意し

{\rtf
{\colortbl ;\red255\green0\blue0;}
\cf1
\'83\'6e\'83\'8d\'81\'5c\
cf0
{\b \'83\'8f\'81\'5c\'83\'8b\'83\'68}\par
}

となる。一部2バイト文字の扱いなどは異なるが、九日亭さんのヘルプファイルの作り方の中のトピックファイルの作成の項がまさに基本的なリッチテキストの説明になっている。ただ、この程度で済むならrtfからのデキスト抽出は容易だ。だが、表やら箇条書きなど複雑なレイアウトや文字コードの問題も絡んでくると意外に面倒な処理であることがわかってくる。

リッチデキストは意外に手強い

Delphiでリッチテキストファイルからテキストだけを取り出したい時、どうするか...、思いつくのは

  1. リッチエディトコントロールに読み込んでテキストを取得
  2. 自力でrtfのパーサを作成
  3. 他人の書いたライブラリを利用
1はよく使われる手だが、テキストを取り出しにビジュアルコントロールを使用するのはどうもエレガントでない。2は「根気があればきっとできるから、やれるひとはやってね」だ。なるべく他人の褌で相撲をとりたい私は、3の方法を採用。「リッチテキスト」をキーワードにググッてみると針谷さんのrtfconv.dllがヒットした。

rftconv.dllを使おう

rtfconv.dllはC++用で、Delphi用のWrapperなど準備されていない。そこでHeadConv 4.20を使用して、rtfconv.hをコンバートし、 Wrapperもどきを作成した。使い方は以下のとおり。

  1. rtfc641_dllをダウンロードし、解凍したら、cnswtbl.dll. mbctbl.dll, rtfconv.fll, rtifconv.lib, sbctbl.dllをパスの通ったフォルダに置く。
  2. RTFCONV.PASをダウンロードし、自分のプロジェクトに組み込み、ユニットを使う設定にする(RTFCONV.PASのソースはかなりいい加減な代物なのでCも達者な人は煮るなり焼くなり御自由に)
  3. 以下のようなコーディングで関数を呼ぶ。

    rtfconv.RtfconvA(pchar(sourcefilename), pchar(destinationfilename)), 0, 932, 0); //変換元:リッチテキストファイル(Codepage番号0、変換先:日本語Shift-JISテキストファイル(Codepage番号932)

    ここで引数はRtfconvA(pSrcFileName,pDstFileName,nSrcCodePage,nDstCodePage,RTFCONVEXINFO)

    • pSrcFileName:変換元ファイル
    • pDstFileName:変換先ファイル
    • nSrcCodePage:変換元コードページ
    • nDstCodePage:変換先コードページ
    • RTFCONVEXINFO:変換オプション構造体
    Codepageの番号については、rtfconv.pas内の330行以降のコードページ定数を参照。

rtfconvの便利な使い方

実はrtfconvはもともとrtf⇔txt変換だけでなく、対応コードは、Unicodeのほかヨーロッパ・アジアの各種コードの計116種類で、以下のような多彩なコード変換ができる信じられないぐらい多機能なライブラリだ。

最後に

rtfconv.dllの作者の針谷先生は国学院大学文学部の準教授をされている。お忙しいお仕事の傍らこのようなライブラリを作成、公開いただき心から感謝したい。リッチテキストもいずれXML的なものに吸収されていく運命にあるのだろうか。