Office バイナリ ファイル形式のグラフィックの理解
概要: この記事では、OfficeArt とも呼ばれる MS-ODRAW バイナリ ファイル形式について説明します。このファイル形式は、現在および以前の Microsoft Office 製品に描画オブジェクトを格納するために使用されます。
適用対象: Excel 2010 | Office 2007 | Office 2010 | Open XML | PowerPoint 2010 | SharePoint Server 2010 | VBA | Word 2010
この記事の内容
MS-ODRAW ファイル形式とは
MS-ODRAW ファイル形式内の構造
バイナリ ファイルからのアートの抽出
まとめ
その他の技術情報
提供元: Microsoft Corporation
目次
MS-ODRAW ファイル形式とは
MS-ODRAW ファイル形式内の構造
図面グループ
図面
図形
図形の種類
座標とグループ化
ルール
ビットマップ
プロパティ
バイナリ ファイルからのアートの抽出
図形と図形グループ
プロパティ
ビットマップ
まとめ
その他の技術情報
この記事では、MS-ODRAW バイナリ ファイル形式の要素について説明するほか、バイナリ ファイルからアート コンテンツを抽出する方法を示す例について説明します。この記事の目的は、バイナリ ファイルに対して実行できるいくつかの実際の作業を示すこと、および詳細の探求に役立つ、形式の基礎を読者が理解できるようにすることです。この記事の後に、Microsoft Office 製品で使用されるバイナリ ファイル形式について紹介する一連の記事が続きます。これらの記事は、Microsoft MSDN で入手できる open file format specifications と共に使用するように設計されています。
MS-ODRAW ファイル形式とは
OfficeArt としても知られる [MS-ODRAW]: Office Drawing Binary File Format は、図面要素 (画像、図形、ワードアートなど) およびそれらに関連付けられる書式設定を格納するために Microsoft Office アプリケーションで使用されるバイナリ ファイル形式です。これらの要素は、他の図面や、グラフ、図、テーブル、およびコントロールに含めることができます。また、ファイル内に自己完結型コンポーネントとして含めることもできます。
MS-ODRAW 形式では、Microsoft Word などのホストプログラムで作成されたファイルに描画オブジェクトが格納されます。この描画オブジェクトは、MS-OGRAPH 形式で定義されたチャート、グラフ、またはテーブルのコンテキストに含めることができます。MS-OGRAPH 形式もホスト ファイルの内部に格納されます。MS-ODRAW ファイルはありません。
この形式、および Microsoft Word、Microsoft PowerPoint、Microsoft Excel、および Microsoft Outlook で使用されるファイル形式はすべて、MSDN ライブラリの「Open Specifications/Data Portability/Microsoft Office File Formats/Microsoft Office File Format Documents」で包括的にドキュメント化されています。この場所から、ファイル形式の完全な仕様を MSDN サイトで直接開くか, .pdf ファイルとして開くことができます。
注意
Microsoft Office では、ほとんどのプログラミング タスクの実行方法として、Office プライマリ相互運用機能アセンブリを使用することをお勧めします。これは、Microsoft Office で作業するための完全なオブジェクト モデルを提供する一連の .NET クラスです。この一連の記事では、Microsoft Office がインストールされない場所など、高度なシナリオについてのみ説明します。
MS-ODRAW ファイル形式内の構造
描画オブジェクトは、一連のレコードで構成されます。この一連のレコードには別のレコードが含まれる場合があります。別のレコードが含まれるレコードを "コンテナー" と呼びます。一方、データを保持するレコードを "アトム" と呼びます。すべてのレコードは、共通の Record Header を共有します。これには、レコードの種類と長さが指定されます。レコードのヘッダーにはアトム レコードで使用されるフィールドも含まれます。これには、同じコンテナ内の他のアトムと区別するためのバージョンとインスタンスが指定されます。
レコードは共通のヘッダーを共有します。したがって、目的のレコードが見つかるまで各ヘッダーの recType および recLen フィールドのみを読み取ることで、レコードを選択的に解析できます。また、一意の recType 値を作成することで、自分のアプリケーションのみに適用するカスタム レコードの種類を定義できます。ホスト アプリケーションは、このようにして、ドキュメントに図面要素を配置し、関連付けられたテキストをレンダリングします。
以下のセクションでは、ホスト ドキュメント内のオブジェクト コンテナー階層の構造、およびさまざまなグラフィカル要素に適用されるいくつかの主な構造について説明します。図、およびオブジェクト コンテナー階層の詳細については、MS-ODRAW 仕様の「1.3 Structure Overview (Synopsis)」を参照してください。
図面グループ
グラフィカル要素を含む各ホスト ファイルには、1 つの "図面グループ" が含まれます。これは、ファイル内のすべての図面をホストします。図面は個々の描画オブジェクトに格納されます。描画オブジェクトは図面グループ自体に格納されませんが、図面グループに論理的に関連付けられます。図面グループには、"プロパティ テーブル" が含まれます。これには、新しい図形用の既定値が格納されるとともに、ファイル内で使用されるすべての静的イメージが含まれる "BLIP ストア" が格納されます。個々の図面は、画像データの重複を減らすために、中央の場所からこれらのイメージを参照します。
図面グループは、OfficeArtDggContainer レコードに指定されます。
図面
描画オブジェクトは、クリップ アート、ワードアート、ベン図内の図形グループなど、ホスト ドキュメント内の完全なグラフィカル要素を表します。描画オブジェクトには、1 つ以上の図形オブジェクト、および図面内のすべての図形に適用されるルールのコレクションが含まれます。
描画オブジェクトは、OfficeArtDgContainer レコードによって表されます。これには、共通レコードヘッダーおよび 16 バイトの図面データが含まれます。この図面データは OfficeArtFDG レコードに含まれており、図面内の図形数および図面内の最後の図形の識別子が指定されます。
また、描画オブジェクトには、図面内のコネクタ、円弧、および引き出し線に適用されるルールのコレクションが含まれるほか、次の表に示されている、図形のグループ化および削除状態に従って並べ替えられる 4 つの異なる図形コレクションが含まれます。
図面レコード内の図形コレクション
フィールド |
レコードの種類 |
説明 |
---|---|---|
deletedShapes |
削除された図形および図形グループを定義します。 |
|
groupShape |
グループ図形の図形プロパティを定義し、グループ内のすべての図形を配列として含みます。 |
|
regroupItems |
グループ化されていない図形のグループ識別子を保持します。 |
|
shape |
現在の図面の既定の図形プロパティを定義します。 |
図形
Microsoft Office アプリケーションで作成されるほとんどの図面は、図形で構成されます。個々の図形に各種プロパティがあります。このプロパティによって、図形の種類 (角丸四角形、双方向矢印など)、他の図形とのリレーションシップ、サイズ、位置、および図形のレンダリング方法に関するさまざまな詳細 (線のスタイル、塗りつぶしなど) が決まります。個々の図形は、OfficeArtSpContainer レコードで定義されます。
図形の種類
すべての OfficeArt 図形の種類は、MSOSPT 列挙に含まれます。図形を定義する OfficeArtSpContainer レコード内に shapeProp 属性があります。これは、OfficeArtFSP レコードです。OfficeArtFSP レコード ヘッダーの recInstance フィールドには、図形の種類を設定する MSOSPT 列挙値が保持されます。以下の図で、フォー ポインテッド スターをコンテナー階層内でどのように定義するかを示します。
座標とグループ化
座標とグループ化は密接に結び付けられます。図形の位置とサイズはグループ化の状態によって決まるためです。図面内のすべての図形は、OfficeArtSpgrContainer レコードで定義された最上位図形グループに含まれます。図形グループ内には、他の図形の固定先となる "グループ図形" と呼ばれるコア図形があります。この図形は表示されません。最上位図形グループは、グループ図形を定義する OfficeArtSpContainer レコードの clientAnchor 属性によって、クライアントの UI 上に配置されます。clientAnchor は、クライアント アプリケーションによって定義される OfficeArtClientAnchor レコードです。
クライアントのアンカーを基準とした相対的な位置とサイズはグループ化によって決まります。簡易図形は、最上位図形グループの直接の子として定義されます。一方、UI 内の他の図形にグループ化された図形は、下位図形グループになります。最上位グループの場合と同じように、下位図形グループは、OfficeArtSpgrContainer レコードで定義されます。このレコードは、OfficeArtSpgrContainerFileBlock レコード内の図形を定義する OfficeArtSpContainer レコードをラップします。グループ図形のサイズと位置は、OfficeArtFSPGR レコードである OfficeArtSpContainer.shapeGroup プロパティによって定義されます。子の各図形の座標は、OfficeArtChildAnchor レコードである OfficeArtSpContainer.childAnchor プロパティによって定義されます。
次の例は、似た 2 つの図形を示しています。
コンパス ローズ
フォー ポインテッド スター
コンパス ローズは、グループ化された 2 つのダイヤモンド図形の および で構成されています。一方、フォー ポインテッド スターは簡易図形であり、下位グループに含まれません。
コンパス ローズでは、ユーザーは、まず垂直のダイヤモンドを作成し、次に水平のダイアモンドを上に重ねて、それらをグループ化しました。これにより、これらの図形は下位グループ図形に入れられ、2 つのダイヤモンドは子の図形として処理されます。次の図は、この 2 つのダイヤモンドが図面コンテナー階層内のどの場所に含まれるか、およびこの 2 つのダイヤモンドの各座標がどの場所に含まれるかを示しています。
グループ図形の座標は .shapeGroup 属性に含まれます。配列内の 2 番目と 3 番目の図形 (子の図形) は、自身の座標をそれぞれの .childAnchor 属性に保持します。このグループに追加された図形も、自身の座標を .childAnchor 属性に格納します。
前の画像のフォー ポインテッド スターは、単一の図形として作成され、次の図に示されているように、最上位グループ図形の直接の子として格納されています。
ルール
1 つの図面内のコネクタ、円弧、および引き出し線はルールによって定義されます。ファイル内の各 OfficeArtDgContainer 描画オブジェクトには、OfficeArtSolverContainer インスタンスが含まれます。このインスタンスは OfficeArtSolverContainerFileBlock レコードの配列を保持します。その各レコードは、OfficeArtFConnectorRule、OfficeArtFArcRule、または OfficeArtFCalloutRule のいずれかです。
OfficeArtFConnectorRule レコードは、コネクタをどの図形に接続するか (フローチャートなど)、および図形上のどの位置にコネクタを固定するかに従って、コネクタを定義します。コネクタ ルールは、重要なメインのルールです。引き出し線ルールと円弧ルールは、適用先の引き出し線または円弧の ID を提供するだけであり、その他の情報を含みません。
コネクタ ルールが含まれる OfficeArtSolverContainer の例については、MS-ODRAW ドキュメントの「3.1.5 OfficeArtSolverContainer」を参照してください。
ビットマップ
MS-ODRAW 形式は、ビットマップ イメージを "BLIP (Binary Large Image or Picture)" として参照します。Microsoft Office ドキュメント内のビットマップは、"BLIP ストア" に集中的に格納されます。BLIP ストアは、最上位図面グループ内の OfficeArtBStoreContainer レコードです。BLIP ストアには、OfficeArtBStoreContainerFileBlock レコードの配列が含まれます。BLIP ストアのレコード ヘッダーでは、recInstance および recLen フィールドによって、OfficeArtBStoreContainerFileBlock レコードの数、およびそのレコードの合計サイズ (バイト単位) が指定されます。
各 OfficeArtBStoreContainerFileBlock レコードには、そのレコード ヘッダーの type フィールドに指定されたとおりに、OfficeArtFBSE レコードまたは最小限の OfficeArtBlip レコードのどちらかが含まれます。OfficeArtFBSE レコードは、名前、サイズ、種類、およびオフセット情報で OfficeArtBlip レコードをラップします。OfficeArtBlip レコードには、レコード ヘッダー、およびイメージの実際のビット ストリームが含まれます。
次の図は、コンテナー階層内のバイナリ イメージ データの場所を示しています。
プロパティ
プロパティは、図形とビットマップを定義します。MS-ODRAW 形式では、プロパティ テーブルにプロパティが格納されます。各図形には、OfficeArtFOPT レコード、OfficeArtSecondaryFOPT レコード、および OfficeArtTertiaryFOPT レコードで構成される、その図形のみに適用されるプロパティ用のプロパティ テーブルがあります。レコード名の "PT" は、"プロパティ テーブル (Property Table)" を意味します。また、最上位図面グループには、OfficeArtFOPT レコードと OfficeArtTertiaryFOPT レコードのみで構成される、ファイル全体に適用されるプロパティを保持するプロパティ テーブルが含まれます。最上位図面グループに定義されたプロパティは、個々の図形によって定義されないプロパティの既定値として使用されますが、個々の図形のプロパティが設定された場合、そのプロパティによって既定値は上書きされます。どちらの場所にもプロパティが設定されない場合、プロパティはシステムまたはアプリケーションの既定値に戻ります。各プロパティ テーブルのレコード ヘッダーには、プロパティの数およびレコードの長さ (バイト単位) が指定されます。
OfficeArtFOPT、OfficeArtSecondaryFOPT、または OfficeArtTertiaryFOPT レコード内には、分類された OfficeArtRGFOPTE レコードの配列があります。この各レコードは、関連するプロパティのグループを表します。レコード名の "RG" は "関連するグループ (Related Group)" を意味し、"PTE" は "プロパティ テーブル エントリ (Property Table Entry)" を意味します。個々のプロパティは、OfficeArtFOPTE レコードとして格納されます。これらのレコードにレコード ヘッダーはありませんが、これらのレコードは opid フィールドから始まります。このフィールドには、プロパティのヘッダー情報が指定されます。opid は OfficeArtFOPTEOPID レコードとして格納されます。OfficeArtFOPTEOPID レコードの最後のビット (fComplex フィールド) が 0x1 の場合、そのプロパティは複雑なプロパティです。この場合、OfficeArtFOPTE レコードの 4 バイト制限を超える情報は、親の OfficeArtRGFOPTE テーブルの complexData セクションに移動します。
バイナリ ファイルからのアートの抽出
Microsoft Office バイナリ ファイルからアートを抽出する処理は、抽出するアートの種類に一部依存し、ホスト アプリケーションに一部依存します。次の表は、各 Microsoft Office バイナリ ファイル形式で、どの構造が図面と図面グループをホストするかを示しています。
ホスト アプリケーション別の図面グループの場所
ホスト アプリケーション |
図面が含まれる構造 |
図面グループが含まれる構造 |
---|---|---|
Microsoft Excel |
||
Microsoft PowerPoint |
||
Microsoft Word |
次の手順は、ホスト アプリケーションから MS-ODRAW コンテンツを抽出する一般的な方法を示しています。この手順は、アプリケーションに関係なく実行できます。
レコード ヘッダー
MS-ODRAW 形式のすべてのレコード ヘッダーの長さは 8 バイトであり、インデックスはゼロから始まります。たとえば、3 番目のバイトはバイト 2 で、最後のバイトはバイト 7 です。バイト 2 ~ 3 はレコードの種類を表し、最後の 4 バイトはバイト単位のレコード長を表します。レコードの種類と長さを認識しておくと、レコード長に指定されたバイト数を読み取るか、その同じバイト数をスキップして次のレコードに進むかを決定できます。
図形と図形グループ
次の手順は、Microsoft Office ドキュメントで簡易図形および図形グループを再構築する方法を示しています。これには、コネクタまたは引き出し線 (これらはソルバー コンテナーに指定されます)、あるいはチャートとグラフ (これらは MS-OGRAPH 形式を使用します) が含まれません。また、これらの手順では、クライアント ドキュメントでの図形または図形グループの正確な位置が指定されません。さらに、元に戻す履歴やリビジョン履歴のオプションが含まれません。
MS-ODRAW 形式で図形グループまたは単独の図形を再構築するには
対象の図形グループを含む図面のファイルで OfficeArtDgContainer レコードを見つけるか、条件に一致する図面が見つかるまですべての図面を反復処理します。
レコード ヘッダーを読み取って、図面の終わりまでのバイト数を取得します。
レコードの種類 = OfficeArtSpgrContainer (0xf003) のレコードを見つけるまで、コンテナー内のレコード ヘッダーを確認します。OfficeArtSpgrContainer レコードがない場合、図面に図形は含まれません。
OfficeArtSpgrContainer レコードは, .groupShape フィールドを表します。このレコードには、図面内にあるすべてのアクティブな図形が、OfficeArtSpgrContainerFileBlock レコードの配列として含まれます。
レコード ヘッダーを読み取ってコンテナーの長さを取得し、最初の OfficeArtSpgrContainerFileBlock レコードの読み取りを開始します。これは配列内の最初の OfficeArtSpgrContainerFileBlock レコードのため、OfficeArtSpContainer レコードが含まれている必要があり、その OfficeArtSpContainer レコードは現在のグループのグループ図形に対応している必要があります。
以下の手順「MS-ODRAW 形式で 1 つの図形を再構築するには」に示されているとおりに、OfficeArtSpContainer レコードを読み取ります。
次の OfficeArtSpgrContainerFileBlock レコードの読み取りを開始します。レコード ヘッダーから開始します。
.recType = 0xF004 の場合、現在のファイル ブロックの残りは OfficeArtSpContainer レコードです。次の手順「MS-ODRAW 形式で 1 つの図形を再構築するには」で説明されているとおりに、レコードを読み取ります。
.recType = 0xF003 の場合、現在のファイル ブロックの残りは OfficeArtSpgrContainer レコードです。このレコードは下位図形グループを表します。前の 3 つの手順で説明されているとおりに、レコードを読み取ります。
残りの OfficeArtSpgrContainerFileBlock レコードを同じ方法で読み取ります。
ファイルの図面グループを表す OfficeArtDggContainer を見つけます。
OfficeArtDggContainer の内部で、各レコード ヘッダーを確認し、OfficeArtFOPT と OfficeArtTertiaryFOPT の種類のレコードを読み取ることでプロパティ テーブルを見つけ、残りをスキップします。
これらのプロパティ テーブルは、ファイル全体に対する既定のプロパティを表します。以前のようにプロパティ テーブルを解析します。ただし、問題となっているプロパティがまだ指定されていない図形に限って、これらのテーブルからプロパティを適用します。
収集した情報に従って、アプリケーション内で図形グループをレンダリングします。
図形グループ内の 1 つの図形を再構築するには
OfficeArtSPContainer レコードから、コンテナー内の各レコードのレコード ヘッダーを読み取って、次のように処理を続行します。
レコードの種類 = OfficeArtFSPGR (0xF009) であり、さらに、これが図面内の最初の図形 (したがって、グループ図形) の場合、そのレコードは .shapeGroup フィールドを表します。レコード ヘッダーをスキップし、残りの 16 バイトを 4 個の 4 バイト符号付き整数としてメモリに読み込みます。これらは、最上位グループ図形の左、上、右、および下の座標を表します。
レコードの種類 = OfficeArtChildAnchor (0xF00F) であり、さらに、現在の図形がグループ図形でない場合、そのレコードは .childAnchor フィールドを表します。レコード ヘッダーをスキップし、残りの 16 バイトを 4 個の符号付き整数としてメモリに読み込みます。これらには、親のグループ図形に対する現在の図形の左、上、右、および下の座標が指定されます。
レコードの種類 = OfficeArtFSP (0xF00A) の場合、そのレコードは、16 バイト長の .shapeProp フィールドを表します。レコードをメモリに読み込みます。ビット 4 ~ 15 には、図形の種類を定義する MSOSPT 列挙値が指定されます。ビット 101 と 102 には、図形が既定の方向から水平方向または垂直方向に反転しているかどうかが指定されます。
レコードの種類 = OfficeArtFOPT (0xF00B)、OfficeArtSecondaryFOPT (0xF121)、または OfficeArtTertiaryFOPT (0xF122) の場合、そのレコードはプロパティ テーブルです。次の手順「MS-ODRAW 形式のプロパティを解析するには」で説明されているとおりに、プロパティを解析します。
他のすべてのレコードをスキップします。
プロパティ
MS-ODRAW 形式のプロパティを解析するには
OfficeArtFOPT レコードなど、プロパティ テーブルから開始して、OfficeArtRGFOPTE プロパティ グループで構成される .fopt 配列の最初のメンバーの読み取りを開始します。各グループは、プロパティ テーブル内のプロパティのカテゴリを表します。
最初の OfficeArtRGFOPTE グループの読み取りを開始します。OfficeArtRGFOPTE レコードにレコード ヘッダーはありませんが、OfficeArtFOPTE レコードで構成される .rgfopte 配列の最初のメンバーから開始します。
各 OfficeArtFOPTE レコードは、1 つのプロパティを表します。2 バイトの .opid フィールド (OfficeArtFOPTEOPID レコード) をメモリに読み込みます。
最初の 14 ビット (プロパティの識別子) を符号なしの整数として読み取ります。どの整数値がどのプロパティに対応するかについては、MS-ODRAW 仕様の「section 2.3」内のプロパティ リストを参照してください。
最後のビットが 1 に設定されている場合、これは複雑なプロパティであることを意味します。
現在の OfficeArtFOPTE レコードの残りの 4 バイトの .op フィールドを符号付き整数として読み取ります。これには、プロパティの値が指定されているか、プロパティが複雑な場合は値を保持する複雑なデータのバイト数が指定されています。
.rgfopte 配列内の残りのエントリを同じ方法で読み取ります。
最後の OfficeArtFOPTE レコードの後、複雑なデータを読み取ります。複雑なデータは、配列内のプロパティと同じ順序で、プロパティの .op フィールドに指定されたサイズで含まれています。
プロパティ テーブルが完了するまで、残りの OfficeArtRGFOPTE プロパティ グループを前述の手順と同じ方法で読み取ります。
ビットマップ
MS-ODRAW 形式のビットマップ イメージを抽出するには
ファイルの OfficeArtDggContainer レコードを見つけます。
レコード ヘッダーを読み取ってコンテナーの長さを取得します。
.blipStore フィールドを表す OfficeArtBStoreContainer (0xF001) レコードが見つかるか、OfficeArtDggContainer の最後に達するまで、コンテナー内の各レコードのレコード ヘッダーを確認します。OfficeArtBStoreContainer レコードがない場合、抽出するビットマップはありません。
OfficeArtBStoreContainer レコードは、OfficeArtBStoreContainerFileBlock レコードの配列内のファイルのすべてのビットマップを保持します。レコード ヘッダーを読み取ります。
ビット 4 ~ 15 は、配列の長さが指定されている符号なしの整数です。
配列内の OfficeArtBStoreContainerFileBlock レコードごとに、次の手順を実行します。
レコード ヘッダーのバイト 2 ~ 3 を読み取ってレコードの種類を取得します。
レコードの種類 = 0xF018-0xF117 の場合、そのレコードは OfficeArtBlip です。引き続き、この手順の次のステップを実行します。
レコードの種類 = 0xF007 の場合、そのレコードは OfficeArtFBSE です。次の処理を行います。
最初の 20 バイトをスキップします。
次の 4 バイトを読み取ります。これは、符号なしの整数としてビットマップのサイズを表します。
次の 12 バイトをスキップします。
.name フィールドを読み取ります。これは、 Null で終了する可変長の Unicode 文字列であり、ビットマップの名前を表します。
次のフィールドは .embeddedBlip です。これは、OfficeArtBlip レコードです。
OfficeArtBlip レコードのレコード ヘッダーを読み取ります。バイト 2 ~ 3 には、イメージが独立して保存された場合にイメージが持つファイルの種類が指定されます。レコード ヘッダーの最後の 4 バイトは、レコードの残りの長さを表します。どの種類の値がどのファイルの種類に対応するかについては、MS-OGRAPH 仕様の「section 2.2.23」を参照してください。
レコードの残りをメモリに読み込み、レコード ヘッダーに指定されたファイルの種類で保存します。
次の OfficeArtBStoreContainerFileBlock レコードの読み取りを開始して、すべてのビットマップが処理されるまで、引き続き同じ方法を実行します。
まとめ
Microsoft Office バイナリ ファイルに変更を加えるには、ファイルを内部表現に読み込み、表現を編集して、ファイルを再度書き込む必要があります。この要件があるため、保存操作を行うには、関連するファイル形式を十分に理解する必要があります。これは、この記事の範囲を超えます。この記事およびシリーズ内の関連する記事は、簡単な抽出を行うための手順と情報を提供し、MS-ODRAW 仕様に関する理解を深めることを促進します。
特に、MS-ODRAW 形式についての基礎知識があると、Microsoft Office バイナリ ファイル内に描画オブジェクトおよびビットマップがある場合にそれらの特定と解析を行うことができるため、その他の Microsoft Office バイナリ ファイル形式の操作に関する能力を高めることができます。
その他の技術情報
詳細については、次のリソースを参照してください。