Définir la police pour une séquence de texte
Cette rubrique montre comment utiliser les classes du Kit de développement logiciel (SDK) Open XML pour Office afin de définir la police d’une partie du texte dans un document de traitement de texte par programmation.
Packages et parties de documents
Un document Open XML est stocké en tant que package, dont le format est défini par la norme ISO/IEC 29500-2. Le package peut contenir plusieurs parties avec des relations entre elles. La relation entre les parties détermine la catégorie du document. Un document peut être défini comme un document de traitement de texte si son élément de relation de package contient une relation avec une partie principale de document. Si son élément de relation de package contient une relation avec une partie de présentation, il peut être défini comme un document de présentation. Si son élément de relation de package contient une relation avec une partie de classeur, il est défini en tant que feuille de calcul. Dans cette rubrique de procédures, vous allez utiliser un package de documents de traitement de texte.
Créer un objet WordprocessingDocument
L’exemple de code ouvre un package de document de traitement de texte en passant un nom de fichier en tant qu’argument à l’une des méthodes Open() surchargées de la classe WordprocessingDocument qui prend une chaîne et une valeur booléenne qui spécifie si le fichier doit être ouvert en mode lecture/écriture ou non. Dans le cas présent, la valeur booléenne est true, ce qui indique que le fichier doit être ouvert en mode lecture-écriture.
// Open a Wordprocessing document for editing.
using (WordprocessingDocument package = WordprocessingDocument.Open(fileName, true))
{
// Insert other code here.
}
L'instruction using fournit une alternative recommandée à la séquence .Create, .Save, .Close habituelle. Elle permet de s’assurer que la méthode Dispose (méthode interne utilisée par le Kit de développement logiciel (SDK) Open XML pour nettoyer les ressources) est appelée automatiquement lorsque le crochet fermant est atteint. Le bloc qui suit l’instruction using établit une étendue pour l’objet créé ou nommé dans l’instruction using, dans le cas présent package. Dans la mesure où la classe WordprocessingDocument du Kit de développement logiciel (SDK) Open XML enregistre et ferme automatiquement l’objet dans le cadre de son implémentation de System.IDisposable, et dans la mesure où la méthode Dispose est appelée automatiquement lorsque vous quittez le bloc, il n’est pas nécessaire d’appeler explicitement Save et Close (à condition d’utiliser using).
Structure de l’élément des polices pour une séquence de texte
Le texte suivant de la spécification ISO/IEC 29500 peut être utile lors de l’utilisation de l’élément rFonts .
Cet élément spécifie les polices qui doivent être utilisées pour l’affichage du contenu de cette séquence de texte. Dans une même séquence, il peut y avoir jusqu’à quatre types de contenus qui ont chacun l’autorisation d’utiliser une police unique :
ASCII
ANSI étendu
Script complexe
Asie de l’Est
L’utilisation de chacune de ces polices doit être déterminée par les valeurs des caractères Unicode du contenu de la séquence de texte, à moins qu’elle ne soit remplacée manuellement via l’utilisation de l’élément cs.
En l’absence de cet élément, la valeur par défaut consiste à laisser la mise en forme appliquée au niveau antérieur de la hiérarchie de styles. Si cet élément n’est jamais appliqué dans la hiérarchie de styles, le texte est affiché dans n’importe quelle police par défaut prenant en charge chaque type de contenu.
Prenons l’exemple d’une séquence de texte unique avec du texte en arabe et en anglais, comme suit :
English العربية
Ce contenu peut être exprimé dans une seule séquence WordprocessingML :
<w:r>
<w:t>English العربية</w:t>
</w:r>
Bien qu’ils fassent partie de la même séquence, les deux contenus n’ont pas le même aspect, car une police distincte a été spécifiée pour les caractères ASCII et les caractères de langue à script complexe dans la séquence :
<w:r>
<w:rPr>
<w:rFonts w:ascii="Courier New" w:cs="Times New Roman" />
</w:rPr>
<w:t>English العربية</w:t>
</w:r>
Cette séquence de texte doit par conséquent utiliser la police Courier New pour tous les caractères de la plage ASCII, et la police Times New Roman pour tous les caractères de la plage correspondant à une langue à script complexe.
© ISO/IEC29500: 2008.
Fonctionnement de l’exemple de code
Après avoir ouvert le fichier de package en lecture-écriture, le code crée un objet RunProperties qui contient un objet RunFonts dont la propriété Ascii a la valeur « Arial ». Les objets RunProperties et RunFonts représentent les éléments de propriétés d’exécution (<rPr>) et les éléments de polices d’exécution (<rFont>), respectivement, dans le schéma Wordprocessing Open XML. Utilisez un objet RunProperties pour spécifier les propriétés d’une séquence de texte donnée. Dans le cas présent, pour définir la police de la séquence en Arial, le code crée un objet RunFonts, puis affecte la valeur « Arial » à Ascii.
// Use an object initializer for RunProperties and rPr.
RunProperties rPr = new RunProperties(
new RunFonts()
{
Ascii = "Arial"
});
Le code crée ensuite un objet Run qui représente la première exécution de texte du document. Le code instancie Run et lui affecte la première séquence de texte du document. Le code ajoute ensuite l’objet RunProperties à l’objet Run à l’aide de la méthode PrependChild<T>(T). La méthode PrependChild ajoute un élément en tant que premier élément enfant à l’élément spécifié dans la structure XML en mémoire. Dans le cas présent, l’exécution de l’exemple de code produit une structure XML en mémoire, où l’élément RunProperties est ajouté en tant que premier élément enfant de l’élément Run. Il enregistre ensuite les modifications dans l’objet Save(MainDocumentPart). L’appel de la méthode Save de l’objet WordprocessingDocument valide les modifications apportées à la représentation en mémoire de la partie MainDocumentPart dans le fichier XML de MainDocumentPart (le fichier document.xml dans le package Wordprocessing).
Run r = package.MainDocumentPart.Document.Descendants<Run>().First();
r.PrependChild<RunProperties>(rPr);
// Save changes to the MainDocumentPart part.
package.MainDocumentPart.Document.Save();
Exemple de code
L’exemple de code suivant vous permet de modifier la police du premier paragraphe d’un document de traitement de texte. Par instance, vous pouvez appeler la méthode SetRunFont dans votre programme pour modifier la police dans le fichier « myPkg9.docx » à l’aide de l’appel suivant.
string fileName = @"C:\Users\Public\Documents\MyPkg9.docx";
SetRunFont(fileName);
Après avoir exécuté le programme case activée votre fichier « MyPkg9.docx » pour voir la police modifiée.
Remarque
Cet exemple de code suppose que le document de traitement de texte de test (MyPakg9.docx) contient au moins une séquence de texte.
Voici l’exemple de code complet en C# et en Visual Basic.
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System;
using System.Linq;
SetRunFont(args[0]);
// Set the font for a text run.
static void SetRunFont(string fileName)
{
// Open a Wordprocessing document for editing.
using (WordprocessingDocument package = WordprocessingDocument.Open(fileName, true))
{
// Set the font to Arial to the first Run.
// Use an object initializer for RunProperties and rPr.
RunProperties rPr = new RunProperties(
new RunFonts()
{
Ascii = "Arial"
});
if (package.MainDocumentPart is null)
{
throw new ArgumentNullException("MainDocumentPart is null.");
}
Run r = package.MainDocumentPart.Document.Descendants<Run>().First();
r.PrependChild<RunProperties>(rPr);
// Save changes to the MainDocumentPart part.
package.MainDocumentPart.Document.Save();
}
}
Voir aussi
Initialiseurs d’objets : types nommés et anonymes
Initialiseurs d'objets et de collection (Guide de programmation C#)