アプリケーションでのフォントのパッケージング

このトピックでは、Windows Presentation Foundation (WPF) アプリケーションでフォントをパッケージ化する方法について概説します。

注意

多くの種類のソフトウェアと同様に、フォント ファイルは、販売されるのではなくライセンスされます。 フォントの使用を管理するライセンスはベンダーによって異なりますが、Microsoft からアプリケーションや Windows で提供されているフォントをカバーするライセンスも含めて、通常、ほとんどのライセンスでは、フォントをアプリケーションに埋め込んだり、別の方法で再頒布したりすることは許可されていません。 したがって、開発者としては、フォントをアプリケーション内に埋め込む場合や別の方法でフォントを再頒布する場合、それらフォントに必要なライセンス権限を取得する責任があります。

フォントのパッケージングの概要

ユーザー インターフェイスのテキストやその他の種類のテキスト ベースのコンテンツを表示するために、WPF アプリケーションのリソースとしてフォントを簡単にパッケージ化できます。 フォントは、アプリケーションのアセンブリ ファイルと別にすることも、その中に埋め込むこともできます。 アプリケーションから参照できる、リソース専用のフォント ライブラリを作成することもできます。

OpenType フォントと TrueType® フォントには、各フォントにおけるフォント埋め込みのライセンス権限を示す、型フラグ fsType が含まれています。 しかし、この型フラグはドキュメントに格納された埋め込みフォントのみを参照し、アプリケーションに埋め込まれたフォントは参照しません。 フォントの埋め込み権限を取得するには、GlyphTypeface オブジェクトを作成し、その EmbeddingRights プロパティを参照します。 fsType フラグの詳細については、OpenType の仕様に関する記事の OS/2 と Windows のメトリックスに関するセクションを参照してください。

Microsoft タイポグラフィの Web サイトには、特定のフォント ベンダーを探し出したり、カスタム作業に必要なフォント ベンダーを見つけたりするのに役立つ連絡情報が含まれています。

コンテンツ項目としてのフォントの追加

フォントは、アプリケーションのアセンブリ ファイルとは別のプロジェクト コンテンツ項目としてアプリケーションに追加できます。 つまり、コンテンツ項目はアセンブリ内にリソースとして埋め込まれません。 コンテンツ項目を定義する方法を次のプロジェクト ファイル例に示します。

<Project DefaultTargets="Build"  
                xmlns="http://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="http://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>

コードからのフォント リソース項目の参照

コードからフォント リソース項目を参照するには、基本の Uniform Resource Identifier (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");
' 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")

基本の Uniform Resource Identifier (URI) には、フォント リソースが存在するアプリケーションのサブディレクトリを含めることができます。 この場合、フォントの場所の参照でディレクトリを指定する必要はありませんが、基本の Uniform Resource Identifier (URI) で指定されているディレクトリと同じディレクトリ内にフォント リソースがあることを示すために、先頭に "./" を付加する必要があります。 次のコード例は、フォント リソース項目を参照する別の方法を示しています。これは前のコード例と同等です。

// The base URI reference can include an application subdirectory.
myTextBlock.FontFamily = new FontFamily(new Uri("pack://application:,,,/resources/"), "./#Pericles Light");
' 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");
' 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.
}
For Each fontFamily As FontFamily In Fonts.GetFontFamilies(New Uri("pack://application:,,,/"), "./resources/")
    ' Perform action.
Next fontFamily

次の例では、GetTypefaces メソッドを使用して、アプリケーション フォントの場所から Typeface オブジェクトのコレクションを返す方法を示します。 ここでは、アプリケーションに "resources" という名前のサブディレクトリが含まれています。

foreach (Typeface typeface in Fonts.GetTypefaces(new Uri("pack://application:,,,/"), "./resources/"))
{
    // Perform action.
}
For Each typeface As Typeface In Fonts.GetTypefaces(New Uri("pack://application:,,,/"), "./resources/")
    ' Perform action.
Next typeface

フォント リソース ライブラリの作成

フォントのみを含むリソース専用ライブラリを作成できます。この種類のライブラリ プロジェクトにはコードは含まれません。 リソース専用ライブラリの作成は、リソースを使用するアプリケーション コードからリソースを切り離すための一般的な手法です。 また、これにより、複数のアプリケーション プロジェクトでこのライブラリ アセンブリを組み込むことができます。 次のプロジェクト ファイル例に、リソース専用ライブラリ プロジェクトの主要部分を示します。

<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 の Uniform Resource Identifier (URI) へのフォント参照は許可されていません。

  • pack: 表記を使用した絶対 URI: WPF アプリケーションでは、フォントへの絶対 Uniform Resource Identifier (URI) 参照の一部として "pack:" を使用してプログラムで FontFamily オブジェクトを作成することはできません。 たとえば、"pack://application:,,,/resources/#Pericles Light" は無効なフォント参照です。

  • 自動フォント埋め込み: デザイン時に、アプリケーションのフォントの使用を検索したり、アプリケーションのリソースにフォントを自動的に埋め込んだりすることはサポートされていません。

  • フォント サブセット: WPF アプリケーションでは、固定ドキュメント以外でフォント サブセットの作成はサポートされていません。

  • 正しくない参照がある場合、アプリケーションは使用可能なフォントの使用に戻ります。

関連項目