アプリケーションでのフォントのパッケージング
更新 : 2007 年 11 月
ここでは、Windows Presentation Foundation (WPF) アプリケーションでフォントをパッケージ化する方法の概要について説明します。
メモ : |
---|
多くの種類のソフトウェアと同様に、フォント ファイルは、販売されるのではなくライセンスされます。フォントの使用を管理するライセンスはベンダによって異なりますが、Microsoft がアプリケーションや Windows で提供しているフォントをカバーするライセンスも含めて、通常、ほとんどのライセンスは、フォントをアプリケーションに埋め込んだり、別の方法で再頒布したりすることを許可していません。したがって、アプリケーションに埋め込む、または別の方法で再頒布するフォントについて、必要なライセンス権限を取得することは、開発者であるユーザーの責任で行ってください。 |
このトピックには次のセクションが含まれています。
- フォントのパッケージングの概要
- コンテンツ項目としてのフォントの追加
- リソース項目としてのフォントの追加
- フォント リソース ライブラリの作成
- フォントの使用に関する制限事項
- 関連トピック
フォントのパッケージングの概要
ユーザー インターフェイスのテキストやその他の種類のテキスト ベースのコンテンツを表示するために、WPF のリソースとしてフォントを簡単にパッケージ化できます。フォントは、アプリケーションのアセンブリ ファイルと別にすることも、アセンブリ ファイル内に埋め込むこともできます。また、アプリケーションで参照できる、リソース専用のフォント ライブラリを作成することもできます。
OpenType および TrueType® フォントには、各フォントにおけるフォント埋め込みのライセンス権限を示す、型フラグ fsType が含まれています。ただし、この型フラグはドキュメントに格納された埋め込みフォントのみを参照し、アプリケーションに埋め込まれたフォントは参照しません。フォントの埋め込み権限を取得するには、GlyphTypeface オブジェクトを作成し、その EmbeddingRights プロパティを参照します。fsType フラグの詳細については、OpenType 仕様の「OS/2 and Windows Metrics」を参照してください。
特定のフォント ベンダまたはカスタム作業のフォント ベンダを探す際に役立つ連絡先情報については、Microsoft の文字体裁の Web サイトを参照してください。
コンテンツ項目としてのフォントの追加
フォントは、アプリケーションのアセンブリ ファイルとは別のプロジェクト コンテンツ項目としてアプリケーションに追加できます。つまり、コンテンツ項目はアセンブリ内にリソースとして埋め込まれません。コンテンツ項目を定義する方法を次のプロジェクト ファイル例に示します。
<Project DefaultTargets="Build" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<!-- Other project build settings ... -->
<ItemGroup>
<Content Include="Peric.ttf" />
<Content Include="Pericl.ttf" />
</ItemGroup>
</Project>
アプリケーションが実行時にフォントを使用できるようにするには、アプリケーションの展開ディレクトリでフォントをアクセス可能にする必要があります。アプリケーションのプロジェクト ファイルの <CopyToOutputDirectory> 要素を使用すると、ビルド プロセスでアプリケーション展開ディレクトリにフォントを自動的にコピーできます。展開ディレクトリにフォントをコピーする方法を次のプロジェクト ファイル例に示します。
<ItemGroup>
<Content Include="Peric.ttf">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Pericl.ttf">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
次のコード例は、アプリケーションのフォントをコンテンツ項目として参照する方法を示しています。参照されるコンテンツ項目は、アプリケーションのアセンブリ ファイルと同じディレクトリ内に存在する必要があります。
<TextBlock FontFamily="./#Pericles Light">
Aegean Sea
</TextBlock>
リソース項目としてのフォントの追加
フォントは、アプリケーションのアセンブリ ファイルに埋め込まれたプロジェクト リソース項目としてアプリケーションに追加できます。リソース用に個別のサブディレクトリを使用して、アプリケーションのプロジェクト ファイルを編成できます。個別のサブディレクトリ内のリソース項目としてフォントを定義する方法を次のプロジェクト ファイル例に示します。
<Project DefaultTargets="Build" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<!-- Other project build settings ... -->
<ItemGroup>
<Resource Include="resources\Peric.ttf" />
<Resource Include="resources\Pericl.ttf" />
</ItemGroup>
</Project>
メモ : |
---|
アプリケーションにリソースとしてフォントを追加する場合は、アプリケーションのプロジェクト ファイルに <EmbeddedResource> 要素ではなく、<Resource> 要素を設定していることを確認してください。ビルド アクションで <EmbeddedResource> 要素はサポートされません。 |
アプリケーションのフォント リソースを参照する方法を次のマークアップ例に示します。
<TextBlock FontFamily="./resources/#Pericles Light">
Aegean Sea
</TextBlock>
コードからのフォント リソース項目の参照
コードからフォント リソース項目を参照するには、基本統一リソース識別子 (URI) と、フォントの場所の参照との 2 つの部分で構成される、フォント リソース参照を指定する必要があります。これらの値は、FontFamily メソッドのパラメータして使用されます。プロジェクトの resources というサブディレクトリにある、アプリケーションのフォント リソースを参照する方法を次のコード例に示します。
// The font resource reference includes the base URI reference (application directory level),
// and a relative URI reference.
myTextBlock.FontFamily = new FontFamily(new Uri("pack://application:,,,/"), "./resources/#Pericles Light");
基本統一リソース識別子 (URI) には、フォント リソースが存在する、アプリケーションのサブディレクトリを含めることができます。この場合、フォントの場所の参照でディレクトリを指定する必要はありませんが、先頭に "./" を付けて、基本統一リソース識別子 (URI) で指定するディレクトリと同じディレクトリ内のフォント リソースであることを示す必要があります。次のコード例は、フォント リソース項目を参照する別の方法を示しています。これは前のコード例と同等です。
// The base URI reference can include an application subdirectory.
myTextBlock.FontFamily = new FontFamily(new Uri("pack://application:,,,/resources/"), "./#Pericles Light");
同じアプリケーション サブディレクトリからのフォントの参照
アプリケーションのコンテンツとリソース ファイルは、アプリケーション プロジェクトのユーザー定義の同じサブディレクトリに配置できます。同じサブディレクトリで定義されたコンテンツ ページとフォント リソースを次のプロジェクト ファイル例に示します。
<ItemGroup>
<Page Include="pages\HomePage.xaml" />
</ItemGroup>
<ItemGroup>
<Resource Include="pages\Peric.ttf" />
<Resource Include="pages\Pericl.ttf" />
</ItemGroup>
アプリケーションのコンテンツとフォントが同じディレクトリにあるため、フォント参照はアプリケーションのコンテンツに関連しています。フォントがアプリケーションと同じディレクトリにある場合に、アプリケーションのフォント リソースを参照する方法を次の例に示します。
<TextBlock FontFamily="./#Pericles Light">
Aegean Sea
</TextBlock>
// The font resource reference includes the base Uri (application directory level),
// and the file resource location, which is relative to the base Uri.
myTextBlock.FontFamily = new FontFamily(new Uri("pack://application:,,,/"), "/pages/#Pericles Light");
アプリケーションでのフォントの列挙
アプリケーション内のリソース項目としてフォントを列挙するには、GetFontFamilies または GetTypefaces メソッドを使用します。次の例は、GetFontFamilies メソッドを使用して、アプリケーション フォントの場所から FontFamily のコレクションを返す方法を示しています。ここでは、アプリケーションに "resources" という名前のサブディレクトリが含まれています。
foreach (FontFamily fontFamily in Fonts.GetFontFamilies(new Uri("pack://application:,,,/"), "./resources/"))
{
// Perform action.
}
次の例は、GetTypefaces メソッドを使用して、アプリケーション フォントの場所から Typeface のコレクションを返す方法を示しています。ここでは、アプリケーションに "resources" という名前のサブディレクトリが含まれています。
foreach (Typeface typeface in Fonts.GetTypefaces(new Uri("pack://application:,,,/"), "./resources/"))
{
// Perform action.
}
フォント リソース ライブラリの作成
フォントのみを含むリソース専用ライブラリを作成できます。この種類のライブラリ プロジェクトにはコードは含まれません。リソース専用ライブラリの作成は、リソースを使用するアプリケーション コードからリソースを切り離すための一般的な手法です。また、これにより、複数のアプリケーション プロジェクトでこのライブラリ アセンブリを組み込むことができます。リソース専用ライブラリ プロジェクトの主要部分を次のプロジェクト ファイル例に示します。
<PropertyGroup>
<AssemblyName>FontLibrary</AssemblyName>
<OutputType>library</OutputType>
...
</PropertyGroup>
...
<ItemGroup>
<Resource Include="Kooten.ttf" />
<Resource Include="Pesca.ttf" />
</ItemGroup
リソース ライブラリ内のフォントの参照
アプリケーションからリソース ファイル内のフォントを参照するには、フォント参照の前にライブラリ アセンブリの名前を付加する必要があります。ここでは、フォント リソース アセンブリは "FontLibrary" です。アセンブリ名をアセンブリ内の参照と区切るために、';' 文字を使用します。キーワード "Component" の後にフォント名への参照を続けて追加すると、フォント ライブラリのリソースへの完全参照が完成します。リソース ライブラリ アセンブリ内のフォントを参照する方法を次のコード例に示します。
<Run FontFamily="/FontLibrary;Component/#Kootenay" FontSize="36">
ABCDEFGHIJKLMNOPQRSTUVWXYZ
</Run>
メモ : |
---|
この SDK には、WPF アプリケーションで使用できる一連の OpenType フォントがサンプルとして用意されています。フォントは、リソース専用ライブラリで定義されています。詳細については、「OpenType フォント パックのサンプル」を参照してください。 |
フォントの使用に関する制限事項
WPF アプリケーションでのフォントのパッケージングおよび使用に関するいくつかの制限事項を次に示します。
フォント埋め込みアクセス許可情報 : WPF アプリケーションは、フォント埋め込みアクセス許可情報をチェックまたは強制しません。詳細については、「フォントのパッケージングの概要」を参照してください。
フォントの起点サイト : WPF アプリケーションでは、http または ftp の 統一リソース識別子 (URI) へのフォント参照は許可されていません。
pack: 表記を使用した絶対 URI : WPF アプリケーションでは、フォントへの絶対 統一リソース識別子 (URI) 参照の一部として "pack:" を使用してプログラムで FontFamily オブジェクトを作成することはできません。たとえば、"pack://application:,,,/resources/#Pericles Light" は無効なフォント参照です。
自動フォント埋め込み : デザイン時に、アプリケーションのフォントの使用を検索したり、アプリケーションのリソースにフォントを自動的に埋め込んだりすることはサポートされていません。
フォント サブセット : WPF アプリケーションでは、固定ドキュメント以外でフォント サブセットの作成はサポートされていません。
正しくない参照がある場合、アプリケーションは使用可能なフォントの使用に戻ります。