Empaquetar fuentes con aplicacionesPackaging Fonts with Applications

En este tema se proporciona información general sobre cómo empaquetar fuentes con la aplicación Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF).This topic provides an overview of how to package fonts with your Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) application.

Nota

Como con la mayoría de los tipos de software, los archivos de fuentes se otorgan bajo licencia, no se venden.As with most types of software, font files are licensed, rather than sold. Las licencias que rigen el uso de las fuentes varían de un proveedor a otro, pero en general, la mayoría de las licencias, incluidas las que abarcan las fuentes que Microsoft suministra con las aplicaciones y las ventanas, no permiten incrustar las fuentes dentro de aplicaciones ni redistribuirlas de ningún otro modo.Licenses that govern the use of fonts vary from vendor to vendor but in general most licenses, including those covering the fonts Microsoft supplies with applications and Windows, do not allow the fonts to be embedded within applications or otherwise redistributed. Así pues, como programador, su responsabilidad es asegurarse de disponer de los derechos de licencia necesarios para cualquier fuente que incruste en una aplicación o redistribuya de cualquier otro modo.Therefore, as a developer it is your responsibility to ensure that you have the required license rights for any font you embed within an application or otherwise redistribute.

Introducción al empaquetado de fuentesIntroduction to Packaging Fonts

Puede empaquetar fuentes fácilmente como recursos dentro de las aplicaciones WPFWPF para mostrar el texto de la interfaz de usuario y otros tipos de contenido basado en texto.You can easily package fonts as resources within your WPFWPF applications to display user interface text and other types of text based content. Las fuentes pueden ser independientes de los archivos de ensamblado de la aplicación o incrustadas en dichos archivos.The fonts can be separate from or embedded within the application's assembly files. También puede crear una biblioteca de fuentes solo de recursos, a la que puede hacer referencia la aplicación.You can also create a resource-only font library, which your application can reference.

Las fuentes OpenType y TrueType® contienen una marca de tipo, fsType, que indica los derechos de licencia de incrustación de fuentes para la fuente.OpenType and TrueType® fonts contain a type flag, fsType, that indicates font embedding licensing rights for the font. Sin embargo, este tipo de marca solo hace referencia a fuentes incrustadas almacenadas en un documento: no hace referencia a fuentes incrustadas en una aplicación.However, this type flag only refers to embedded fonts stored in a document–it does not refer to fonts embedded in an application. Puede recuperar los derechos de incrustación de fuentes para una fuente creando un objeto GlyphTypeface y haciendo referencia a su propiedad EmbeddingRights.You can retrieve the font embedding rights for a font by creating a GlyphTypeface object and referencing its EmbeddingRights property. Consulte la sección "OS/2 y métricas de Windows" de la especificación OpenType para obtener más información sobre la marca fstype.Refer to the "OS/2 and Windows Metrics" section of the OpenType Specification for more information on the fsType flag.

El sitio web de tipografía de Microsoft incluye información de contacto que puede ayudarle a encontrar un proveedor de fuentes determinado o a encontrar un proveedor de fuentes para el trabajo personalizado.The Microsoft Typography Web site includes contact information that can help you locate a particular font vendor or find a font vendor for custom work.

Agregar fuentes como elementos de contenidoAdding Fonts as Content Items

Puede agregar las fuentes a la aplicación como elementos de contenido del proyecto independientes de los archivos de ensamblado de la aplicación.You can add fonts to your application as project content items that are separate from the application's assembly files. Esto significa que los elementos de contenido no se incrustan como recursos en un ensamblado.This means that content items are not embedded as resources within an assembly. En el siguiente ejemplo de archivo de proyecto se muestra cómo definir elementos de contenido.The following project file example shows how to define content items.

<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>  

Para asegurarse de que la aplicación puede usar las fuentes en tiempo de ejecución, las fuentes deben ser accesibles en el directorio de implementación de la aplicación.In order to ensure that the application can use the fonts at run time, the fonts must be accessible in the application's deployment directory. El elemento <CopyToOutputDirectory> del archivo de proyecto de la aplicación permite copiar automáticamente las fuentes en el directorio de implementación de la aplicación durante el proceso de compilación.The <CopyToOutputDirectory> element in the application's project file allows you to automatically copy the fonts to the application deployment directory during the build process. En el siguiente ejemplo de archivo de proyecto se muestra cómo copiar las fuentes en el directorio de implementación.The following project file example shows how to copy fonts to the deployment directory.

<ItemGroup>  
  <Content Include="Peric.ttf">  
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>  
  </Content>  
  <Content Include="Pericl.ttf">  
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>  
  </Content>  
</ItemGroup>  

En el ejemplo de código siguiente se muestra cómo hacer referencia a la fuente de la aplicación como un elemento de contenido: el elemento de contenido al que se hace referencia debe estar en el mismo directorio que los archivos de ensamblado de la aplicación.The following code example shows how to reference the application's font as a content item—the referenced content item must be in the same directory as the application's assembly files.

<TextBlock FontFamily="./#Pericles Light">
  Aegean Sea
</TextBlock>

Agregar fuentes como elementos de recursosAdding Fonts as Resource Items

Puede agregar fuentes a la aplicación como elementos de recursos del proyecto incrustados dentro de los archivos de ensamblado de la aplicación.You can add fonts to your application as project resource items that are embedded within the application's assembly files. Usar un subdirectorio independiente para los recursos ayuda a organizar los archivos de proyecto de la aplicación.Using a separate subdirectory for resources helps to organize the application's project files. En el siguiente ejemplo de archivo de proyecto se muestra cómo definir las fuentes como elementos de recursos en un subdirectorio independiente.The following project file example shows how to define fonts as resource items in a separate subdirectory.

<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>  

Nota

Al agregar fuentes como recursos a la aplicación, asegúrese de que está estableciendo el elemento <Resource>, y no el elemento <EmbeddedResource> en el archivo de proyecto de la aplicación.When you add fonts as resources to your application, make sure you are setting the <Resource> element, and not the <EmbeddedResource> element in your application's project file. No se admite el elemento <EmbeddedResource> para la acción de compilación.The <EmbeddedResource> element for the build action is not supported.

En el ejemplo de marcado siguiente se muestra cómo hacer referencia a los recursos de fuentes de la aplicación.The following markup example shows how to reference the application's font resources.

<TextBlock FontFamily="./resources/#Pericles Light">
  Aegean Sea
</TextBlock>

Hacer referencia a elementos de recursos de fuentes desde el códigoReferencing Font Resource Items from Code

Para hacer referencia a elementos de recursos de fuentes desde el código, debe proporcionar una referencia de recurso de fuente de dos partes: el @no__t base-0; y la referencia de la ubicación de fuentes.In order to reference font resource items from code, you must supply a two-part font resource reference: the base identificador de recursos uniforme (URI)uniform resource identifier (URI); and the font location reference. Estos valores se usan como parámetros para el método FontFamily.These values are used as the parameters for the FontFamily method. En el ejemplo de código siguiente se muestra cómo hacer referencia a los recursos de fuente de la aplicación en el subdirectorio del proyecto denominado resources.The following code example shows how to reference the application's font resources in the project subdirectory called 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")

El @no__t base-0 puede incluir el subdirectorio de la aplicación donde reside el recurso de fuente.The base identificador de recursos uniforme (URI)uniform resource identifier (URI) can include the application subdirectory where the font resource resides. En este caso, la referencia de ubicación de fuentes no necesitaría especificar un directorio, pero tendría que incluir un "./" inicial, que indica que el recurso de fuente está en el mismo directorio especificado por el @no__t de base-1.In this case, the font location reference would not need to specify a directory, but would have to include a leading "./", which indicates the font resource is in the same directory specified by the base identificador de recursos uniforme (URI)uniform resource identifier (URI). En el ejemplo de código siguiente se muestra una manera alternativa de hacer referencia al elemento de recursos de fuentes: es equivalente al ejemplo de código anterior.The following code example shows an alternate way of referencing the font resource item—it is equivalent to the previous code example.

// 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")

Hacer referencia a fuentes desde el mismo subdirectorio de aplicaciónReferencing Fonts from the Same Application Subdirectory

Puede colocar archivos de contenido y de recursos de aplicación dentro del mismo subdirectorio definido por el usuario del proyecto de la aplicación.You can place both application content and resource files within the same user-defined subdirectory of your application project. En el siguiente ejemplo de archivo de proyecto se muestra una página de contenido y recursos de fuentes definidos en el mismo subdirectorio.The following project file example shows a content page and font resources defined in the same subdirectory.

<ItemGroup>  
  <Page Include="pages\HomePage.xaml" />  
</ItemGroup>  
<ItemGroup>  
  <Resource Include="pages\Peric.ttf" />  
  <Resource Include="pages\Pericl.ttf" />  
</ItemGroup>  

Puesto que el contenido de la aplicación y la fuente están en el mismo subdirectorio, la referencia de fuentes está relacionada con el contenido de la aplicación.Since the application content and font are in the same subdirectory, the font reference is relative to the application content. En los ejemplos siguientes se muestra cómo hacer referencia a recursos de fuentes de la aplicación cuando la fuente está en el mismo directorio que la aplicación.The following examples show how to reference the application's font resource when the font is in the same directory as the application.

<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")

Enumerar fuentes en una aplicaciónEnumerating Fonts in an Application

Para enumerar las fuentes como elementos de recursos en la aplicación, use el método GetFontFamilies o GetTypefaces.To enumerate fonts as resource items in your application, use either the GetFontFamilies or GetTypefaces method. En el ejemplo siguiente se muestra cómo utilizar el método GetFontFamilies para devolver la colección de objetos FontFamily desde la ubicación de fuentes de la aplicación.The following example shows how to use the GetFontFamilies method to return the collection of FontFamily objects from the application font location. En este caso, la aplicación contiene un subdirectorio llamado "resources".In this case, the application contains a subdirectory named "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

En el ejemplo siguiente se muestra cómo utilizar el método GetTypefaces para devolver la colección de objetos Typeface desde la ubicación de fuentes de la aplicación.The following example shows how to use the GetTypefaces method to return the collection of Typeface objects from the application font location. En este caso, la aplicación contiene un subdirectorio llamado "resources".In this case, the application contains a subdirectory named "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

Crear una biblioteca de recursos de fuentesCreating a Font Resource Library

Puede crear una biblioteca solo de recursos que contenga solo fuentes: ningún código forma parte de este tipo de proyecto de biblioteca.You can create a resource-only library that contains only fonts—no code is part of this type of library project. Crear una biblioteca solo de recursos es una técnica común para desacoplar los recursos del código de aplicación que los usa.Creating a resource-only library is a common technique for decoupling resources from the application code that uses them. Esto también permite que el ensamblado de biblioteca se incluya con varios proyectos de aplicación.This also allows the library assembly to be included with multiple application projects. En el siguiente ejemplo de archivo de proyecto se muestran las partes clave de un proyecto de biblioteca solo de recursos.The following project file example shows the key portions of a resource-only library project.

<PropertyGroup>  
  <AssemblyName>FontLibrary</AssemblyName>  
  <OutputType>library</OutputType>  
  ...  
</PropertyGroup>  
...  
<ItemGroup>  
  <Resource Include="Kooten.ttf" />  
  <Resource Include="Pesca.ttf" />  
</ItemGroup  

Hacer referencia a una fuente en una biblioteca de recursosReferencing a Font in a Resource Library

Para hacer referencia a una fuente en una biblioteca de recursos de la aplicación, debe anteponer la referencia de la fuente con el nombre del ensamblado de la biblioteca.To reference a font in a resource library from your application, you must prefix the font reference with the name of the library assembly. En este caso, el ensamblado de recursos de fuentes es "FontLibrary".In this case, the font resource assembly is "FontLibrary". Para separar el nombre del ensamblado de la referencia dentro del ensamblado, use un carácter ";".To separate the assembly name from the reference within the assembly, use a ';' character. Agregar la palabra clave "Component" seguida de la referencia al nombre de la fuente completa toda la referencia en el recurso de la biblioteca de fuentes.Adding the "Component" keyword followed by the reference to the font name completes the full reference to the font library's resource. En el ejemplo de código siguiente se muestra cómo hacer referencia a una fuente en un ensamblado de biblioteca de recursos.The following code example shows how to reference a font in a resource library assembly.

<Run FontFamily="/FontLibrary;Component/#Kootenay" FontSize="36">
  ABCDEFGHIJKLMNOPQRSTUVWXYZ
</Run>

Nota

Este SDK contiene un conjunto de fuentes OpenType de ejemplo que puede usar con aplicaciones WPFWPF.This SDK contains a set of sample OpenType fonts that you can use with WPFWPF applications. Las fuentes se definen en una biblioteca solo de recursos.The fonts are defined in a resource-only library. Para obtener más información, vea Paquete de fuentes OpenType de ejemplo.For more information, see Sample OpenType Font Pack.

Limitaciones de uso de fuentesLimitations on Font Usage

En la lista siguiente se describen varias limitaciones en el empaquetado y el uso de fuentes en aplicaciones WPFWPF:The following list describes several limitations on the packaging and use of fonts in WPFWPF applications:

  • Bits de permisos de incrustación de fuentes: las aplicaciones WPFWPF no comprueban ni exigen ningún bit de permisos de incrustación de fuentes.Font embedding permission bits: WPFWPF applications do not check or enforce any font embedding permission bits. Vea la sección fuentes de Introduction_to_Packing para obtener más información.See the Introduction_to_Packing Fonts section for more information.

  • Fuentes de sitio de origen: las aplicaciones WPFWPF no permiten una referencia de fuente a un @no__t de http o FTP-2.Site of origin fonts: WPFWPF applications do not allow a font reference to an http or ftp identificador de recursos uniforme (URI)uniform resource identifier (URI).

  • El URI absoluto que usa las aplicaciones Pack: Notation: WPFWPF no permite crear un objeto FontFamily mediante programación con "Pack:" como parte de la referencia absoluta identificador de recursos uniforme (URI)uniform resource identifier (URI) a una fuente.Absolute URI using the pack: notation: WPFWPF applications do not allow you to create a FontFamily object programmatically using "pack:" as part of the absolute identificador de recursos uniforme (URI)uniform resource identifier (URI) reference to a font. Por ejemplo, "pack://application:,,,/resources/#Pericles Light" es una referencia de fuente no válida.For example, "pack://application:,,,/resources/#Pericles Light" is an invalid font reference.

  • Incrustación de fuentes automática: Durante el tiempo de diseño, no hay compatibilidad para buscar el uso de las aplicaciones de las fuentes e incrustar automáticamente las fuentes en los recursos de la aplicación.Automatic font embedding: During design time, there is no support for searching an application's use of fonts and automatically embedding the fonts in the application's resources.

  • Subconjuntos de fuentes: las aplicaciones WPFWPF no admiten la creación de subconjuntos de fuentes para documentos no fijos.Font subsets: WPFWPF applications do not support the creation of font subsets for non-fixed documents.

  • En casos donde hay una referencia incorrecta, la aplicación vuelve a usar una fuente disponible.In cases where there is an incorrect reference, the application falls back to using an available font.

Vea tambiénSee also