バイナリの PowerPoint MS-PPT ファイル内のグラフィックの検索
概要: バイナリの MicrosoftPowerPoint (.ppt) ファイル内にあるビットマップ、図面、ワードアート、およびその他のグラフィックを検索する方法について説明します。
適用対象: Office 2007 | Office 2010 | PowerPoint | PowerPoint 2010 | VBA
この記事の内容
概要
構造と手順
まとめ
その他の技術情報
公開: 2011 年 5 月
提供元: Microsoft Corporation
目次
概要
構造と手順
.PPT ファイルからビットマップ イメージを抽出するには
.PPT ファイルから図面を抽出するには
スライド内にあるビットマップを検索するには
まとめ
その他の技術情報
概要
MS-PPT バイナリ ファイル形式 (.ppt) は、Microsoft OfficePowerPoint 2003、Microsoft PowerPoint 2002、Microsoft PowerPoint 2000、および Microsoft PowerPoint 97 で使用されます。この記事の手順を使用して, .ppt ファイルからのイメージまたは図面の抽出、およびスライド内にあるビットマップの検索を行います。
バイナリ ファイルからイメージを直接抽出することで、PowerPoint アプリケーションを開かずに特定のイメージの多くのファイルをすばやくスキャンできます。その後、ファイルへの変更を最小限に抑えて、イメージを完全に削除したり、同じサイズの別のイメージでイメージを置き換えたりできます。たとえば、著作権で保護されたイメージのすべてのインスタンスをファイル セットから削除したり、会社のロゴのすべてのインスタンスを更新したりできます。
図面の置き換えはイメージの置き換えよりも困難ですが、スライド内のどの場所にイメージが表示されるかを把握するには、そのイメージを固定する図形オブジェクトを検索する必要があります。1 つのワードアートのテキストの編集など、図面または図形にプロパティの変更を加える作業は、図面または図形がメモリ内で同じサイズで残る場合、簡単に行うことができます。そうでない場合は、現在の編集内のレコード ヘッダーを更新して、図面または図形の新しいメモリ割り当てを反映する必要があります。
注意
Microsoft PowerPoint では、ほとんどのプログラミング タスクの実行方法として、PowerPoint プライマリ相互運用機能アセンブリを使用することをお勧めします。これは、Microsoft PowerPoint で作業するための完全なオブジェクト モデルを提供する一連の .NET クラスです。この一連の記事では、Microsoft PowerPoint がインストールされない場所など、高度なシナリオについてのみ説明します。
構造と手順
.ppt ファイル内にあるベクターベースのすべてのグラフィカル要素は、PowerPoint ドキュメント ストリームの DrawingContainer オブジェクト内に図面として格納されます。この要素には、クリップ アート、ワードアート、およびスケーラブルな図形と線で構成されるあらゆる図面または図が含まれます。ビットマップは、画像ストリーム内に "BLIP (Binary Large Images or Pictures)" として集中的に格納され、そのビットマップを表示する図面によって参照されます。図面と BLIP では MS-ODRAW ファイル形式が使用されます。これは、Microsoft Excel、Microsoft PowerPoint、および Microsoft Word で共有されるグラフィカル形式です。
注意
PowerPoint ドキュメント内のすべてのレコードは、特に指定がない限り、8 バイトのレコード ヘッダーで始まります。第 3 と第 4 バイトはレコードの種類を示し、最後の 4 バイトはレコードの長さを示します。この情報を使用して、目的のレコードを特定し、残りをスキップできます。
.PPT ファイルからビットマップ イメージを抽出するには
画像ストリームを開きます。
このストリームには、ユーザーがファイルにコピーしたあらゆる埋め込みビットマップ イメージが一連の OfficeArtBStoreDelay レコードとして含まれます。OfficeArtBStoreDelay レコードは、OfficeArtBStoreContainerFileBlock レコードの純粋な配列であり、このレコードに、レコード ヘッダーまたは他のフィールドは含まれません。
配列内の OfficeArtBStoreContainerFileBlock レコードごとに、次の手順を実行します。
レコード ヘッダーのバイト 2 および 3 を読み取ってレコードの種類を取得します。
レコードの種類 = OfficeArtBlip(0xF018-0xF117) の場合、引き続き、この手順の次のステップを実行します。
レコードの種類 = OfficeArtFBSE(0xF007) の場合、以下の処理を行います。
最初の 20 バイトをスキップします。
次の 4 バイトを読み取ります。これは、符号なしの整数としてビットマップのサイズを表します。
次の 12 バイトをスキップします。
.name フィールドを読み取ります。これは、 Null で終了する可変長の Unicode 文字列であり、ビットマップの名前を表します。
次のフィールドは、.embeddedBlip です。これは、OfficeArtBlip レコードです。
OfficeArtBlip レコードのレコード ヘッダーを読み取ります。バイト 2 および 3 には、イメージが独立して保存された場合にイメージが持つファイルの種類が指定されます。レコード ヘッダーの最後の 4 バイトは、レコードの残りの長さを示します。どの種類の値がどのファイルの種類に対応するかについては、[MS-OGRAPH] 仕様の「section 2.2.23」を参照してください。
OfficeArtBlip レコードの残りは、実際のビットマップ イメージ データです。レコード ヘッダーで指定されたファイルの種類としてイメージを保存します。
.PPT ファイルから図面を抽出するには
「PowerPoint MS-PPT バイナリ ファイル形式の理解」の「PowerPoint ファイルからのスライドの取得」の手順の最初の部分で説明されているとおりに、永続オブジェクト ディレクトリを作成します。
永続オブジェクト ディレクトリ内で、指定された各オフセットの位置のレコード ヘッダーを確認し、各レコード ヘッダーを読み取ります。
rh.RecType が RT_Document(0x03E8) の場合、これはドキュメント コンテナーです。rh.recType が RT_DrawingGroup(0x040B) のレコードが見つかるまで、その子の各コンテナーのレコード ヘッダーを確認します。
これは、ファイルの図面グループ コンテナーです。このコンテナーの位置をメモしております。
rh.recType が RT_MainMaster(0x03F8) または RT_Slide(0x03EE) の場合、以下の処理を行います。
rh.recType が RT_Drawing(0x040C) のレコード ヘッダーについて、子の各レコードを確認します。
「Office バイナリ ファイル形式のグラフィックの理解」の「gg985447(v=office.14).md」の手順で説明されているとおりに、レコードを解析します。
スライド内にあるビットマップを検索するには
「.PPT ファイルからビットマップ イメージを抽出するには」の手順に説明されているとおりに、ファイルのビットマップを抽出し、OfficeArtBStoreDelay.rgfb 配列内の各 OfficeArtBStoreContainerFileBlock レコードの位置を記録します。
「.PPT ファイルから図面を抽出するには」の手順に説明されているとおりに、ファイルの図面を解析します。どのスライドにビットマップが含まれているかを認識している場合は、その 1 つのスライドの図面のみを解析できます。
ビットマップの各図形を確認します。
現在の図形を表す OfficeArtSpContainer レコードの子ごとに、レコード ヘッダーをスキャンして、rh.RecType = OfficeArtFOPT(F00B) のレコードがあるかどうかを確認します。OfficeArtFOPT は、図形のプライマリ オプション属性です。
プロパティ テーブルで構成される、OfficeArtFOPT レコードの残りを読み取ります。
プロパティ テーブルの種類は OfficeArtRGFOPTE であり、このテーブルにレコード ヘッダーは含まれません。プロパティ テーブルは、6 バイトの OfficeArtFOPTE プロパティ テーブル エントリの配列で構成され、複雑なデータの場合は、これに可変サイズのフィールドが続きます。
opid.fBid 属性 (ビット 14) = 0x1 のエントリが見つかるまで、プロパティ テーブルの各エントリを読み取り、次の 4 バイトを符号なし整数として読み取ります。この整数には、対応するビットマップを含む OfficeArtBStoreContainerFileBlock レコードの OfficeArtBStoreDelay.rgfb 配列内の位置が指定されます。
特定の図形に対して opid.fBid = 0x1 のプロパティ テーブル エントリがない場合、その図形に関連付けられるビットマップはありません。
まとめ
この記事では、バイナリ形式の PowerPoint (.ppt) ファイルから画像および図形を抽出するための基本プロセスについて説明しました。このプロセスに基づいて、図面とビットマップの大規模ファイル セットをスキャンし、それらにタグを設定できます。また、それらを更新バージョンで置き換えることもできます。
その他の技術情報
詳細については、次のリソースを参照してください。