![]() Windows 7 の XPS ドキュメント APIXPS ドキュメントの概要とサンプル プログラム 更新日: 2009 年 4 月 28 日 ダウンロードPDC08XPSOverview_JPN.docx (Word 形式、464 KB) 目次:
Jesse McGatha、Bob Watson 対象:Windows® 7 要約:このホワイト ペーパーでは、XPS ドキュメント形式と Windows 7 オペレーティング システムの XPS ドキュメント API の概要を紹介します。 法的通知:このドキュメントは暫定版であり、このソフトウェアの最終的な製品版の発売時に実質的に変更されることがあります。 1. 概要Windows Vista® オペレーティング システムで導入された XPS ドキュメント テクノロジにより、今までにないレベルのドキュメントの正確さとセキュリティが実現され、ドキュメントのプレゼンテーションと外観がデバイス間でより一貫性のあるものになりました。Windows® 7 オペレーティング システムでは、XPS ドキュメント API を導入することで、この機能をさらに広範なプログラミング アプリケーションで使用できるようにしています。 Windows Vista では、XPS ドキュメント関連の機能を使用できるのは、.NET Framework の Windows Presentation Foundation を使用しているソフトウェア開発者に限られていました。Windows 7 では、XPS ドキュメント API の導入により、アプリケーション ソフトウェア、デバイス ドライバー、および他の Win32® アプリケーションを作成するソフトウェア開発者も XPS ドキュメントの機能を使用できるようになりました。 このホワイト ペーパーでは、XPS ドキュメント形式の概要について説明します。また、アプリケーション ソフトウェアやデバイス ドライバーの開発者が、Windows 7 の XPS ドキュメント API を使用して XPS ドキュメントを作成したり、XPS ドキュメントにアクセスしたりする方法についても説明します。このホワイト ペーパーでは、独自の XPS ドキュメントを作成する際に使用できるサンプル プログラムを提供しており、XPS ドキュメント API を使用してドキュメントのコンポーネントを操作する方法の実例を紹介しています。このホワイト ペーパーを最後までお読みいただくと、プログラムで XPS ドキュメントを使い始めるのに必要な情報を得ることができます。
2. XPS の概要電子ドキュメントは、情報の交換方法と公開方法に大きな変革をもたらしました。ただし、電子ドキュメントの使用には問題がありました。現在使用されている多くのプログラムでは、コンピューターの画面に表示したときと印刷したときで、ドキュメントの概観が異なります。ドキュメントを表示するコンピューターによって、ページ レイアウト、イメージの色、およびフォント スタイルが変更される可能性があり、その結果ドキュメントの外観が変化します。そのため、電子ドキュメントの外観は、ドキュメントを表示または印刷する場所と方法によって異なります。ユーザーのコンピューターに特定のソフトウェア、フォントなどのリソースをインストールする必要があることが、ユーザーのさらなる混乱を招く原因となっていました。 マイクロソフトでは、Windows Vista オペレーティング システムで XML Paper Specification を導入し、XPS をサポートすることで、このような多くの問題に対処してきました。XPS ドキュメント形式と XPS 印刷パスによって、電子ドキュメント テクノロジにおける最新技術が大幅に向上しました。Windows 7 では、このテクノロジをさらに拡張しています。 Windows Vista では、連携して XPS ドキュメントの強力な開発環境を作り出す一連のテクノロジが提供されます。Windows 色システムとグラフィック サービス、XPS 印刷パスとクラスター化サービス、XPS ビューアー、および Windows Presentation Foundation (WPF) のすべてのテクノロジが連携して、信頼できる非常に正確なドキュメント エクスペリエンスをエンド ユーザーに提供し、シームレスな開発環境をソフトウェア開発者に提供します。これらのテクノロジは、ドキュメント ワークフロー全体を通じてユーザーにメリットをもたらします。オーサリングと表示から格納とアーカイブに至るまで、Windows の統合テクノロジによって堅牢なドキュメント エクスペリエンスがユーザーに提供されます。 XPS ドキュメント形式は、このエクスペリエンスを実現するいくつかのテクノロジを開拓しました。XPS ドキュメントでは、デジタル署名と他のセキュリティ機能をサポートしているので、カスタム リソースや他のアプリケーション固有のメタデータを格納できます。XPS ドキュメントでは、独自のバイナリ形式でデータを格納するドキュメント ファイルと異なり、XML Paper Specification で規定された XML ベースのプレーンテキスト形式でデータを格納します。XML Paper Specification は、Open Office XML 仕様の Open Packaging Conventions (Ecma-376 Part 2) を基に策定されているので、XPS ドキュメントは圧縮 zip アーカイブとして格納され、XML ベースの言語の使用によって失われるスペース効率がいくらか回復します。オープン仕様を使用してコンテンツや記憶域の形式を定義すると、長期にわたってドキュメントのコンテンツにアクセスできるようになります。
3. XPS ドキュメントの内部XPS ドキュメント API は、XPS ドキュメントの論理構成に厳密に従っています。そのため、XPS ドキュメントの内部構成を理解すると、API の構成を理解できます。 XPS ドキュメントはファイルに格納されます。このファイルは Open Packaging Conventions に準拠しているので、多くの場合 "パッケージ" と呼ばれます。パッケージには、"パーツ" と呼ばれる一連のドキュメント コンポーネントが含まれており、パッケージは物理的かつ論理的な構造を持っています。物理構成はパッケージに格納されたドキュメント パーツで構成されます。一方、論理構成は XML Paper Specification で規定された階層になっています。 ドキュメント コンテンツを含むドキュメント パーツを "コンテンツ パーツ" と呼び、パーツどうしの関係についての情報を含むドキュメント パーツを "リレーションシップ パーツ" と呼びます。XPS ドキュメントで最も一般的なパーツは、コンテンツ パーツなので、明示的にリレーションシップ パーツと呼ばれないパーツは、コンテンツ パーツとみなすのが妥当です。 XML Paper Specification の規定により、XPS ドキュメントの論理レイヤーに特定の構成や名前付け規則が適用されます。図 1 に示すように、XPS ドキュメント パーツは、FixedDocumentSequence パーツが最上位に位置する論理階層で編成されています。1 つの XPS ドキュメント パッケージに複数のドキュメントが格納されることがあるので、FixedDocumentSequence パーツではドキュメントのシーケンスを定義します。 図 1. XPS ドキュメントの論理階層 FixedDocumentSequence パーツは FixedDocument パーツを参照します。FixedDocument パーツは、FixedPage パーツで編成されたドキュメントのページを参照します。各 FixedPage パーツには、ページ マークアップが含まれており、ページのコンテンツとレイアウトを定義する XML ベースの文字列、イメージ、フォント、カラー プロファイルなど、ページで使用される他のリソースへの参照が含まれています。イメージやフォントなどのリソースは、パッケージ内の独自のパーツに格納され、FixedPage パーツには格納されません。この分離により、同じページの他の要素または他のページの要素でリソースを共有できます。多くの場合、1 つのフォントが多くのページで使用されるので、この分離は特にフォント リソースで役立ちます。複数回使用されるイメージ リソース (透かし、レターヘッドのロゴなど) でも、この分離が役に立ちます。 図 1 は、それぞれ 2 ページで構成された 2 つの独立したドキュメントを含む、XPS ドキュメント ファイルの構造を示しています。このようなドキュメントは、FixedDocument_1 にスライドが含まれ、FixedDocument_2 に背景情報が含まれているプレゼンテーションである場合もあります。 XPS ドキュメント API は、ドキュメント パーツの物理記憶域を管理し、その情報を論理階層の形式でアプリケーションに提供します。パッケージ コンテンツを直接操作する必要はありませんが、プログラムによってドキュメント パーツが正しく作成されているかどうかを確認するためにも、パッケージ内に何が格納されているかを把握しておくと役立つことがあります。 Windows エクスプローラーを使用すると、最も簡単に XPS ドキュメント パッケージ ファイルの物理コンテンツを表示できます。XPS ドキュメント API により、zip アーカイブ ファイル形式でパッケージ ファイルが作成されます。コンテンツは格納時に圧縮または圧縮解除することができますが、どちらの場合も zip 構造は保持されます。パッケージ ファイルの拡張子を .xps から .zip に変更するだけで、Windows エクスプローラーで標準の zip アーカイブとして XPS ドキュメントを開くことができます。図 2 に、単純な XPS ドキュメントを Windows エクスプローラーで表示した状態を示します。 図 2. Windows エクスプローラーで表示したときの XPS ドキュメントの物理階層 ドキュメントの物理パーツはファイルやフォルダーとして Windows エクスプローラーに表示されますが、ドキュメント パーツの論理階層は一目でわかるわけではありません。これについては図 3 に示します。 図 3. XPS ドキュメントの論理コンポーネントと物理コンポーネントの関係
a. 物理パッケージの詳細パッケージ ファイルの各パーツには、[Content_Types].xml で定義されたコンテンツ タイプが含まれます。[Content_Types].xml のマークアップでは、特定のパーツ名またはパーツ名で使用される拡張子に基づいて、パーツに含まれるコンテンツ タイプを定義しています。 次のサンプル コードに、[Content_Types].xml のマークアップを示します。Default 要素では、Extension 属性に指定した拡張子で終わる、すべてのパーツのコンテンツ タイプを定義しています。Override 要素には、PartName 属性に指定したパーツ名に基づいて、パーツのコンテンツ タイプを定義しています。
XPS ドキュメント ファイルの各パーツには、同じファイル内の他のパーツに対する 1 つ以上のリレーションシップを含めることができます。リレーションシップとは、コンテンツ パーツ間の相互接続の形式的な宣言です。コンテンツ パーツのリレーションシップは、"リレーションシップ パーツ" という対応するパーツに格納されます。パーツのコンテンツとパーツのリレーションシップを分けて格納すると、リレーションシップを確認するためだけにパーツのコンテンツを解析する必要がなくなるので、プログラムによるアクセスが簡単になります。 名前付け規則によって、リレーションシップ パーツとコンテンツ パーツが関連付けられます。図 4 は、サンプル XPS ドキュメントのパーツの階層を示しています。このサンプルのコンテンツ パーツの名前は /Documents/Pages/1.Fpage です。このページのリレーションシップ パーツの名前は /Documents/Pages/_rels/1.fpage.rels です。リレーションシップ パーツ名のパスに /_rels/ というディレクトリが挿入されていることに注意してください。 図 4. リレーションシップ パーツのサンプル 図 4 では、サンプルのマークアップで、ページ内の要素から同じページで使用されるイメージに至るまでのリレーションシップを定義しています。リレーションシップのソースは _rels フォルダーと同じフォルダー内のオブジェクトで、この場合は /Documents/Pages/1.Fpage です。このリレーションシップのターゲットは、リレーションシップ パーツのマークアップ内の Relationship 要素の Target 属性で指定されています。XPS ドキュメントで使用される既知のコンテンツ タイプとリレーションシップ型の詳細については、XML Paper Specification を参照してください。
b. 論理階層の詳細XPS ドキュメントの基本構造は、1 つ以上の固定ページがそれぞれに含まれている 1 つ以上の固定ドキュメントを含む、固定ドキュメント シーケンスです。固定ページには、各ページのコンテンツを定義するマークアップが含まれています。XPS ドキュメント ファイルのパーツの物理構成とは関係なく、XPS ドキュメントのコンテンツの論理階層はドキュメント パーツで定義されます。XPS ドキュメントの論理階層の最上位レベルは、/_rels/.rels という名前のリレーションシップ パーツのターゲットとして定義されます。これは "パッケージ リレーションシップ パーツ" と呼ばれるもので、パッケージ ルートから始まるすべてのリレーションシップを定義しています。論理ドキュメント構成のすべての操作は、このパーツから開始されます。 このサンプル XPS ドキュメントの論理ドキュメント構成を操作するには、/_rels/.rels リレーションシップ パーツから固定表現のリレーションシップ型のコンテンツを読み取ります。このリレーションシップのターゲットによって、FixedDocSeq.fdseq というパーツが識別されます。FixedDocSeq.fdseq は、このドキュメントの FixedDocumentSequence を含むパーツとして、パッケージのルートにあります。 FixedDocSeq.fdseq パーツのコンテンツには、XPS ドキュメントの論理階層内の次のレベルのパーツを定義します。つまり FixedDocument パーツです。FixedDocSeq.fdseq パーツ内のマークアップのサンプルを以下に示します。
DocumentReference 要素では、XPS ドキュメント ファイルの FixedDocument パーツの場所を定義します。このサンプル ドキュメントには、FixedDocument パーツが 1 つしかないので、DocumentReference 要素も 1 つしかありません。しかし、XPS ドキュメント パッケージ ファイルには、複数の FixedDocument パーツを含めることができます。そのような XPS ドキュメントの場合、FixedDocumentSequence 要素には、FixedDocument パーツごとに 1 つの DocumentReference 要素が含まれ、それらの要素は出現する順序で定義されます。 FixedDocument パーツには、固定ドキュメントの各ページのページ参照が含まれます。ページ参照は、FixedDocument パーツの PageContent 要素で定義します。この要素では、XPS ドキュメント ファイル内の固定ページ コンテンツがある場所を指定します。次のサンプル コードでは、この固定ドキュメントの唯一のページの FixedPage パーツが Pages/1.fpage パーツに含まれています。パス名の先頭がスラッシュではないので、Source 属性で参照している Pages フォルダーは、/Documents/1/FixedDoc.fdoc パーツと同じフォルダーにあります。パス名の先頭がスラッシュの場合は、パスがドキュメント ルートから始まることを示します。
このサンプルの XPS ドキュメントには 1 ページしか含まれていないので、固定ドキュメント パーツの PageContent 要素は 1 つしかありません。1.fpage パーツは Pages フォルダーにあり、ページ マークアップを含みます。_rels フォルダーも Pages フォルダーにあり、このページのリレーションシップ パーツ (_rels\1.fpage.rels) には、このページで使用されるリソースに対するリレーションシップが含まれています。 ドキュメント パーツは、パーツを複数のピースに分けて複数の物理 zip アーカイブに格納することでインターリーブできます。インターリーブの詳細については、XML Paper Specification および Open Packaging Conventions を参照してください。 また、サンプル XPS ドキュメント ファイルを Windows エクスプローラーで表示すると、ドキュメントに格納されているリソースを含むフォルダーが表示されます。このサンプル ドキュメントのページでは、写真が含まれていて、フォントを使用しています。写真とフォントはどちらもドキュメントのリソースとして格納されます。このイメージは XPS ドキュメント パッケージの \Resources\Images フォルダーにあり、フォントは \Resources\Fonts フォルダーにあります。
4. XPS ドキュメントのプログラミングWindows® 7 オペレーティング システムを使用すると、開発者はプログラムで XPS ドキュメントを作成および操作できます。XPS ドキュメント API は XPS オブジェクト モデル (XPS OM) を実装しており、開発者が、XPS ドキュメントを作成および操作する手段を提供します。 これから紹介するサンプル プログラムは、C++ プログラム内で XPS ドキュメントを作成する方法を示しています。このサンプル プログラムでは、Windows 7 (PDC CTP) で提供される XPS ドキュメント API が必要になります。XML Paper Specification は Open Packaging Conventions を基に策定されているので、サンプル プログラムでは、パーツ の URI の作成にもパッケージ化 API の IOpcFactory インターフェイスを使用しています。 次の表に、XPS ドキュメント API インターフェイスと XPS ドキュメント コンポーネントの関係を示します。
図 5 は、サンプル プログラムで作成したドキュメント ページです。このページには、テキスト、イメージ、およびベクトル線の画像が含まれており、ドキュメントに追加できるさまざまな種類のコンテンツの豊富なサンプルを提供しています。 図 5. サンプル XPS ドキュメント
a. 要件このサンプル プログラムは、Windows 7 および .NET Framework 3.5 Service Pack 1 用 Windows® ソフトウェア開発キット (SDK) を使用するように開発されました。PDC の参加者には、この SDK のプレベータ版を配布しました。このサンプル プログラムは最新版の Windows 7 および SDK でも動作する可能性がありますが、このホワイト ペーパーでは、デモンストレーションのみを目的として提供しています。 b. はじめに以下で紹介するサンプル プログラムのソース コードは、このホワイト ペーパーに付属の XPSDocumentApiSample.zip に含まれています。この後の説明の理解を深めるには、プログラムのソース コードを参照してください。 XPS ドキュメント API は、すべての Win32 プログラムで使用できます。ただし、XPS ドキュメント API は Windows 7 オペレーティング システムでのみ提供されているので、Windows 7 の機能と XPS オブジェクト モデルを使用するには、プログラムのソース コードを構成する必要があります。サンプル コードのファイルには、次のような設定が含まれています。 targetver.h ヘッダー ファイルで _WIN32_WINNT の値を定義しているので、プログラムでは Windows 7 の機能を使用することができます。
stdafx.h ヘッダー ファイルには、XPS オブジェクト モデルのヘッダー ファイルである xpsobjectmodel.h とプログラムで必要な他のヘッダー ファイルが含まれています。
XPS オブジェクト モデルによって公開される COM インターフェイスの処理を簡単にするために、ソース コードに macros.h ヘッダー ファイルを追加しました。 サンプル プログラムは、shell32.lib ライブラリと shlwapi.lib ライブラリに依存しています。プログラムを正常にビルドできるように Visual Studio® プロジェクト プロパティの [リンカ] の下の [入力] ノードに追加の依存ファイルとしてこれらのライブラリを追加しました。
c. 1 ページの XPS ドキュメントの作成Windows 7 オペレーティング システムでは、XPS オブジェクト モデルが導入されたので、プログラムで XPS ドキュメントのコンポーネントを作成し、コンポーネントにアクセスできます。XPS オブジェクト モデルにより、「XPS ドキュメントの内部」セクションで説明した XPS ドキュメント コンポーネントを表す XPS ドキュメント API インターフェイスが公開されます。XPS OM は、XPS ドキュメントのメモリ内の表現です。XPS OM を使用すると、XML DOM を使用したときに XML ドキュメントのコンポーネントにプログラムでアクセスできるのと同じ方法で、XPS ドキュメントのコンポーネントにアクセスできます。 次の表に、空白の 1 ページで構成されるドキュメントのコンポーネントを表すインターフェイスの一覧を示します。
XPS OM によって公開されるインターフェイスを作成するには IXpsOMObjectFactory インターフェイスを使用し、パッケージ化 API インターフェイスを作成するには IOpcFactory インターフェイスを使用します。XPS ドキュメントは Open Packaging Conventions (OPC) パッケージ ファイル形式で保存されるので、パッケージ化 API インターフェイスは、OPC 関連のいくつかのプロパティ ("パーツ名" と呼ばれる、個別のドキュメント コンポーネントの名前など) で使用されます。 ドキュメント構造の作成SampleDocument.cpp では、GetXpsFactory メソッドと GetOpcFactory メソッドを使用して、XPS ドキュメント API とパッケージ化 API のオブジェクト ファクトリのインスタンスを作成しています。ファクトリへのポインターは、保存して、最終的に XPS ドキュメントとして保存される XPS OM を構築するためにサンプル プログラム全体で使用しています。 ドキュメント コンポーネントでは、一意のパーツ名が必要です。ドキュメント コンポーネントを表すインターフェイスを作成する前に、OPC ファクトリを呼び出して、ドキュメント コンポーネントごとに IOpcPartUri というパーツ名インターフェイスを作成する必要があります。次のサンプル コードに示すように、SampleDocument.cpp では、BuildXpsDocument メソッドによってこれらの手順が実行されます。
上記のサンプル コードによって、空白の XPS ドキュメントの基本的なドキュメント コンポーネントが作成されますが、これらのコンポーネントを作成するだけではドキュメントは構成されません。ドキュメントを構成するには、XPS OM でこれらのコンポーネントを編成する必要があります。SampleDocument.cpp では、BuildXpsDocument メソッドによってこのタスクが実行されます。その際、階層の最上位から最下位に向かって構成が行われます。 パッケージは階層の最上位のノード、つまりルートです (パッケージは、XPS OM がディスクに保存されたときに XPS ドキュメント ファイルを表します)。パッケージの直下にある要素は、固定ドキュメント シーケンスです。次のサンプル コードでは、上記のサンプル コードで作成した固定ドキュメント シーケンスをパッケージに割り当てています。
次に、ドキュメント シーケンスの現在は空であるドキュメントのコレクションに、固定ドキュメントを追加します。
その後、ドキュメントの現在は空であるページのコレクションに、ページ参照を追加します。
最後に、ページ参照に空白のページを追加して、空白のドキュメントを完成させます。
ページへのキャンバスの追加SampleDocument.cpp では、BuildXpsPageGraphicsContent メソッドを使用して XPS OM にグラフィック コンテンツを追加しています。グラフィックを表すオブジェクトのインスタンスが作成されたら、これらのオブジェクトにコンテンツが設定される前に、BuildXpsPageGraphicsContent メソッドによって XPS OM に空のオブジェクトが追加されます。 あらゆる種類の XPS ドキュメント コンテンツ (グラフィックなど) にアフィン行列変換を適用して、コンテンツのサイズ変更、傾斜設定、回転、または位置変更を行うことができます。サンプル プログラムでは、すべてのコンテンツをキャンバスに配置し、スケール変換を適用して、ページのサイズに合わせてコンテンツを拡大することで、この処理を例示しています。 まず、すべてのグラフィック要素を格納するキャンバスを作成し、XPS OM に追加します (次のサンプル コードを参照してください)。次に、変換オブジェクトを追加します。このオブジェクトは、ページ サイズに合わせてキャンバスのサイズを変更する際に使用します。
プログラム コードを簡単にするために、サンプル プログラムでは、ヘルパー メソッドを使用して、キャンバスに追加するグラフィック要素を作成しています。
XPS OM オブジェクト ファクトリとページの最上位のキャンバスを、各ヘルパー メソッドに渡しています。ヘルパー メソッドでは、オブジェクト ファクトリを使用して XPS OM に必要なオブジェクトが作成されます。その結果、XPS OM に必要なオブジェクトが構成されてページのキャンバスに追加されます。
d. グラフィック コンテンツの処理XPS ドキュメントのグラフィックはすべて、パス オブジェクトで表されます。パスは、塗りつぶしブラシかストローク ブラシ (またはその両方) とジオメトリで構成されます。ジオメトリはグラフィックの形状を定義し、一連の幾何学図形で構成されます。それぞれの幾何学図形は、1 つ以上のセグメントで構成されます。セグメントでは直線または曲線を記述できます。 純色の使用SampleDocument.cpp では、AppendSidebar メソッドを使用して、塗りつぶすパスとしてサイド バー グラフィックを作成しています。既に説明したように、パスは塗りつぶしブラシかストローク ブラシ (またはその両方) とジオメトリで構成されます。これに対し、サンプル プログラムのサイド バー グラフィックのパスは、塗りつぶしブラシとジオメトリだけで構成されています。AppendSidebar メソッドによって、塗りつぶしブラシとジオメトリが作成および構成され、これらのオブジェクトが、引数リストで渡されるキャンバスに追加されます。 まず、AppendSidebar メソッドによって、色でパスを塗りつぶすために使用されるブラシ オブジェクトが作成され、RGB カラーとアルファ レベルのブラシが設定されます。 次に、AppendSidebar メソッドによって、幾何学図形が作成および構成されます。幾何学図形には一連のセグメントが含まれています。また、各セグメントは、セグメントの種類、セグメントの座標、およびセグメントにストロークが設定されているかどうかを示すフラグで構成されています。 次のサンプル コードは、幾何学図形を構成する 3 つのセグメントが定義された後、AppendSidebar メソッドによって幾何学図形オブジェクトがどのように作成および構成されるのかを示しています。このメソッドは、オブジェクトを作成し、プロパティを設定して、セグメントを設定することでこの処理を実行します。その後、パスで使用するために、幾何学図形をジオメトリ オブジェクトに追加する必要があります。
最後に、AppendSidebar メソッドを使用して、オブジェクトのパスを作成し、そのパスにブラシとジオメトリを追加して、ページにパスを追加します。
終了前に、AppendSidebar メソッドで、作成されたすべての新しいインターフェイスを解放します。これらの XPS OM のオブジェクトを追加すると AddRef が呼び出されるので、この手順はリークの発生を防止するために重要です。
グラデーションの使用SampleDocument.cpp では、AppendSidebar メソッドの場合と同様に、AppendTopbar メソッドを使用して、塗りつぶすパスとしてトップ バー グラフィックを作成しています。ただし、AppendTopbar メソッドでは、純色ブラシではなく、グラデーションを使用してパスを塗りつぶします。 グラデーションとは、グラデーション パスに沿って色が変化するグラフィックのことです。グラデーション境界では、色と、その色が使用されるグラデーション パス上の場所を定義します。グラデーションの色は、グラデーション パスの終点に達するまで、あるグラデーション境界の色から次の境界の色までパスに沿って変化します。グラデーション境界では、色の場所をグラデーション パス全体における比率で指定します。0.0 はグラデーション パスの始点を示し、1.0 は終点を示します。最も単純なグラデーションのグラデーション境界は 2 つですが、3 つ以上のグラデーション境界を指定してグラデーションを定義することもできます。 次のサンプル コードは、AppendTopbar メソッドによって、図 5 のトップ バー グラフィックで使用する 2 つのグラデーション境界がどのように作成されるのかを示しています。
グラフィックの複製XPS ドキュメント API の多くのインターフェイスでは、複製をサポートしています。SampleDocument.cpp では、トップ バーにスウッシュ線を追加するために、AppendSwooshes メソッドを使用して、1 つのベジエ曲線を描画するパス オブジェクトを作成し、その後、そのパスを複製し、図 5 のトップ バーに示すような別のスウッシュ線を作成するようにそれぞれの新しいインスタンスを変更しています。 AppendSwooshes メソッドでは、サイド バーとトップ バーのグラフィックの作成に使用したのと同じ種類のブラシ、セグメント、幾何学図形、ジオメトリ、およびパス オブジェクトを使用して最初の線を作成します。作成されたパスはページのキャンバスに追加されますが、この時点では解放されません。他のスウッシュ線を作成するために、AppendSwooshes メソッドでは、パスの Clone メソッドを呼び出し、最初の線のパスを複製します。
Clone メソッドを使用すると、まったく同じパスのコピーが作成されます。そのため、このパスで別の線を描画するために、AppendSwooshes メソッドでは、新しいパスの幾何学図形のセグメント データを変更し、変更したパスをページのキャンバスに追加しています。
ページに描画する他のスウッシュ線についても、同様の処理が繰り返されます。
ロゴ イメージの描画ロゴは、6 つの個別のパス オブジェクトを使用して描画しました。各パス オブジェクトは、AppendLogo メソッドを使用して個別に作成しました。 まず、AppendLogo メソッドでは、トップ バー グラフィックの塗りつぶしに使用したのと類似した線状グラデーション ブラシを作成します。ただし、ロゴのグラデーションには、3 つのグラデーション境界があります。次のサンプル コードでは、AppendLogo メソッドで、1 つ目と 3 つ目のグラデーション境界を使用して線状グラデーションが作成され、IXpsOMGradientStopCollection インターフェイスの InsertAt メソッドを呼び出して 2 つ目の境界が挿入する方法を示しています。
パスで使用される幾何学図形は、サイド バーやトップ バーの場合と同じ方法で作成されます。ただし、幾何学図形のセグメントでは直線ではなくベジエ曲線が使用されるので、ロゴ イメージで使用される幾何学図形のセグメントはより複雑になります。それ以外の点については、幾何学図形のセグメントの作成手順は同じです。つまり、セグメントの種類を定義し、セグメント データを設定して、セグメント ストロークの値を設定します。次に、幾何学図形を作成および構成して、幾何学図形にセグメント データを割り当てます。その後、ジオメトリを作成して、そのジオメトリに幾何学図形を割り当てます。最後に、パスを作成し、ジオメトリを使用するように構成して、キャンバスに追加します。 ロゴでは類似したパスがいくつか使用されるので、キャンバスに最初のパスを追加した後、そのパスが複製され、幾何学図形のセグメント データと始点を変更してパスが変更されます。その後、次のサンプル コードに示すように、複製されたパスのポインターが取得され、プロパティに新しい値が設定されて、複製されたパスの線状グラデーション ブラシが変更されます。
新しいパスが正しく構成されると、そのパスはページのキャンバスに追加されます。ロゴで使用される残りのパスも同じように作成されます。
e. テキストの処理XPS ドキュメントのテキストは、連続するグリフとしてグループ化され、同様に書式設定された文字列のグループで表されます。XPS オブジェクト モデルでは、グリフは IXpsOMGlyphs オブジェクトで表されます。連続するグリフは、ベースライン原点から始まり、線の終点に達するかテキストの形式が変更されるまで続きます。英語の場合、グリフの原点はグリフの左隅にあり、グリフのディセンダー (p や g という文字の下部など) を含みません。 IXpsOMGlyphs オブジェクトは、XPS ドキュメントに保存されるフォント リソースを表す IXpsOMFontResource インターフェイスに依存します。IXpsOMFontResource インターフェイスは、複数の IXpsOMGlyphs オブジェクトで共有できます。 IXpsOMGlyphs インターフェイスは、描画するテキスト データを表します。IXpsOMGlyphs オブジェクトでは、フォントに指定されているレンダリングに関する指示だけでなく、ページ上の文字を塗りつぶすためにブラシも使用します。サンプル プログラムでは、塗りつぶしブラシとして純色ブラシを使用していますが、すべての種類のブラシを塗りつぶしブラシとして使用できます。 XPS ドキュメントに基本的なテキストを記述する処理を簡単にするために、SampleDocument.cpp では GenerateNewFontPartUri および AppendSimpleText という 2 つのヘルパー メソッドを使用しています。GenerateNewFontPartUri メソッドでは、フォント リソースで使用する OPC パーツ URI オブジェクトを作成します。パーツ名を一意にし、フォントをあいまいにするために、GUID を使用してパーツ名を作成します。URI オブジェクトは、XPS ドキュメントの /Resources/Fonts フォルダーに作成されます。 AppendSimpleText メソッドでは、テキスト文字列を取得し、その文字列の連続する 1 つのグリフを作成して、キャンバスに追加するのに必要な一般的なタスクを実行します。具体的には、AppendSimpleText メソッドでは次の処理が行われます。 xpsColor で渡された XPS_COLOR 構造体を使用して、純色ブラシを作成します。 新しい IXpsOMGlyphs インターフェイスを作成し、位置を glyphsOrigin で渡された位置に設定します。次に、fontEmSize で渡された値を使用してフォント サイズを定義し、新しい純色ブラシを使用するように塗りつぶしブラシを設定します。 テキスト文字列を追加します。IXpsOMGlyphs インターフェイスにテキストを追加するには、IXpsOMGlyphsEditor を使用する必要があります。この際 AppendSimpleText メソッドが IXpsOMGlyphs インターフェイスから IXpsOMGlyphsEditor を取得して、テキスト文字列を設定し、変更を適用して IXpsOMGlyphs インターフェイスに設定されるようにする必要があります。 キャンバスに新しい IXpsOMGlyphs インターフェイスを追加します。色、フォント サイズ、およびテキストを設定すると、キャンバスに IXpsOMGlyphs オブジェクトを追加できるようになります。 SampleDocument.cpp の BuildXpsPageTextContent メソッドによって、サンプル ドキュメントにテキストが追加され、上記の処理を簡単にするために 2 つのヘルパー メソッドが使用されます。 テキストを追加するには、その前にフォントを読み込む必要があります。次のサンプル コードでは、BuildXpsPageTextContent メソッドによって実行される最初の一連の処理が、ストリームとしてフォント ファイルを読み込み、IXpsOMGlyphs インターフェイスによって使用されるフォント リソースを作成することを示しています。
フォント リソースを定義したら、BuildXpsPageTextContent メソッドで、ドキュメント ページのテキストの色ごとに異なる塗りつぶしブラシとして使用される、さまざまな純色ブラシを作成します。すべてのテキスト要素がメイン キャンバスの一部としてメイン ページに配置されるので、BuildXpsPageTextContent メソッドではメイン ページのキャンバス インターフェイスを取得します。 フォント、塗りつぶしブラシ、およびキャンバス インターフェイスが定義されたので、ドキュメントにテキストを追加するための残りの処理は、そのテキストを含む IXpsOMGlyphs インターフェイスを作成して追加する処理だけです。次のサンプル コードに、テキスト文字列ごとにこの操作を実行するために、BuildXpsPageTextContent メソッドで AppendSimpleText メソッドを呼び出している処理の一部を示します。各 IXpsOMGlyphs インターフェイスには、同じ行のテキストが含まれていて、同じように書式設定されている必要があります。そのため、書式設定や位置が変更されるたびに、新しい IXpsOMGlyphs インターフェイスが必要になります。BuildXpsPageTextContent メソッド のコード ブロックを確認する際、呼び出しごとに変化するパラメーターと変化しないパラメーターがあることに注目してください。たとえば、それぞれの呼び出しで同じオブジェクト ファクトリ、フォント リソース、およびキャンバスを使用していても、フォント サイズ、原点の x 座標と y 座標、そして当然テキスト文字列は呼び出しごとに異なります。テキストのセクションが異なってもフォントの色は同じなので、フォントの値は同じページの別の部分にテキストが書き込まれたときにのみ変更されます。
AppendSimpleText メソッドに対するすべての呼び出しを確認するには、SampleDocument.cpp の BuildXpsPageTextContent メソッドを参照してください。
f. イメージの処理ボックスのイメージは、サンプル ドキュメントのページを完成させるのに必要な最後のアイテムです。ボックスのイメージの作成は、SampleDocument.cpp の BuildXpsPageImageContent メソッドで行います。XPS オブジェクト モデルには直接 "イメージを描画する" 機能がないので、イメージを追加するには次の手順を実行します。
イメージ リソースの作成方法は、フォント リソースの作成方法とよく似ています。イメージをストリームに読み取り、URI を作成してリソースをパーツ名で識別し、ストリームとパーツ名の URI からリソースを作成します。次のサンプル コードは、このホワイト ペーパーに付属のサンプル コードのイメージを使用して、上記の手順を示しています。
このイメージを使用するイメージ ブラシを作成するには、ビューボックスとビューポートのディメンションを指定した後に、1 回だけ呼び出しが必要になります。ビューボックスとは、ブラシで使用されるイメージの一部のことです。サンプル ドキュメントで使用するイメージでは、イメージ全体を使用するので、ビューボックスのディメンションはイメージのディメンションと同じになります。ビューポートとは、ビューボックスを描画する四角形のことです。サンプルでは、これらの値を xpsViewbox 変数と xpsViewport 変数にハードコーディングしています。
イメージの幾何学図形、ジオメトリ、およびパスは、サイド バー グラフィックやトップ バー グラフィックの場合と同じ方法で作成されます。この場合は、パスに割り当てられたブラシが純色ブラシや線状グラデーション ブラシではなく、イメージ ブラシになるという点が異なります。次のサンプル コードに、BuildXpsPageImageContent メソッドで、このタスクを実行する方法を示します。
この後、完全なパスがキャンバスに追加され、ドキュメントの他のコンポーネントの場合と同様にインターフェイスが解放されます。
5. まとめこのホワイト ペーパーを最後までお読みいただくと、XPS ドキュメントについて、およびプログラムで XPS ドキュメントを作成する方法について理解が深まったことでしょう。サンプル プログラムで作成したドキュメントでは、XPS ドキュメントに含めることができるさまざまな種類の要素を紹介しました。ただし、XPS オブジェクト モデルでは、この簡潔なホワイト ペーパーでは紹介しきれないほど多くの要素をサポートしています。たとえば、IXpsOMPrintTicketResource インターフェイスを含めると、XPS ドキュメントを印刷するためのユーザー設定をドキュメントの個々のパーツやドキュメント自体に追加することもできます。印刷チケット リソースの情報には、印刷の向き、ページ サイズなど、多くのプリンター設定が含まれています。このホワイト ペーパーで提供した情報は、固定ドキュメント シーケンス全体またはドキュメント内の個々の固定ページに適用できます。また、XPS ドキュメントではデジタル署名もサポートしています。 このホワイト ペーパーによって、皆さんの XPS ドキュメントに対する関心が高まればさいわいです。XPS ドキュメントの機能の詳細については、次のセクションに示す関連情報を参照してください。
6. 関連情報XML Paper Specification の使用の詳細については、「XML Paper Specification: 概要」を参照してください。 Open Packaging Conventions の詳細については、https://go.microsoft.com/fwlink/?LinkId=123375 (英語) から Open Office XML 仕様 (Ecma-376 Part 2) をダウンロードして確認してください。 XML Paper Specification の詳細については、https://www.microsoft.com/japan/whdc/xps/xpsspec.mspx から XML Paper Specification をダウンロードして確認してください。 Web アドレスは変更される可能性があるため、ここに記載されている Web サイトに接続できない場合があります。 |
ページのトップへ