Vue d’ensemble

De nombreux formats de documents sont étroitement liés aux polices. Par exemple, lorsqu’un utilisateur ajoute du texte à un document DOCX, ce texte possède toujours une police définie. Certains formats de documents stockent généralement les données de la police intégrées dans le fichier du document lui‑même, comme le PDF. Mais d’autres, comme les formats de la famille Office, reposent habituellement sur les polices installées dans le système d’exploitation.

Il existe également de nombreux formats de polices. Par exemple, la plupart des polices installées sont présentées aux formats TTF (TrueType) et OTF (OpenType). Les documents Office Open XML utilisent également le format EOT (Embedded OpenType). Sur le web, les formats les plus utilisés sont toutefois WOFF et WOFF2.

Table des matières

Obtention de toutes les polices utilisées

La fonctionnalité la plus utile dans le domaine des polices consiste à les lister et les renvoyer. GroupDocs.Viewer fournit une méthode spéciale GetAllFonts() — une fois le document chargé dans une instance de la classe Viewer, appelez cette méthode pour obtenir la liste de toutes les polices utilisées dans le document. Dans la liste renvoyée, chaque police sera présentée sous forme d’une instance du type qui implémente l’interface IFontInfo. Cette interface contient des propriétés communes à toutes les polices possibles : le nom de famille, le style, le format et le contenu binaire.

Les familles de formats spécifiques, comme WordProcessing, Spreadsheet, Presentation et PDF, possèdent des implémentations spécialisées de l’interface IFontInfo ; ces implémentations fournissent davantage de données propres à chaque famille de formats. Par exemple, les types WordProcessingFontInfo, PresentationFontInfo et PdfFontInfo contiennent la propriété booléenne IsEmbedded — un indicateur qui précise où la police est stockée (intégrée dans le corps du document chargé ou installée dans l’OS). Le type SpreadsheetFontInfo contient de nombreuses informations propres aux feuilles de calcul : sa couleur, si elle est soulignée ou barrée. WordProcessingFontInfo peut contenir le nom de famille alternatif. Etc.

Un petit exemple est présenté ci‑dessous :

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);
    }
}

Veuillez noter que l’extraction des polices n’est prise en charge que pour les familles de formats WordProcessing, Spreadsheet, Presentation et PDF ; pour tous les autres formats de documents, la méthode GetAllFonts() renvoie un tableau vide.

Traitement des polices manquantes

La situation où un document créé sur la machine de l’auteur utilise une police « AAA », puis est traité avec GroupDocs.Viewer sur la machine du client où la police « AAA » est absente, est très courante. Dans ce cas, GroupDocs.Viewer tente de substituer cette police en appliquant des règles complexes de substitution : il analyse les métadonnées du document, les noms alternatifs de la police manquante, les paramètres du document, ceux du système d’exploitation, la liste de toutes les polices disponibles installées dans l’OS, etc. Enfin, si pour une raison quelconque l’OS est « propre », c’est‑à‑dire sans aucune police installée, GroupDocs.Viewer substituera la police manquante par celle intégrée dans l’assembly (DLL) de GroupDocs.Viewer ; cette police servira de « dernier recours » lorsqu’aucune autre police n’est disponible. Par exemple, pour les formats de la famille WordProcessing, GroupDocs.Viewer stocke en interne la police libre « Fanwood ».

À ce stade, GroupDocs.Viewer effectue l’opération de substitution de police « silencieusement » durant le rendu du document (lorsque la méthode Viewer.View() est invoquée) — il n’y a aucun message ni événement indiquant que le mécanisme de substitution a été activé, quelle police était manquante, par laquelle elle a été remplacée, ni pour quel document précis. Cette fonctionnalité est difficile à implémenter car il n’est pas clair quels types de notifications doivent être émis, sous quelle forme et comment le client pourrait les exploiter.

Néanmoins, GroupDocs.Viewer propose deux solutions : spécifier manuellement la police manquante ou substituer manuellement la police manquante.

Spécification d’une police manquante

Lorsque l’utilisateur sait d’abord qu’un document utilise la police « AAA », qu’il sait également que cette police n’est pas installée sur la machine cible où le document doit être rendu, et qu’il possède le contenu binaire de cette police « AAA », il peut la spécifier avant d’appeler la méthode Viewer.View().

Pour spécifier une ou plusieurs polices personnalisées qui ne sont pas installées dans le système d’exploitation cible, l’utilisateur doit ajouter des source(s) de police. Une source de police est en fait un dossier où se trouvent une ou plusieurs polices. Elle est représentée par la classe FolderFontSource. La classe FontSettings possède la méthode SetFontSources() permettant d’ajouter les sources de police à GroupDocs.Viewer.

Le fragment de code suivant illustre cela. Supposons que le document sample.docx utilise une police rare « AAA.ttf » qui n’est pas installée sur le système d’exploitation cible. L’utilisateur place alors le fichier « AAA.ttf » dans le dossier C:\custom_fonts, crée une instance de la classe FolderFontSource pointant vers ce dossier, puis transmet cette instance à la classe statique FontSettings. Enfin le fichier sample.docx est rendu au format HTML. En résultat, la police « AAA » sera utilisée dans le document HTML produit.

using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
using GroupDocs.Viewer.Fonts;
// ...

// Spécifier la source de police.
FolderFontSource fontSource = 
    new FolderFontSource(@"C:\custom_fonts", SearchOption.TopFolderOnly);
FontSettings.SetFontSources(fontSource);

using (Viewer viewer = new Viewer("sample.docx"))
{
    // Créer un fichier HTML.
    HtmlViewOptions viewOptions = HtmlViewOptions.ForEmbeddedResources();
    viewer.View(viewOptions);
}

Remplacement de la police manquante

Lorsque l’utilisateur sait qu’un document utilise la police « AAA », qu’il sait que cette police n’est pas installée sur la machine cible, mais qu’il n’a pas accès au contenu binaire de « AAA », il peut spécifier une autre police « BBB » qui sera utilisée à la place de la police manquante « AAA ». Cette fois‑ci, la configuration se fait via les options de rendu, qui sont ensuite passées à la méthode Viewer.View().

Cette option s’appelle DefaultFontName ; il s’agit d’une propriété de type chaîne déclarée dans la classe abstraite BaseViewOptions, commune à toutes les options de rendu : HtmlViewOptions, PdfViewOptions, PngViewOptions et JpgViewOptions.

Lorsque cette option est définie, GroupDocs.Viewer utilise la police spécifiée pendant le rendu à la place de toute police indisponible. Par exemple, si le document comprend une police contenant des caractères non‑anglais, définissez le nom de police par défaut afin que GroupDocs.Viewer remplace toute police manquante par une police possédant le même jeu de caractères. Bien sûr, la police dont le nom est indiqué dans la propriété DefaultFontName doit être installée sur le système d’exploitation où le rendu est effectué.

Le fragment de code suivant montre comment définir le nom de police par défaut :

using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...

using (Viewer viewer = new Viewer("sample.pptx"))
{
    // Créer les options de rendu HTML avec ressources intégrées
    HtmlViewOptions viewOptions = HtmlViewOptions.ForEmbeddedResources();
   
    // Spécifier le nom de police par défaut dans les options
    viewOptions.DefaultFontName = "Courier New";
    
    // Rendre le PPTX d’entrée en HTML de sortie
    viewer.View(viewOptions);
}          

Exclusion des polices pour le HTML

Lors du rendu de documents au format HTML, GroupDocs.Viewer exporte par défaut toutes les polices utilisées dans le document HTML. Cela garantit un affichage correct, même si les polices requises ne sont pas présentes sur le dispositif de visualisation. Les polices peuvent être stockées dans le document HTML résultant comme ressources externes (HtmlViewOptions.ForExternalResources) ou être intégrées directement dans le balisage HTML à l’aide du schéma URI de données via l’encodage base64 (HtmlViewOptions.ForEmbeddedResources). L’exportation des polices vers le format HTML est prise en charge par presque tous les formats de documents qui gèrent eux‑mêmes les polices : Microsoft Office (sauf Excel), formats OpenDocument, e‑mails, PDF, livres numériques, etc.

Cependant, cette fonctionnalité est parfois indésirable. En effet, lorsque les polices sont incorporées, la taille du document HTML généré augmente considérablement. Ainsi, si la machine ou le dispositif cible où le document HTML doit être affiché possède déjà toutes les polices utilisées, le navigateur peut simplement recourir aux polices installées localement.

Pour répondre à ce besoin, GroupDocs.Viewer offre la possibilité d’exclure les polices du document HTML produit, ce qui peut être réalisé de deux manières : exclure toutes les polices ou exclure uniquement certaines polices.

Ces deux options sont exprimées dans la classe HtmlViewOptions sous forme de propriétés distinctes :

  • ExcludeFonts est un indicateur qui désactive l’exportation de toutes les polices utilisées vers le document HTML produit lorsqu’il est activé (true). Par défaut, cette option est désactivée (false).
  • FontsToExclude est une collection de chaînes, chacune représentant le nom d’une police à exclure du document HTML produit. Par défaut, cette liste est vide — aucune police n’est exclue. Notez que cette option ne fonctionne que si la propriété ExcludeFonts est désactivée (false).

Deux extraits de code ci‑dessous illustrent ces possibilités : le premier montre l’utilisation de ExcludeFonts, le second celle de FontsToExclude.

using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...

using (Viewer viewer = new Viewer("sample.docx"))
{
    // Créer un fichier HTML.
    var viewOptions = HtmlViewOptions.ForEmbeddedResources();    
    viewOptions.ExcludeFonts = true;
    viewer.View(viewOptions);
}
using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...

using (Viewer viewer = new Viewer("presentation.pptx"))
{
    // Créer un fichier HTML.
    var viewOptions = HtmlViewOptions.ForEmbeddedResources();    
    viewOptions.FontsToExclude.Add("Times New Roman"); // Exclure la police Times New Roman.
    viewOptions.FontsToExclude.Add("Arial"); // Exclure la police Arial.
    viewer.View(viewOptions);
}

Conclusion

GroupDocs.Viewer se concentre principalement sur le rendu de documents de différents formats vers les formats « visibles » les plus répandus — HTML, PDF, JPEG et PNG. Au cours des derniers mois, nous avons ajouté plusieurs fonctionnalités utiles relatives au traitement des polices, permettant d’inspecter les polices utilisées, de régler leur exportation et d’ajuster la substitution de polices.

Voir aussi

Obtenir un essai gratuit

Vous pouvez télécharger une version d’essai gratuite de GroupDocs.Viewer pour .NET depuis releases.groupdocs.com. Vous pouvez également obtenir une licence temporaire pour tester toutes les fonctionnalités sans restriction ici.