Visión general
Muchos formatos de documentos están estrechamente ligados a las fuentes. Por ejemplo, cuando un usuario agrega texto a un documento DOCX, ese texto siempre tiene una fuente definida. Algunos formatos de documento suelen almacenar los datos de la fuente incrustados en el propio archivo, como PDF. Pero otros, como los formatos de la familia Office, generalmente dependen de las fuentes instaladas en el sistema operativo.
También existen numerosos formatos de fuentes. Por ejemplo, la mayoría de las fuentes instaladas se presentan en formatos TTF (TrueType) y OTF (OpenType). Los documentos Office Open XML también trabajan con el formato EOT (Embedded OpenType). En la web, sin embargo, WOFF y WOFF2 son los formatos más utilizados.
Tabla de contenido
- Visión general
- Obtener todas las fuentes usadas
- Procesar las fuentes faltantes
- Especificar la fuente faltante
- Reemplazar la fuente faltante
- Excluir las fuentes para HTML
- Conclusión
- Ver también
- Obtener una prueba gratuita
Obtener todas las fuentes usadas
La característica más útil en el contexto de fuentes es listarlas y devolverlas. GroupDocs.Viewer proporciona un método especial GetAllFonts() — cuando el documento se carga en una instancia de la clase Viewer, llame a este método para obtener una lista de todas las fuentes utilizadas en dicho documento. En la lista devuelta, cada fuente se presenta como una instancia del tipo que implementa la interfaz IFontInfo. Esta interfaz contiene propiedades comunes para cualquier fuente posible: nombre de familia, estilo, formato y contenido binario.
Familias específicas de formatos, como WordProcessing, Spreadsheet, Presentation y PDF, tienen implementaciones especializadas de la IFontInfo; estas implementaciones proporcionan datos adicionales específicos de cada familia de formatos. Por ejemplo, los tipos WordProcessingFontInfo, PresentationFontInfo y PdfFontInfo contienen la propiedad booleana IsEmbedded, que indica dónde está almacenada la fuente (si está incrustada en el cuerpo del documento cargado o instalada en el SO). El tipo SpreadsheetFontInfo contiene muchos datos de fuente propios de hojas de cálculo: su color, si está subrayada o tachada. WordProcessingFontInfo puede contener el nombre alternativo de la familia. Y así sucesivamente.
A continuación se muestra un ejemplo corto:
using GroupDocs.Viewer;
// ...
const string filename = "sample.docx";
string inputPath = "\full\path\" + filename;
using (Viewer viewer = new Viewer(inputPath))
{
Fonts.IFontInfo[] allFonts = viewer.GetAllFonts();
Console.WriteLine("{0} fonts found in the '{1}' document", allFonts.Length, filename);
foreach (Fonts.IFontInfo font in allFonts)
{
Console.WriteLine("Font '{0}' of '{1}' style has {2} bytes and is of '{3}' format",
font.FamilyName,
font.Style,
font.Content.Length,
font.Format);
}
}
Tenga en cuenta que la extracción de fuentes solo es compatible con las familias de formatos WordProcessing, Spreadsheet, Presentation y PDF; para cualquier otro formato de documento, el método GetAllFonts() devuelve una matriz vacía.
Procesar las fuentes faltantes
La situación en la que un documento se creó en la máquina del autor y utiliza una fuente “AAA”, y luego se procesa con GroupDocs.Viewer en la máquina del cliente, donde la fuente “AAA” no está presente, es típica. En ese caso GroupDocs.Viewer intenta sustituir esa fuente mediante reglas complejas de sustitución: analiza los metadatos del documento, nombres alternativos de la fuente faltante, configuraciones del documento, configuraciones del SO, lista de todas las fuentes disponibles instaladas en el SO, etc. Finalmente, si por alguna razón el SO está “limpio”, sin fuentes instaladas, GroupDocs.Viewer sustituirá la fuente faltante por una que está incrustada dentro del ensamblado (DLL) de GroupDocs.Viewer; esta fuente sirve como último recurso cuando no hay otras fuentes disponibles. Por ejemplo, para la familia de formatos WordProcessing, GroupDocs.Viewer almacena internamente la fuente gratuita “Fanwood”.
En este momento GroupDocs.Viewer realiza la operación de sustitución de fuentes de forma silenciosa durante la renderización del documento (cuando se invoca el método Viewer.View()) — no se generan mensajes ni eventos que indiquen que el mecanismo de sustitución se activó, qué fuente faltaba y por cuál se reemplazó, ni para qué documento exacto. Esta funcionalidad es difícil de implementar porque no está claro qué tipo de notificación debería emitirse, en qué forma y cómo el cliente podría usarla.
Sin embargo, GroupDocs.Viewer ofrece a los usuarios dos formas posibles de resolver esta situación: especificar manualmente la fuente faltante y sustituir manualmente la fuente faltante.
Especificar la fuente faltante
Cuando el usuario inicialmente sabe que un documento usa la fuente “AAA”, y también sabe que esa fuente “AAA” no está instalada en la máquina objetivo donde se debe renderizar el documento, y el usuario posee el contenido binario de esa fuente “AAA”, puede especificarla antes de llamar al método Viewer.View().
Para especificar una o varias fuentes personalizadas que no están instaladas en el sistema operativo objetivo, el usuario debe agregar fuentes personalizadas. Una fuente fuente (font source) es, en realidad, una carpeta donde se encuentran una o varias fuentes. Se representa mediante la clase FolderFontSource. La clase FontSettings posee el método SetFontSources() para agregar fuentes fuentes al GroupDocs.Viewer.
El siguiente fragmento de código lo muestra. Supongamos que el documento “sample.docx” usa una fuente rara “AAA.ttf”, que no está instalada en el sistema operativo objetivo. Entonces el usuario coloca el archivo “AAA.ttf” en la carpeta "C:\custom_fonts" y crea una instancia de la clase FolderFontSource que apunta a esa carpeta. Esa instancia se pasa a la clase estática FontSettings, y luego el archivo “sample.docx” se renderiza al formato HTML. Como resultado, la fuente “AAA” se utilizará en el documento HTML de salida.
using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
using GroupDocs.Viewer.Fonts;
// ...
// Specify the font source.
FolderFontSource fontSource =
new FolderFontSource(@"C:\custom_fonts", SearchOption.TopFolderOnly);
FontSettings.SetFontSources(fontSource);
using (Viewer viewer = new Viewer("sample.docx"))
{
// Create an HTML file.
HtmlViewOptions viewOptions = HtmlViewOptions.ForEmbeddedResources();
viewer.View(viewOptions);
}
Reemplazar la fuente faltante
Cuando el usuario inicialmente sabe que un documento usa la fuente “AAA”, y también sabe que esa fuente “AAA” no está instalada en la máquina objetivo, pero no tiene acceso al contenido binario de esa fuente “AAA”, puede especificar otra fuente “BBB”, que se usará en lugar de la fuente faltante “AAA”. A diferencia del caso anterior, esto se hace mediante las opciones de vista, que luego se pasan al método Viewer.View().
Esta opción se llama “DefaultFontName”, es una propiedad de tipo cadena declarada en la clase abstracta BaseViewOptions, por lo que es común a todas las opciones de renderizado: HtmlViewerOptions, PdfViewOptions, PngViewOptions y JpgViewOptions.
Cuando se especifica esta opción, GroupDocs.Viewer utiliza esa fuente durante la renderización en lugar de cualquier fuente no disponible. Por ejemplo, si el documento incluye una fuente con caracteres no ingleses, indique el nombre de la fuente predeterminada para garantizar que GroupDocs.Viewer reemplace cualquier fuente faltante por una que tenga el mismo conjunto de caracteres. Por supuesto, la fuente cuyo nombre se indique en la propiedad DefaultFontName debe estar instalada en el sistema operativo donde GroupDocs.Viewer renderiza el documento.
El siguiente fragmento de código muestra cómo establecer el nombre de la fuente predeterminada:
using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...
using (Viewer viewer = new Viewer("sample.pptx"))
{
// Create options for rendering HTML document with embedded resources
HtmlViewOptions viewOptions = HtmlViewOptions.ForEmbeddedResources();
// Specify a default font name is the options
viewOptions.DefaultFontName = "Courier New";
// Render input PPTX to output HTML
viewer.View(viewOptions);
}
Excluir las fuentes para HTML
Al renderizar documentos al formato HTML, GroupDocs.Viewer exporta por defecto todas las fuentes usadas al documento HTML. Esto garantiza una visualización correcta independientemente de que las fuentes requeridas existan en el dispositivo del visor. Las fuentes pueden almacenarse en el documento HTML resultante como recursos externos (HtmlViewOptions.ForExternalResources) o incrustarse directamente en el marcado HTML mediante el esquema data URI a través de codificación base64 (HtmlViewOptions.ForEmbeddedResources). La exportación de fuentes a HTML está soportada por casi todos los formatos de documentos que manejan fuentes: Microsoft Office (excepto Excel), formatos OpenDocument, correos electrónicos, PDF, libros electrónicos, etc.
Sin embargo, a veces esta funcionalidad no es deseada. Cuando las fuentes están incluidas, aumentan significativamente el tamaño del documento HTML producido. Así, si la máquina o dispositivo objetivo donde se mostrará el HTML ya tiene instaladas todas las fuentes usadas, el navegador puede utilizar esas fuentes del sistema.
Para atender estas necesidades, GroupDocs.Viewer permite excluir fuentes del documento HTML generado, y esto puede hacerse de dos maneras: excluir todas las fuentes y excluir solo fuentes específicas.
Ambas opciones se representan en la clase HtmlViewOptions como propiedades distintas:
ExcludeFontses una bandera que desactiva la exportación de todas las fuentes usadas al HTML producido, cuando está habilitada (true). Por defecto está deshabilitada (false).FontsToExcludees una lista de cadenas, cada una representa un nombre de fuente que debe excluirse del HTML generado. Por defecto la lista está vacía — no se excluye ninguna fuente. Tenga en cuenta que esta opción solo funciona si la propiedadExcludeFontsestá desactivada (false).
A continuación se muestran dos fragmentos de código que demuestran ambas posibilidades: el primero usa ExcludeFonts, y el segundo — FontsToExclude.
using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...
using (Viewer viewer = new Viewer("sample.docx"))
{
// Create an HTML file.
var viewOptions = HtmlViewOptions.ForEmbeddedResources();
viewOptions.ExcludeFonts = true;
viewer.View(viewOptions);
}
using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...
using (Viewer viewer = new Viewer("presentation.pptx"))
{
// Create an HTML file.
var viewOptions = HtmlViewOptions.ForEmbeddedResources();
viewOptions.FontsToExclude.Add("Times New Roman");// Exclude the Times New Roman font.
viewOptions.FontsToExclude.Add("Arial");// Exclude the Arial font.
viewer.View(viewOptions);
}
Conclusión
GroupDocs.Viewer se centra principalmente en renderizar documentos de diferentes formatos a los formatos “visualizables” más comunes — HTML, PDF, JPEG y PNG. Pero durante el último período añadimos varias funciones útiles relacionadas con el procesamiento de fuentes que permiten revisar y examinar las fuentes usadas, afinar su exportación y ajustar la sustitución de fuentes.
Ver también
- Obtener todas las fuentes usadas en el documento cargado
- Establecer fuentes personalizadas
- Reemplazar fuente faltante
- Excluir fuentes al renderizar a HTML
Obtener una prueba gratuita
Puede descargar una versión de prueba gratuita de GroupDocs.Viewer para .NET desde releases.groupdocs.com. También puede obtener una licencia temporal para probar todas las funciones y características sin restricciones desde aquí.