Word MS-DOC バイナリ ファイル形式について

要約: レガシ Microsoft Word 製品で使用する MS-DOC バイナリ ファイル形式について説明します。基本構造、およびプログラムによる操作に関する主要概念が含まれます。

適用対象: Office 2007 | Office 2010 | Open XML | Visual Studio Tools for Microsoft Office | Word | Word 2007 | Word 2010

この記事の内容
MS-DOC ファイル形式の概要
まとめ
その他の技術情報

公開:   2011 年 2 月

提供元:   Microsoft Corporation

目次

  • MS-DOC ファイル形式の概要

  • MS-DOC ファイル形式の主要なコンポーネント

  • Word ファイルからテキストを抽出する

  • まとめ

  • その他の技術情報

この記事では、MS-DOC ファイルの構造と、MS-DOC ファイルを操作するいくつかの手順について説明します。この記事は、Microsoft Office 製品で使用されるバイナリ ファイル形式について紹介する記事シリーズの一部です。これらの記事は、MSDN で入手できる Office File Format Documents と組み合わせて使用するように設計されています。

MS-DOC ファイル形式の概要

Microsoft Office Word 2003、Microsoft Word 2002、Microsoft Word 2000、および Microsoft Word 97 は、すべて、既定のファイル形式として MS-DOC バイナリ ファイル形式を使用します。このファイル形式は, .doc または .dot 拡張子を持つファイルが該当します。Word ドキュメントのデータの基本的な単位は、文字です。文字には、ANSI、Unicode、その他の非表示文字が含まれ、書式設定がされることもあります。すべての文字データは、Word ドキュメント ストリームに含まれます。そのストリームの最初に、ファイル内のすべてのデータへのポインターを含むファイル情報ブロック (FIB) と呼ばれる構造があります。

注意

Microsoft Word では、ほとんどのプログラミング タスクの実行方法として、Word プライマリ相互運用機能アセンブリを使用することをお勧めします。これは、Microsoft Word で作業するための完全なオブジェクト モデルを提供する一連の .NET クラスです。この一連の記事では、Microsoft Word がインストールされない場所など、高度なシナリオについてのみ説明します。

MS-DOC ファイル形式の主要なコンポーネント

以下は, .doc ファイルを使用する際に知る必要がある、最も重要な構造です。

  • 2.1.1 WordDocument Stream

    Word ドキュメント ストリームは .doc ファイルの主要なストリームで、ファイル内のすべてのデータが含まれます。ただし、表は「1Table stream or 0Table stream」に保存されます。

    • File Information Block

      ファイル情報ブロックは、Word ドキュメント ストリームのオフセット 0x00 から始まります。ファイル内の、その他のすべてのデータの場所を指定します。場所は整数のペアによって指定されています。最初の整数は場所を指定し、次の整数はサイズを指定します。これらの整数は、FibRgFcLcb97 のような、ファイル情報ブロックの基礎に表示されます。場所の名前には、fc というプレフィックスが付加されます。サイズの名前には、lcb というプレフィックスが付加されます。

    • Clx 構造

      Clx 構造は、0 以上の Prc 構造と、それに続く Pcdt 構造の配列です。前者にはプロパティ情報、後者には PlcPcd 構造がそれぞれ含まれます。

  • Character

    文字には、テキスト文字と、段落記号やオブジェクト アンカーのような非テキスト文字があります。サイズは、ANSI、Unicode、または制御文字のような種類によって異なります。ドキュメント内では隣接している文字でも、バイナリ ファイルでは隣接していないことがあります。

    • Character Position (CP)

      文字位置 (CP) は、ドキュメント テキストでの文字のインデックス位置を示す、署名のない、32 ビットの整数です。

    • Pcd 構造

      Pcd 構造は、Word ドキュメント ストリーム内でのテキストの位置とテキストのプロパティを指定します。

  • Plc

    PLC 構造は、CP の配列と、それに続くデータ要素の配列から構成されます。Plc 構造には、さまざまな名前があり、それぞれ異なる機能を持っています。たとえば、Plcbkf 構造は、ブックマークとブックマークへのポインターから構成されます。

  • PlcPcd 構造

    PlcPcd 構造は、CP の配列を Pcd 構造にマップする PLC 構造です。言いかえれば、ストリーム内での文字の位置を、ドキュメント テキスト内での文字にマップします。

Word ファイルからテキストを抽出する

テキストを取得する正式なアルゴリズムは、MSDN の Open Specification ドキュメントの、「2.4.1 Retrieving Text」で公開されています。「例」のセクションの「3.1 Example of a Clx」で、その過程の一部の例を示しています。以下は、単純化した過程です。

Word ドキュメントからテキストを抽出するには

  1. .doc ファイルをデータ ストリームに読み取ります。

  2. Word ドキュメント ストリームのオフセット 0 から、ファイル情報ブロック (FIB) の読み取りを開始します。詳細は、「2.5.15 How to read the FIB」を参照してください。

  3. ファイル情報ブロック内部の、FibRgFcLcb97 構造を参照します。この構造は、FIB の 154 バイト目から開始します。一連の 4 バイトのフィールドから構成されます。

  4. 268 バイト目の FibRgFcLcb97.fcClx フィールド、272 バイト目の FibRgFcLcb97.lcbClx フィールドを読み取ります。これらは Clx のオフセットされた場所とサイズを指定します。

  5. FibRgFcLcb97.fcClx フィールドで指定されたオフセット値で、テーブル ストリームから Clx 構造の読み取りを開始します。

  6. Clx 構造の内部で、Prc 構造の可変長 .RgPrc 配列の直後に続く Pcdt を参照します。

    配列の各メンバーについて、以下を行います。

    1. Prc 構造の 0 バイト目の .clxt 属性を読み取ります。.clxt = 0x02 の場合、Pcdt が見つかります。

    2. .clxt = 0x01 の場合、次の 2 バイトを符号付き整数として読み取り、そのバイト数だけ進んで、配列の次のメンバーに行きます。

  7. Pcdt 構造内部で、Pcdt の 5 バイト目から開始する PlcPcd 構造を参照します。

  8. PlcPcd.aPcd 配列と PlcPcd.aCp 配列を読み込みます。これらの配列のメンバーは、インデックス値により、1 対 1 で対応します。

  9. PlcPcd.aPcd 内の各 Pcd 構造で、以下を行います。

    1. 現在の Pcd 構造の 46 ビット目で Pcd.Fc.fCompressed フィールドの値を読み取ります。これが 0 の場合、Pcd 構造は 16 ビット Unicode 文字を示します。1 の場合、8 ビット ANSI 文字を示します。

    2. 現在の Pcd の 2 ~ 5 バイトの Pcd.Fc の値と、対応する CP 値を読み取ります。

      • Unicode の場合、現在の CP 値で指定された文字位置にあるテキストは、Word ドキュメント ストリームの Pcd.Fc の値と同じオフセットで始まり、1 文字ごとに 2 バイトを占めます。

      • ANSI の場合、現在の CP のテキストは、Pcd.Fc の値の半分のオフセット値で始まり、1 文字ごとに 1 バイトを占めます。

      どちらの場合も、現在の CP で指定された文字の数は、配列内の次の CP の値から、現在の CP の値を引いた値になります。

まとめ

この記事は、MS-DOC 形式の単なるサンプルです。この記事で提供されたツールを使用して、簡単なデータ復元を行うことができます。より詳細な情報を使うと、書式設定情報とその他のメタデータの復元から、保存操作まで行えるようになります。

その他の技術情報

詳細については、次のリソースを参照してください。