Partager via


Ouvrir un document de traitement de texte pour un accès en lecture seule

Cette rubrique explique comment utiliser les classes du Kit de développement logiciel (SDK) Open XML pour Office afin d’ouvrir par programme un document de traitement de texte pour un accès en lecture seule.


Quand ouvrir un document pour un accès en lecture seule

Il arrive parfois que l'on souhaite ouvrir un document afin de l'examiner ou de récupérer certaines informations, d'une manière qui garantisse que ce document demeure inchangé. Dans ces cas-là, il faut ouvrir le document pour un accès en lecture seule. Cette rubrique de procédures décrit plusieurs manières d’ouvrir par programme un document de traitement de texte en lecture seule.


Créer un objet WordprocessingDocument

Dans le kit de développement logiciel (SDK) Open XML, la classe WordprocessingDocument représente un package de document Word. Pour travailler sur un document Word, créez d'abord une instance de la classe WordprocessingDocument à partir du document, puis travaillez sur cette instance. Une fois que vous avez créé l'instance à partir du document, vous pouvez accéder au composant de document principal qui contient le texte du document. Chaque package Open XML contient plusieurs composants. Au minimum, un WordProcessingDocument doit contenir un composant de document principal qui sert de conteneur pour le texte principal du document. Le package peut également contenir des composants supplémentaires. Notez que dans un document Word, le texte du composant principal du document est représenté dans le package au format XML à l'aide de balisage WordprocessingML.

Pour créer l'instance de classe à partir du document, vous devez appeler l'une des méthodes Open. Plusieurs méthodes Open sont fournies, chacune avec une signature différente. Les méthodes qui permettent de spécifier si un document est modifiable sont répertoriées dans le tableau suivant.

Open, méthode Rubrique de Référence des bibliothèques de classes Description
Open(String, Boolean) Open(String, Boolean) Crée une instance de la classe WordprocessingDocument à partir du fichier spécifié.
Open(Stream, Boolean) Open(Stream, Boolean) Crée une instance de la classe WordprocessingDocument à partir du flux E/S indiqué.
Open(String, Boolean, OpenSettings) Open(String, Boolean, OpenSettings) Crée une instance de la classe WordprocessingDocument à partir du fichier spécifié.
Open(Stream, Boolean, OpenSettings) Open(Stream, Boolean, OpenSettings) Crée une instance de la classe WordprocessingDocument à partir du flux E/S indiqué.

Le tableau ci-dessus répertorie uniquement les méthodes Open qui acceptent une valeur booléenne comme second paramètre pour spécifier si un document est modifiable. Pour ouvrir un document pour un accès en lecture seule, spécifiez la valeur False pour ce paramètre.

Notez que deux des méthodes Open créent une instance de la classe WordprocessingDocument en fonction d'une chaîne fournie comme premier paramètre. Le premier exemple de l'exemple de code utilise cette technique. Il utilise la première méthode Open du tableau ci-dessus avec une signature qui requiert deux paramètres. Le premier paramètre accepte une chaîne qui représente le chemin d'accès complet du fichier à partir duquel vous voulez ouvrir le document. Le second paramètre est une valeur true ou false; cet exemple utilise false et indique si le fichier doit être ouvert ou non pour modification.

L'exemple de code suivant appelle la méthode Open.

    // Open a WordprocessingDocument for read-only access based on a filepath.
    using (WordprocessingDocument wordDocument =
        WordprocessingDocument.Open(filepath, false))

Les deux autres méthodes Open créent une instance de la classe WordprocessingDocument en fonction d'un flux d'entrée/sortie. Vous pouvez utiliser cette approche, pour instance, si vous avez une application Microsoft SharePoint Foundation 2010 qui utilise l’entrée/sortie de flux et que vous souhaitez utiliser le Kit de développement logiciel (SDK) Open XML pour travailler avec un document.

L'exemple de code suivant ouvre un document sur la base d'un flux.

    Stream stream = File.Open(strDoc, FileMode.Open);
    // Open a WordprocessingDocument for read-only access based on a stream.
    using (WordprocessingDocument wordDocument =
        WordprocessingDocument.Open(stream, false))

Supposons que vous disposez d’une application qui utilise la prise en charge d’Open XML dans l’espace de noms System.IO.Packaging de la bibliothèque de classes .NET Framework, et que vous souhaitez utiliser le Kit de développement logiciel (SDK) Open XML pour travailler avec un package en lecture seule. Bien que le Kit de développement logiciel (SDK) Open XML inclue des surcharges de méthode qui acceptent un package comme premier paramètre, il n’en existe aucune qui prend un booléen comme deuxième paramètre pour indiquer si le document doit être ouvert pour modification.

La méthode recommandée consiste à ouvrir le package en lecture seule avant de créer l'instance de la classe WordprocessingDocument, comme illustré dans le deuxième exemple de l'exemple de code. L'exemple de code suivant effectue cette opération.

    // Open System.IO.Packaging.Package.
    Package wordPackage = Package.Open(filepath, FileMode.Open, FileAccess.Read);

    // Open a WordprocessingDocument based on a package.
    using (WordprocessingDocument wordDocument =
        WordprocessingDocument.Open(wordPackage))

Une fois que vous avez ouvert le package de document Word, vous pouvez accéder au composant de document principal. Pour accéder au composant de document principal, assignez une référence au corps de document existant, comme illustré dans l'exemple de code suivant.

    // Assign a reference to the existing document body.
    Body body = wordprocessingDocument.MainDocumentPart.Document.Body;

Structure d’un document WordProcessingML

La structure de base d’un document WordProcessingML se compose des éléments document et body , suivis d’un ou plusieurs éléments de niveau bloc tels que p, qui représente un paragraphe. Un paragraphe contient un ou plusieurs éléments r. Le r signifie « run » (exécution), qui est une zone de texte avec un ensemble de propriétés courant, comme par exemple la mise en forme. Une exécution contient un ou plusieurs éléments t. L'élément t contient une plage de texte. L’exemple de code suivant montre le balisage WordprocessingML pour un document qui contient le texte « Exemple de texte ».

    <w:document xmlns:w="https://schemas.openxmlformats.org/wordprocessingml/2006/main">
      <w:body>
        <w:p>
          <w:r>
            <w:t>Example text.</w:t>
          </w:r>
        </w:p>
      </w:body>
    </w:document>

À l’aide du Kit de développement logiciel (SDK) Open XML, vous pouvez créer une structure de document et du contenu à l’aide de classes fortement typées qui correspondent à des éléments WordprocessingML . Vous trouverez ces classes dans l'espace de noms DocumentFormat.OpenXml.Wordprocessing . Le tableau suivant répertorie les noms des classes qui correspondent aux éléments document, body, p, r et t.

Élément WordprocessingML Classe du Kit de développement logiciel (SDK) Open XML Description
document Document Élément racine de la partie principale du document.
body Body Conteneur des structures de niveau bloc, telles que paragraphs, tables, annotations et autres structures décrites dans la spécification ISO/IEC 29500.
p Paragraph Paragraphe.
r Run Exécution.
t Text Plage de texte.

Pour plus d’informations sur la structure globale des parties et éléments d’un document WordprocessingML, consultez Structure d’un document WordprocessingML.


Génération du balisage WordprocessingML pour ajouter du texte et tentative d’enregistrement

L'exemple de code illustre comment ajouter du texte et tenter d'enregistrer les modifications afin de montrer que l'accès est en lecture seule. Une fois que vous avez accès au corps du composant de document principal, ajoutez du texte en ajoutant des instances des classes Paragraph, Run et Text. Cela génère le balisage WordprocessingML requis. L'exemple de code suivant ajoute le paragraphe, la séquence et le texte.

    // Attempt to add some text.
    Paragraph para = body.AppendChild(new Paragraph());
    Run run = para.AppendChild(new Run());
    run.AppendChild(new Text("Append text in body, but text is not saved - OpenWordprocessingDocumentReadonly"));

    // Call Save to generate an exception and show that access is read-only.
    wordDocument.MainDocumentPart.Document.Save();

Exemple de code

Le premier exemple de méthode illustré ici, OpenWordprocessingDocumentReadOnly, ouvre un document Word pour un accès en lecture seule. Appelez cette méthode en passant un chemin d'accès complet au fichier que vous souhaitez ouvrir. Par exemple, le code suivant ouvre le fichier Word12.docx dans le dossier Documents publics pour un accès en lecture seule.

    OpenWordprocessingDocumentReadonly(@"c:\Users\Public\Public Documents\Word12.docx");

Le second exemple de méthode, OpenWordprocessingPackageReadonly, illustre l'ouverture d'un document Word pour un accès en lecture seule à partir de System.IO.Packaging.Package. Appelez cette méthode en passant un chemin d'accès complet au fichier que vous souhaitez ouvrir. Par exemple, le code suivant ouvre le fichier Word12.docx dans le dossier Documents publics pour un accès en lecture seule.

    OpenWordprocessingPackageReadonly(@"c:\Users\Public\Public Documents\Word12.docx");

Importante

[!IMPORTANTE] Si vous supprimez le commentaire de l'instruction qui enregistre le fichier, le programme lève une exception IOException, car le fichier est ouvert pour un accès en lecture seule.

Voici l'exemple de code complet en C# et en Visual Basic.


using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System;

OpenWordprocessingDocumentReadonly(args[0]);

static void OpenWordprocessingDocumentReadonly(string filepath)
{
    // Open a WordprocessingDocument based on a filepath.
    using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(filepath, false))
    {
        if (wordDocument is null)
        {
            throw new ArgumentNullException(nameof(wordDocument));
        }
        // Assign a reference to the existing document body.
        MainDocumentPart mainDocumentPart = wordDocument.MainDocumentPart ?? wordDocument.AddMainDocumentPart();
        mainDocumentPart.Document ??= new Document();

        Body body = mainDocumentPart.Document.Body ?? mainDocumentPart.Document.AppendChild(new Body());

        // Attempt to add some text.
        Paragraph para = body.AppendChild(new Paragraph());
        Run run = para.AppendChild(new Run());
        run.AppendChild(new Text("Append text in body, but text is not saved - OpenWordprocessingDocumentReadonly"));

        // Call Save to generate an exception and show that access is read-only.
        //mainDocumentPart.Document.Save();
    }
}

Voir aussi