Partager via


Supprimer une diapositive d’une présentation

Cette rubrique montre comment utiliser le Kit de développement logiciel (SDK) Open XML pour Office afin de supprimer une diapositive d’une présentation par programmation. Elle montre également comment supprimer toutes les références à la diapositive dans tous les diaporamas personnalisés existants. Pour supprimer une diapositive spécifique d’un fichier de présentation, vous devez d’abord connaître le nombre de diapositives de la présentation. Le code de cette rubrique est donc divisé en deux parties. La première compte le nombre de diapositives et la seconde supprime une diapositive à un index spécifique.

Remarque

La suppression d’une diapositive dans une présentation plus complexe, telles que celles contenant des paramètres d’affichage de mode Plan, peut nécessiter des étapes supplémentaires.


Obtention d’un objet Presentation

Dans le Kit de développement logiciel (SDK) Open XML, la classe PresentationDocument représente un package de document 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 l’instance de classe à partir du document, appelez une des surcharges de la méthode Open. Le code de cette rubrique utilise la méthode PresentationDocument.Open(String, Boolean), qui prend un chemin d’accès au fichier comme premier paramètre pour spécifier le fichier à ouvrir, et une valeur booléenne comme deuxième paramètre pour spécifier si un document est modifiable. Définissez ce deuxième paramètre à false pour ouvrir le fichier en accès en lecture seule, ou bien à true si vous voulez ouvrir le fichier en accès en lecture/écriture. Le code de cette rubrique ouvre le fichier deux fois : une fois pour compter le nombre de diapositives, et une fois pour supprimer une diapositive spécifique. Lorsque vous comptez le nombre de diapositives d’une présentation, il est préférable d’ouvrir le fichier en accès en lecture seule pour protéger le fichier contre une écriture accidentelle. L’instruction using suivante ouvre le fichier pour un accès en lecture seule. Dans cet exemple de code, le paramètre presentationFile est une chaîne qui représente le chemin d’accès pour le fichier à partir duquel vous voulez ouvrir le document.

    // Open the presentation as read-only.
    using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, false))
    {
        // Insert other code here.
    }                                                                           

Pour supprimer une diapositive d’un fichier de présentation, ouvrez-le pour un accès en lecture/écriture, comme le montre l’instruction using suivante.

    // Open the source document as read/write.
    using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))
    {
        // Place other code here.
    }

L'instruction using offre une alternative recommandée pour la séquence .Open, .Save, .Close standard. Elle garantit que la méthode Dispose (méthode interne utilisée par le kit de développement Open XML pour nettoyer les ressources) est automatiquement appelée lorsque l'accolade de fermeture est atteinte. 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 presentationDocument.

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.

Comptage du nombre de diapositives

L’exemple de code est constitué de deux surcharges de la méthode CountSlides. La première surcharge utilise un paramètre de chaîne et la deuxième surcharge utilise un paramètre PresentationDocument . Dans la première méthode CountSlides, l’exemple de code ouvre le document de présentation dans l’instruction using. Il passe ensuite l’objet PresentationDocument à la deuxième méthode CountSlides, qui retourne un nombre entier représentant le nombre de diapositives de la présentation.

    // Pass the presentation to the next CountSlides method
    // and return the slide count.
    return CountSlides(presentationDocument);

Dans la deuxième méthode CountSlides, le code vérifie que l’objet PresentationDocument passé n’est pas null et, si ce n’est pas le cas, obtient un objet PresentationPart à partir de l’objet PresentationDocument. À l’aide de SlideParts, le code obtient l’élément slideCount et le retourne.

    // Check for a null document object.
    if (presentationDocument == null)
    {
        throw new ArgumentNullException("presentationDocument");
    }

    int slidesCount = 0;

    // Get the presentation part of document.
    PresentationPart presentationPart = presentationDocument.PresentationPart;

    // Get the slide count from the SlideParts.
    if (presentationPart != null)
    {
        slidesCount = presentationPart.SlideParts.Count();
    }
    // Return the slide count to the previous method.
    return slidesCount;

Suppression d’une diapositive spécifique

Le code pour supprimer une diapositive utilise deux surcharges de la méthode DeleteSlide. La première méthode DeleteSlide surchargée prend deux paramètres : une chaîne qui représente le nom et le chemin d’accès au fichier de présentation, et un entier qui représente la position d’index (commençant à zéro) de la diapositive à supprimer. Il ouvre le fichier de présentation, obtient un objet PresentationDocument, puis passe cet objet et le numéro d’index à la méthode DeleteSlide surchargée suivante, qui effectue la suppression.

    // Get the presentation object and pass it to the next DeleteSlide method.
    public static void DeleteSlide(string presentationFile, int slideIndex)
    {
        // Open the source document as read/write.

        using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))
        {
          // Pass the source document and the index of the slide to be deleted to the next DeleteSlide method.
          DeleteSlide(presentationDocument, slideIndex);
        }
    }  

La première section de la seconde méthode DeleteSlide surchargée utilise la méthode CountSlides pour obtenir le nombre de diapositives de la présentation. Ensuite, elle obtient la liste des ID de diapositive de la présentation, identifie la diapositive spécifiée dans la liste, puis supprime la diapositive de la liste.

    // Delete the specified slide from the presentation.
    public static void DeleteSlide(PresentationDocument presentationDocument, int slideIndex)
    {
        if (presentationDocument == null)
        {
            throw new ArgumentNullException("presentationDocument");
        }

        // Use the CountSlides sample to get the number of slides in the presentation.
        int slidesCount = CountSlides(presentationDocument);

        if (slideIndex < 0 || slideIndex >= slidesCount)
        {
            throw new ArgumentOutOfRangeException("slideIndex");
        }

        // Get the presentation part from the presentation document. 
        PresentationPart presentationPart = presentationDocument.PresentationPart;

        // Get the presentation from the presentation part.
        Presentation presentation = presentationPart.Presentation;

        // Get the list of slide IDs in the presentation.
        SlideIdList slideIdList = presentation.SlideIdList;

        // Get the slide ID of the specified slide
        SlideId slideId = slideIdList.ChildElements[slideIndex] as SlideId;

        // Get the relationship ID of the slide.
        string slideRelId = slideId.RelationshipId;

        // Remove the slide from the slide list.
        slideIdList.RemoveChild(slideId);

La section suivante de la deuxième méthode DeleteSlide surchargée supprime toutes les références à la diapositive supprimée des diaporamas personnalisés. Elle le fait en bouclant dans la liste des diaporamas personnalisés et dans la liste des diapositives de chaque diaporama personnalisé. Ensuite, elle déclare et instancie une liste liée d’entrées de liste de diapositives, et recherche les références à la diapositive supprimée à l’aide de l’ID de relation de cette diapositive. Elle ajoute ces références à la liste des entrées de la liste de diapositives et supprime chacune de ces références de la liste de diapositives dans son diaporama personnalisé respectif.

    // Remove references to the slide from all custom shows.
    if (presentation.CustomShowList != null)
    {
        // Iterate through the list of custom shows.
        foreach (var customShow in presentation.CustomShowList.Elements<CustomShow>())
        {
            if (customShow.SlideList != null)
            {
                // Declare a link list of slide list entries.
                LinkedList<SlideListEntry> slideListEntries = new LinkedList<SlideListEntry>();
                foreach (SlideListEntry slideListEntry in customShow.SlideList.Elements())
                {
                    // Find the slide reference to remove from the custom show.
                    if (slideListEntry.Id != null && slideListEntry.Id == slideRelId)
                    {
                        slideListEntries.AddLast(slideListEntry);
                    }
                }

                // Remove all references to the slide from the custom show.
                foreach (SlideListEntry slideListEntry in slideListEntries)
                {
                    customShow.SlideList.RemoveChild(slideListEntry);
                }
            }
        }
    }

Enfin, le code enregistre la présentation modifiée et supprime le composant de diapositive pour la diapositive supprimée.

    // Save the modified presentation.
    presentation.Save();

    // Get the slide part for the specified slide.
    SlidePart slidePart = presentationPart.GetPartById(slideRelId) as SlidePart;

    // Remove the slide part.
    presentationPart.DeletePart(slidePart);
    }

Exemple de code

Voici l’exemple de code complet pour les deux méthodes surchargées, CountSlides et DeleteSlide. Pour utiliser le code, vous pouvez utiliser l’appel suivant comme exemple pour supprimer la diapositive à l’index 2 dans le fichier de présentation « Myppt6.pptx ».

    DeleteSlide(@"C:\Users\Public\Documents\Myppt6.pptx", 2);

Vous pouvez aussi utiliser l’appel suivant pour compter le nombre de diapositives dans la présentation.

    Console.WriteLine("Number of slides = {0}",
    CountSlides(@"C:\Users\Public\Documents\Myppt6.pptx"));

Il est conseillé de compter le nombre de diapositives avant et après avoir effectué la suppression.

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


using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Presentation;
using System;
using System.Collections.Generic;
using System.Linq;

CountSlides(args[0]);

// Get the presentation object and pass it to the next CountSlides method.
static int CountSlides(string presentationFile)
{
    // Open the presentation as read-only.
    using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, false))
    {
        // Pass the presentation to the next CountSlide method
        // and return the slide count.
        return CountSlidesFromPresentation(presentationDocument);
    }
}

// Count the slides in the presentation.
static int CountSlidesFromPresentation(PresentationDocument presentationDocument)
{
    int slidesCount = 0;

    // Get the presentation part of document.
    PresentationPart presentationPart = presentationDocument.PresentationPart ?? presentationDocument.AddPresentationPart();

    // Get the slide count from the SlideParts.
    if (presentationPart is not null)
    {
        slidesCount = presentationPart.SlideParts.Count();
    }

    // Return the slide count to the previous method.
    return slidesCount;
}
//
// Get the presentation object and pass it to the next DeleteSlide method.
static void DeleteSlide(string presentationFile, int slideIndex)
{
    // Open the source document as read/write.

    using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))
    {
        // Pass the source document and the index of the slide to be deleted to the next DeleteSlide method.
        DeleteSlideFromPresentation(presentationDocument, slideIndex);
    }
}

// Delete the specified slide from the presentation.
static void DeleteSlideFromPresentation(PresentationDocument presentationDocument, int slideIndex)
{
    if (presentationDocument is null)
    {
        throw new ArgumentNullException("presentationDocument");
    }

    // Use the CountSlides sample to get the number of slides in the presentation.
    int slidesCount = CountSlidesFromPresentation(presentationDocument);

    if (slideIndex < 0 || slideIndex >= slidesCount)
    {
        throw new ArgumentOutOfRangeException("slideIndex");
    }

    // Get the presentation part from the presentation document. 
    PresentationPart? presentationPart = presentationDocument.PresentationPart;

    // Get the presentation from the presentation part.
    Presentation? presentation = presentationPart?.Presentation;

    // Get the list of slide IDs in the presentation.
    SlideIdList? slideIdList = presentation?.SlideIdList;

    // Get the slide ID of the specified slide
    SlideId? slideId = slideIdList?.ChildElements[slideIndex] as SlideId;

    // Get the relationship ID of the slide.
    string? slideRelId = slideId?.RelationshipId;

    // If there's no relationship ID, there's no slide to delete.
    if (slideRelId is null)
    {
        return;
    }

    // Remove the slide from the slide list.
    slideIdList!.RemoveChild(slideId);

    //
    // Remove references to the slide from all custom shows.
    if (presentation!.CustomShowList is not null)
    {
        // Iterate through the list of custom shows.
        foreach (var customShow in presentation.CustomShowList.Elements<CustomShow>())
        {
            if (customShow.SlideList is not null)
            {
                // Declare a link list of slide list entries.
                LinkedList<SlideListEntry> slideListEntries = new LinkedList<SlideListEntry>();
                foreach (SlideListEntry slideListEntry in customShow.SlideList.Elements())
                {
                    // Find the slide reference to remove from the custom show.
                    if (slideListEntry.Id is not null && slideListEntry.Id == slideRelId)
                    {
                        slideListEntries.AddLast(slideListEntry);
                    }
                }

                // Remove all references to the slide from the custom show.
                foreach (SlideListEntry slideListEntry in slideListEntries)
                {
                    customShow.SlideList.RemoveChild(slideListEntry);
                }
            }
        }
    }

    // Save the modified presentation.
    presentation.Save();

    // Get the slide part for the specified slide.
    SlidePart slidePart = (SlidePart)presentationPart!.GetPartById(slideRelId);

    // Remove the slide part.
    presentationPart.DeletePart(slidePart);
}

Voir aussi