Partager via


Ouverture d’un document de présentation 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 programmation un document de présentation pour un accès en lecture seule.

Comment ouvrir un fichier pour un accès en lecture seule

Vous pouvez souhaiter ouvrir un document de présentation pour lire les diapositives. Vous pouvez aussi souhaiter extraire des informations d’une diapositive, copier une diapositive vers une bibliothèque de diapositives ou établir la liste des titres des diapositives. Dans ces scénarios, vous voulez le faire d’une façon qui laissera à coup sûr le document inchangé. Vous pouvez faire cela en ouvrant 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 présentation en lecture seule.

Créer une instance de la classe PresentationDocument

Dans le Kit de développement logiciel (SDK) Open XML, la classe PresentationDocument représente un package de documents de présentation. Pour utiliser un document de présentation, créez d’abord une instance de la classe PresentationDocument, puis utilisez cette instance. Pour créer la classe instance à partir du document, appelez l’une des méthodes Open. Plusieurs méthodes Open sont fournies, chacune avec une signature différente. Le tableau suivant contient un sous-ensemble des surcharges pour la méthode Open que vous pouvez utiliser pour ouvrir le package.

Nom Description
Open(String, Boolean) Créer une nouvelle instance de la classe PresentationDocument à partir du fichier spécifié.
Open(Stream, Boolean) Créer une nouvelle instance de la classe PresentationDocument à partir du flux d’E/S.
Open(Package) Créer une nouvelle instance de la classe PresentationDocument à partir du package spécifié.

Le tableau précédent comprend deux méthodes Open qui acceptent une valeur booléenne comme deuxième 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.

Par exemple, vous pouvez ouvrir le fichier de présentation en lecture seule et l’affecter à un objet PresentationDocument , comme illustré dans l’instruction using suivante. Dans ce code, le paramètre presentationFile est une chaîne qui représente le chemin d’accès du fichier à partir duquel vous voulez ouvrir le document.

    using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, false))
    {
        // Insert other code here.
    }

Vous pouvez aussi utiliser la deuxième surcharge de la méthode Open du tableau ci-dessus pour créer une instance de la classe PresentationDocument, basée sur un flux d’E/S. Vous pouvez utiliser cette approche si vous avez une application Microsoft SharePoint Foundation 2010 qui utilise des E/S de flux et que vous souhaitez utiliser le Kit de développement logiciel (SDK) Open XML pour travailler avec un document. Le segment de code suivant ouvre un document basé sur un flux.

    Stream stream = File.Open(strDoc, FileMode.Open);
    using (PresentationDocument presentationDocument =
        PresentationDocument.Open(stream, false)) 
    {
        // Place other code here.
    }

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. Le Kit de développement logiciel (SDK) Open XML inclut une surcharge de méthode qui accepte un package comme seul paramètre. Il n’existe pas de paramètre pour indiquer si le document doit être ouvert pour modification. L’approche recommandée est d’ouvrir le package en lecture seule avant de créer l’instance de la classe PresentationDocument. Le segment de code suivant effectue cette opération.

    Package presentationPackage = Package.Open(filepath, FileMode.Open, FileAccess.Read);
    using (PresentationDocument presentationDocument =
        PresentationDocument.Open(presentationPackage))
    {
        // Other code goes here.
    }

Structure de document de présentation de base

La structure de document de base d’un document PresentationML est constituée d’un certain nombre de composants, parmi lesquels le composant principal qui contient la définition de la présentation. Le texte suivant de la spécification ISO/IEC 29500 présente la forme globale d’un package PresentationML .

La partie main d’un package PresentationML commence par un élément racine de présentation. Cet élément contient une présentation qui, à son tour, fait référence à une liste de diapositives, à une liste de diapositives master, à une liste de notes master et à un document master liste. La liste des diapositives référence toutes les diapositives de la présentation ; la liste de masques de diapositive référence tous les masques de diapositive utilisés dans la présentation ; le masque de pages de note contient des informations sur la mise en forme des pages de notes et le masque de document décrit comment un document se présente.

Un document à distribuer est un ensemble imprimé de diapositives qui peut être distribué aux personnes de l’audience.

En plus de textes et de graphiques, chaque diapositive peut contenir des commentaires et des notes, peut avoir une disposition et peut faire partie d’une ou plusieurs présentations personnalisées. Un commentaire est une annotation destinée à la personne qui gère le jeu de diapositives de la présentation. Une note est un rappel ou un élément de texte destiné au présentateur ou à l’audience.

Les autres fonctionnalités qu’un document PresentationML peut inclure les suivantes : animation, audio, vidéo et transitions entre les diapositives.

Un document PresentationML n’est pas stocké sous la forme d’un corps de grande taille dans un même composant. Au lieu de cela, les éléments qui implémentent certains groupes de fonctionnalités sont stockés dans des composants distincts. Par exemple, tous les commentaires d’un document sont stockés dans un même composant Commentaires, alors que chaque diapositive a son propre composant.

© ISO/IEC29500: 2008.

L’exemple de code XML suivant représente une présentation qui contient deux diapositives ayant les numéros d’identification 267 et 256.

    <p:presentation xmlns:p="…" … > 
       <p:sldMasterIdLst>
          <p:sldMasterId
             xmlns:rel="https://…/relationships" rel:id="rId1"/>
       </p:sldMasterIdLst>
       <p:notesMasterIdLst>
          <p:notesMasterId
             xmlns:rel="https://…/relationships" rel:id="rId4"/>
       </p:notesMasterIdLst>
       <p:handoutMasterIdLst>
          <p:handoutMasterId
             xmlns:rel="https://…/relationships" rel:id="rId5"/>
       </p:handoutMasterIdLst>
       <p:sldIdLst>
          <p:sldId id="267"
             xmlns:rel="https://…/relationships" rel:id="rId2"/>
          <p:sldId id="256"
             xmlns:rel="https://…/relationships" rel:id="rId3"/>
       </p:sldIdLst>
           <p:sldSz cx="9144000" cy="6858000"/>
       <p:notesSz cx="6858000" cy="9144000"/>
    </p:presentation>

À 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 aux éléments PresentationML. Vous trouverez ces classes dans l’espace de noms DocumentFormat.OpenXml.Presentation . Le tableau suivant répertorie les noms des classes qui correspondent aux éléments sld, sldLayout, sldMaster et notesMaster.

Élément PresentationML Classe du Kit de développement logiciel (SDK) Open XML Description
Sld Slide Diapositive de présentation. Il s’agit de l’élément racine de SlidePart.
sldLayout SlideLayout Mise en page des diapositives. Il s’agit de l’élément racine de SlideLayoutPart.
sldMaster SlideMaster Masque des diapositives. Il s’agit de l’élément racine de SlideMasterPart.
Notesmaster NotesMaster Masque des pages de notes (ou handoutMaster). Il s’agit de l’élément racine de NotesMasterPart.

Fonctionnement de l’exemple de code

Dans l’exemple de code, après l’ouverture du document de présentation dans l’instruction using pour l’accès en lecture seule, vous instanciez le composant PresentationPart et vous ouvrez la liste de diapositives. Vous obtenez ensuite l’ID de relation de la première diapositive.

    // Get the relationship ID of the first slide.
    PresentationPart part = ppt.PresentationPart;
    OpenXmlElementList slideIds = part.Presentation.SlideIdList.ChildElements;
    string relId = (slideIds[index] as SlideId).RelationshipId;

À partir de l’ID de relation relId, vous obtenez le composant de diapositive, puis le texte interne de la diapositive en créant une chaîne de texte à l’aide de StringBuilder.

    // Get the slide part from the relationship ID.
    SlidePart slide = (SlidePart)part.GetPartById(relId);

    // Build a StringBuilder object.
    StringBuilder paragraphText = new StringBuilder();

    // Get the inner text of the slide.
    IEnumerable<A.Text> texts = slide.Slide.Descendants<A.Text>();
    foreach (A.Text text in texts)
    {
        paragraphText.Append(text.Text);
    }
    sldText = paragraphText.ToString();

Le texte interne de la diapositive, qui est un paramètre out de la méthode GetSlideIdAndText, est repassé à la méthode principale pour être affiché.

Importante

Cet exemple affiche seulement le texte du fichier de présentation. Les composants non textuels, tels que les formes et les graphiques, ne sont pas affichés.

Exemple de code

L’exemple suivant ouvre un fichier de présentation pour un accès en lecture seule et obtient le texte interne d’une diapositive à un index spécifié. Pour appeler la méthode GetSlideIdAndText, passez comme paramètre d’entrée le chemin d’accès complet du document de présentation. Passez également en entrée le paramètre outsldText, auquel une valeur sera affectée dans la méthode elle-même ; vous pouvez ensuite afficher sa valeur dans le programme principal. Par exemple, l’appel suivant à la méthode GetSlideIdAndText obtient le texte interne dans la deuxième diapositive d’un fichier de présentation nommé « Myppt13.pptx ».

Conseil

L’exception la plus probable dans ce programme est l’exception ArgumentOutOfRangeException. Elle peut être déclenchée par exemple si vous avez un fichier avec deux diapositives et que vous voulez afficher le texte de la diapositive numéro 4. Il est donc préférable d’utiliser un bloc try lorsque vous appelez la méthode GetSlideIdAndText, comme le montre l’exemple suivant.

    string file = @"C:\Users\Public\Documents\Myppt13.pptx";
    string slideText;
    int index = 1;
    try
    {
        GetSlideIdAndText(out slideText, file, index);
        Console.WriteLine("The text in the slide #{0} is: {1}", index + 1, slideText);
    }
    catch (ArgumentOutOfRangeException exp)
    {
        Console.WriteLine(exp.Message);
    }

Voici le code complet en C# et en Visual Basic.


using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Presentation;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using A = DocumentFormat.OpenXml.Drawing;

GetSlideIdAndText(out string text, args[0], int.Parse(args[1]));

static void GetSlideIdAndText(out string sldText, string docName, int index)
{
    using (PresentationDocument ppt = PresentationDocument.Open(docName, false))
    {
        // Get the relationship ID of the first slide.
        PresentationPart? part = ppt.PresentationPart;
        OpenXmlElementList slideIds = part?.Presentation?.SlideIdList?.ChildElements ?? default;

        // If there are no slide IDs then there are no slides.
        if (slideIds.Count == 0)
        {
            sldText = "";
            return;
        }

        string? relId = (slideIds[index] as SlideId)?.RelationshipId;

        if (relId is null)
        {
            sldText = "";
            return;
        }

        // Get the slide part from the relationship ID.
        SlidePart slide = (SlidePart)part!.GetPartById(relId);

        // Build a StringBuilder object.
        StringBuilder paragraphText = new StringBuilder();

        // Get the inner text of the slide:
        IEnumerable<A.Text> texts = slide.Slide.Descendants<A.Text>();
        foreach (A.Text text in texts)
        {
            paragraphText.Append(text.Text);
        }
        sldText = paragraphText.ToString();
    }
}