Open Packaging Conventions (OPC) について
Open Packaging Conventions (OPC) は、
マイクロソフトが開発したファイル格納に関する技術規格です。この規格は、XMLファイルと非XMLファイルを一つのパッケージとしてまとめることを可能にします。OPCは、XML Paper Specification (OpenXPS) ドキュメントや、
Office Open XML (OOXML) などの形式で採用されています。
OPCの利点
OPC形式でファイルをパッケージ化することには、以下のような利点があります。
独立したファイルの添付: 個々のファイルをそのままドキュメントに添付できます。
ファイルサイズの削減: XMLをそのまま使用するよりも、より小さなファイルを生成できます。
OPCの仕様
OPCの仕様は、
Office Open XML標準(ISO/IEC 29500:2008 および ECMA-376)の Part 2 に定義されています。
ZIPファイルフォーマット: OPCは、PKWARE社の ZIP ファイルフォーマット仕様をベースとしています。ただし、ECMA-376 の初版では、より新しいバージョンの ZIP ファイルフォーマットを参照していました。このZIPファイル形式は国際標準ではありませんが、広く普及しています。
URIスキーム: かつて、OPC形式のパッケージへの参照として "pack" URI スキーム (pack://) が提案されていましたが、これは現在の URI スキームには適合せず、historicalと分類されています。
OPCの使い方
XML Paper Specification (XPS) や
Office Open XML (OOXML) は、どちらも OPC を利用しています。OPCパッケージには、XMLマークアップファイルの他に、PNG、BMP、AVI、PDF、RTFなどのテキストファイルやバイナリファイルを含めることができます。また、既にパッケージ化された ODF ファイルを格納することも可能です。
OPCでは、ファイル命名規則や間接参照方法も定義しており、バイナリファイルやXMLファイルがZIPアーカイブ内の格納場所に依存しないようになっています。
OPCファイルは、一般的なZIPユーティリティで開くことができます。また、OPCファイルでは、間接参照、チャンク化、相対間接参照がサポートされています。
OPCを利用するファイルフォーマット
OPCは、多くの新しいファイルフォーマットの基盤技術となっています。
プログラミング
OPCは、
.NET Framework 3.0 でネイティブにサポートされており、`System.IO.Packaging` ネームスペースで利用できます。また、他の言語向けのオープンソース
ライブラリも存在します。
Windows 7 以降では、OPCはWindows APIとしてもサポートされており、COMインタフェースを通じて利用できます。これはPackaging APIという名称で参照できます。
別の方法として、ZIP
ライブラリを使ってOPCファイルを作成・開くことも可能です。ただし、この場合は、ZIPファイル内に命名規則に従ったファイルを正しく格納する必要があります。
パッケージ、パーツ、リレーションシップ
OPCにおける専門用語の意味は以下の通りです。
パッケージ: ZIPアーカイブに対応します。
パーツ: ZIPアーカイブに格納されているファイルに対応します。
各パーツには、MIME
メディアタイプ形式で表現された要素タイプと、一意のURI準拠のパーツ名があります。要素タイプは、パーツに格納されているデータの型を明示的に定義し、
拡張子による曖昧さを解消します。
OPCパッケージには、パッケージ、パーツ、外部リソース間の関連付けを定義するリレーションシップを含めることができます。リレーションシップは有向グラフ構造で表現され、コンテンツへのアクセスに使用されます。
リレーションシップの構成要素
リレーションシップは以下の4つの要素から構成されます。
1.
識別子 (ID)
2.
省略可能なソース: パッケージまたはパッケージ内のパーツ
3.
リレーションシップタイプ: リレーションシップの種類を定義するURI
4.
ターゲット: パッケージ内の他のパーツまたは外部リソースを指すURI
OPCパッケージは、テキスト、画像、XML、バイナリなど、任意の形式のデータを含むパーツを格納できます。ただし、
拡張子 ".rels" は、リレーションシップメタデータを格納するために予約されています。
予約済みファイル名
以下のファイル名とディレクトリ名はOPCパッケージ内で予約済みです。
`_rels` サブフォルダ
`_rels` サブフォルダ内のファイル
拡張子 `.rels`
任意のフォルダ内のファイル名 `[Content_Types].xml`
[Content_Types].xml ファイル
このファイルは、パッケージ内の全てのパーツのMIMEメディアタイプを定義します。ファイル拡張子に基づく既定の割り当てや、特定のパーツに対する要素タイプのファイル拡張子のオーバーライドを定義します。
_rels ディレクトリ
/_rels: ルートレベルの `_rels` フォルダには、パッケージ全体のリレーションシップが格納されます。通常、 `/_rels/.rels` というファイルが含まれており、このファイルには開始時のパッケージレベルのリレーションシップが格納されています。
[パーツ名].rels: 各パーツは独自のリレーションシップを持つことができ、`_rels` フォルダ内に存在します。例えば、あるパーツにリレーションシップがある場合、そのパーツ名に `.rels` を加えた名前のファイルが `_rels` フォルダ内に存在します。
リレーションシップはXMLファイルとして表現され、テキストエディタで開くと、そのパーツからターゲットされるすべてのリレーションシップを定義するXMLマークアップを確認できます。
リレーションシップファイルの例
以下は、ルートパッケージに対するリレーションシップを定義するXMLの例です。
xml
この例では、ルートパッケージには、固定ドキュメントへの参照と、ドキュメントの最初のページのサムネイル画像への参照の2つの関係が存在します。
チャンク化
ドキュメントを小さなチャンクに分割することは、ファイル破損の影響を少なくするために推奨されます。また、データアクセスの向上にもつながります。
例えば、スタイル情報をXMLパーツに格納し、ワークシートやテーブルをそれぞれのパーツに格納することで、アプリケーションの高速なアクセスとオブジェクト作成の削減が可能になり、複数のプロセスが同じドキュメントで作業することが容易になります。
相対間接参照
OPCでは、参照を持つ各ファイルが `_rels` ファイルを持つことで、一部の情報を関連するリソースとともに切り貼りすることが容易になります。また、ファイル間での名前衝突を避けるための名前スコープを提供することもできます。
脚注
関連情報として、OPC UA も参照してください。
関連項目
OPC UA