PowerPoint MS-PPT バイナリ ファイル形式の理解

**概要:**Microsoft PowerPoint 製品の以前にリリースされたバージョンで使用する MS-PPT バイナリ ファイル形式について説明します。基本構造、およびプログラムによる PowerPoint の操作に関する主要概念が含まれます。

適用対象: Office 2007 | Office 2010 | PowerPoint 2010 | VBA

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

公開:   2011 年 2 月

提供元:   Microsoft Corporation

目次

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

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

  • PowerPoint ファイルからのコンテンツの抽出

    • PowerPoint ファイルからのテキストの取得

    • PowerPoint ファイルからのスライドの取得

    • MS-PPT ファイル形式の元に戻す履歴

  • まとめ

  • その他の技術情報

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

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

MS-PPT バイナリ ファイル形式は、Microsoft Office PowerPoint 2003、Microsoft PowerPoint 2002、Microsoft PowerPoint 2000、および Microsoft PowerPoint 97 で使用されます。このファイル形式は、現在のユーザー ストリームから始まります。次に PowerPoint ドキュメント ストリームおよび画像ストリームが続き、さらにオプションとして、概要情報、カスタム XML データ、およびデジタル署名の各ストリームが続きます。実際のコンテンツのほとんどは、PowerPoint ドキュメント ストリーム内のスライド コンテナーに存在します。現在のユーザー ストリームには、ユーザー、バージョン、およびシステム データを保持する現在のユーザー アトムが含まれます。画像ストリームには、画像を表示するスライド コンテナーから参照される埋め込み画像が含まれます。この形式のデータの最小単位は、レコードです。

ファイル データはユーザー編集によって順次格納されます。つまり、ファイルの現在のバージョンのみを再作成する場合、最後のユーザー編集のコンテンツのみを抽出できます。それ以前のデータは必要ありません。同様に、ファイルの以前のバージョンを取得するには、ストリーム内の以前のユーザー編集に移動します。

注意

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

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

以下に, .ppt ファイルの重要なメイン構造を示します。すべての構造は、特に指定がない限り、PowerPoint ドキュメント ストリーム内に存在します。

  • CurrentUserAtom

    ファイルを変更した最後のユーザーに関する情報のほか、最新の user edit が配置されている場所を指定する atom record。これは、CurrentUser stream 内の唯一のレコードです。

  • UserEditAtom レコード

    UserEditAtom には、現在の編集の PersistDirectoryAtom レコードへのポインター、以前の UserEditAtom レコードへのポインターなど、各種情報が含まれます。

  • PersistDirectoryAtom レコード

    PersistDirectoryAtom レコードには、"永続オブジェクト ディレクトリ" が指定されます。これは、永続オブジェクト識別子と、永続オブジェクトが含まれる場所へのストリーム オフセットのテーブルです。各ユーザー編集には、永続オブジェクト ディレクトリが格納されます。この永続オブジェクト ディレクトリでは、新しい永続オブジェクトと変更された永続オブジェクトのすべてを確認できる場所が特定されます。

  • PersistDirectoryEntry 構造

    PersistDirectoryEntry 構造は PersistDirectoryAtom レコードの一部であり、たとえば、persistDirEntry[0], persistDirEntry[1] のように増分されます。これには、連続的な永続オブジェクト識別子と、関連付けられた永続オブジェクトへのストリーム オフセットの、圧縮されたテーブルが指定されます。

    最初の 20 ビットは、永続オブジェクトの ID を表します。次の 12 ビットは、currentPersistDirectoryEntry 構造内にある永続オフセット エントリの数を表します。PersistDirectoryEntry 構造の残りは、オフセット エントリで構成されます。各オフセット エントリでは 4 バイトが使用されます。複数の PersistOffsetEntry 構造がある場合、以降の各エントリでは、永続オブジェクトと、前のエントリよりも 1 つ大きい ID が適用されます。

  • DocumentContainer 構造

    これは、ドキュメントに関する情報を指定するコンテナー レコードです。これには、スライド、メモ、サウンド、グラフィカル要素、およびその他のコンテンツのリストが含まれます。現在の編集のすべてのアウトライン テキストは、DocumentContainer 構造のスライド リストに格納されます。図形内のテキストは、Shapes レコードに格納されます。

  • MainMasterContainer 構造

    これは、メインのマスター スライドを指定するコンテナー レコードです。メインのマスター スライドには、プレゼンテーション スライドの書式と何らかのコンテンツ (テンプレート グラフィックなど) が定義されます。

  • SlideContainer 構造

    これは、プレゼンテーション内のスライド用のコンテナー レコードです。これには、切り替え設定、ヘッダーとフッター情報、グラフィック要素のポインターと書式設定のほか、スライド レイアウトで使用されるプレースホルダーの図形を指定する SlideAtom 構造が含まれます。

  • SlideListWithTextContainer 構造

    SlideListWithTextSubContainerOrAtom レコードのリストを指定する SlideWithTextContainer 構造。各レコードには、プレゼンテーション スライドへの参照、プレゼンテーション スライドに含まれるテキストのレコードが含まれます。

  • TextCharsAtom 構造および TextBytesAtom 構造

    これらは、テキスト文字を含む 2 種類の SlideListWithTextSubContainerOrAtom レコードです。各レコードには、8 バイトのレコード ヘッダーがあり、その後に一連の Unicode 文字または部分的な Unicode 文字が続きます。

  • DrawingGroupContainer 構造

    これは、イメージ、ワードアート、およびその他のグラフィカル コンテンツを指定する DocumentContainer 構造の一部です。

  • RecordHeader 構造

    RecordHeader 構造は、ファイル内の各コンテナー レコードとアトム レコードの先頭にある 8 バイトの構造です。これには、recVer、recInstance、recType、および recLength の 4 つのフィールドが含まれます。後の 2 つが最も重要です。recType フィールドには、現在のレコードの種類が指定されます。recLen フィールドは、バイト単位の長さを表します。

PowerPoint ファイルからのコンテンツの抽出

MS-PPT ファイル形式を使用する PowerPoint ドキュメントからコンテンツを抽出する方法は、取得するコンテンツの種類と取得する条件によって異なります。1 または 2 ページのコードを使用して, .ppt ファイルからすべてのテキストを無差別に取得できますが、その方法では、書式設定、グラフィック、切り替えや、スライドの境界さえも維持されません。同様の技法を使用して、たとえば、すべてのクリップ アートを抽出できます。ただし、それはこの記事の範囲外です。スライドごとにコンテンツを取得するには、PersistDirectoryEntry レコードを読み取って現在の編集を特定する必要があります。

PowerPoint ファイルからのテキストの取得

PowerPoint プレゼンテーションからプレーン テキストを取得するには

  1. PowerPoint ドキュメント ストリームを開きます。

  2. レコードごとに以下の処理を行います。

    1. レコード ヘッダーを読み取ります。

    2. recType フィールドが TextCharsAtom (0x0FA0) または TextBytesAtom (0x0FA8) の場合、レコードの残りをテキストとして読み取ります。

PowerPoint ファイルからのスライドの取得

理論上は、プレーン テキストの取得と同じ方法で、スライド デッキを再構築できます。たとえば、recType = DocumentContainer/SlideContainer/NotesContainer/ のレコード ヘッダーを確認します。ただし、この方法では、あらゆる編集状態のアクティブなスライドと古いスライドの乱雑なコレクションが返され、それらを区別することができません。ただし、persist オブジェクト ディレクトリの構築から始めた場合、現在のすべてのコンテンツへのポインターが得られ、古いコンテンツが得られることはありません。

PowerPoint ファイルからスライドとそのコンテンツを取得するには

  1. persist オブジェクト ディレクトリを作成します。

    1. データ構造 (辞書など) を作成し、リンクするデータの 2 つの列を保持します。1 つ目の列は、永続オブジェクト ID 用の列です。2 つ目は、ストリーム内で永続オブジェクトが配置されている場所を示すオフセット用の列です。

    2. CurrentUser ストリームから CurrentUserAtom 構造を読み取ります。CurrentUserAtom 構造のバイト 16 ~ 19 には、offsetToCurrentEdit フィールドが指定されます。

    3. PowerPoint ドキュメント ストリームを開き、CurrentUserAtom.offsetToCurrentEdit フィールドに指定されたオフセットから UserEditAtom 構造を読み取ります。バイト 16 ~ 19 には、offsetLastEdit フィールドが指定され、バイト 20 ~ 23 には、offsetPersistDirectory フィールドが指定されます。

    4. UserEditAtom.offsetPersistDirectory フィールドに指定されたオフセットから PersistDirectoryAtom 構造を読み取ります。

    5. ID 値と各 PersistDirectoryEntry 構造のオフセットを使用して、作成したデータ構造にデータを挿入します。PersistDirectoryEntry 構造に複数のオフセットがある場合、以降の各オフセットに、テーブル内の直前の ID よりも 1 つ大きい ID 値を割り当てます。

    6. UserEditAtom.offsetLastEdit フィールドに指定された PowerPoint ドキュメント ストリーム内のオフセットに移動し、そこから始まる UserEditAtom 構造を読み取ります。

    7. ユーザー編集がなくなるまで、前の 3 つの手順を繰り返します。ID 値がテーブル内の既存の ID 値と競合する永続ディレクトリ エントリは無視します。その永続ディレクトリ エントリは上書きされたスライドを表すためです。

  2. 永続オブジェクト ディレクトリに移動し、指定された各オフセットの位置のレコード ヘッダーを確認して、種類 = RT_Document の各レコードを読み取ります。これは DocumentContainer 構造です。

  3. DocumentContainer 構造内で、スライド リスト (rh.recType = RT_SlideListWithText のレコード) を探します。これは、SlideListWithTextSubContainerOrAtom エントリの配列を含む SlideListWithTextContainer レコードです。

  4. スライド リストを読み取ります。各 SlidePersistAtom 構造 (種類 = rh.RT_SlidePersistAtom) の後に、そのスライドのコンテンツを含むレコードが続きます。rh.recType = RT_TextCharsAtom または rh.recType = RT_TextBytesAtom のレコードには、テキストが含まれます。

  5. スライド リスト内の SlidePersistItem 構造ごとに、対応するテキスト コンテンツを使用してスライドを作成します。

メモ、ヘッダーとフッター、書式設定情報など、他のスライド コンテンツに対して、同じ方法を使用できます。

MS-PPT ファイル形式の元に戻す履歴

MS-PPT バイナリ ファイル形式には連続的な特性があるため、PowerPoint ファイルの以前のバージョンを簡単に復元できます。

PowerPoint ファイルの以前のバージョンを取得するには

  1. PowerPoint ファイルのコピーをメモリに読み込みます。

  2. メモリ内のコピーで、CurrentUser ストリームから CurrentUserAtom レコードを読み取ります。

  3. PowerPoint ドキュメント ストリーム内で、CurrentUserAtom.offsetToCurrentEdit フィールドに指定されたオフセットから UserEditAtom 構造を読み取ります。

  4. UserEditAtom.offsetLastEdit フィールドに指定されたオフセットから、以前の UserEditAtom 構造を読み取ります。

  5. 以前の UserEditAtom 構造の後のすべてを削除します。

  6. CurrentUserAtom.offsetToCurrentEdit フィールドの値を更新します。

  7. 変更されたファイル名を使用してファイルを保存します。以前の既知のバージョンに到達するには、適切な UserEditAtom 構造に達するまで、バックトラックを続行できます。

まとめ

これは、MS-PPT 形式の単なるサンプリングです。この記事で提供されたツールを使用して、簡単なデータ復元を行うことができます。さらに探索することで、メディア、書式設定情報、および他のメタデータの復元を開始し、最終的に保存操作まで徐々に発展することができます。

その他の技術情報

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