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 PresentationDocument classe représente un package de document de présentation. Pour utiliser un document de présentation, commencez par créer un instance de la PresentationDocument classe, puis utilisez cette instance. Pour créer la classe instance à partir du document, appelez l’une Open des surcharges de méthode. Le code de cette rubrique utilise la Open méthode , qui prend un chemin d’accès de 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 sur false pour ouvrir le fichier pour un accès en lecture seule, ou true si vous souhaitez ouvrir le fichier pour l’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 suivante using ouvre le fichier pour un accès en lecture seule. Dans cet exemple de code, le presentationFile paramètre est une chaîne qui représente le chemin du fichier à partir duquel vous souhaitez ouvrir le document.

// Open the presentation as read-only.
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, false))

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

// Open the source document as read/write.
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))

Avec v3.0.0+ la Close() méthode a été supprimée au profit de l’instruction using. Cela garantit que la Dispose() méthode est appelée automatiquement lorsque l’accolade fermante est atteinte. Le bloc qui suit l’instruction using établit une étendue pour l’objet créé ou nommé dans l’instruction using , dans ce cas presentationDocument.

Structure de document de présentation de base

La structure de base d’un PresentationML document se compose d’un certain nombre de parties, parmi lesquelles la partie main qui contient la définition de présentation. Le texte suivant de la spécification ISO/IEC 29500 présente la forme globale d’un PresentationML package.

La partie main d’un PresentationML package 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 PresentationML document peut inclure les suivantes : animation, audio, vidéo et transitions entre les diapositives.

Un PresentationML document n’est pas stocké sous la forme d’un corps volumineux dans une seule partie. 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 auteurs d’un document sont stockés dans une partie d’auteurs, tandis que chaque diapositive a sa propre partie.

ISO/IEC 29500 : 2016

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 . Le tableau suivant répertorie les noms de classes des classes qui correspondent aux sldéléments , sldLayout, sldMasteret 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 se compose de deux surcharges de la CountSlides méthode . La première surcharge utilise un string paramètre et la deuxième surcharge utilise un PresentationDocument paramètre. Dans la première CountSlides méthode, l’exemple de code ouvre le document de présentation dans l’instruction using . Ensuite, il transmet l’objet PresentationDocument à la deuxième CountSlides méthode, qui retourne un nombre entier qui représente le nombre de diapositives dans la présentation.

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

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

if (presentationDocument is 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 is not null)
{
    slidesCount = presentationPart.SlideParts.Count();
}

// Return the slide count to the previous method.
return slidesCount;

Suppression d’une diapositive spécifique

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

// 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.
        DeleteSlide(presentationDocument, slideIndex);
    }
}

La première section de la deuxième méthode surchargée DeleteSlide utilise la CountSlides méthode pour obtenir le nombre de diapositives dans 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.
static void DeleteSlide(PresentationDocument presentationDocument, int slideIndex)
{
    if (presentationDocument is null)
    {
        throw new ArgumentNullException(nameof(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;

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

La section suivante de la deuxième méthode surchargée DeleteSlide 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 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);
            }
        }
    }
}

Enfin, le code supprime le composant diapositive de la diapositive supprimée.

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

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

Exemple de code

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

// 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 CountSlides(presentationDocument);
    }
}

// Count the slides in the presentation.
static int CountSlides(PresentationDocument presentationDocument)
{
    if (presentationDocument is 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 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.
        DeleteSlide(presentationDocument, slideIndex);
    }
}
// Delete the specified slide from the presentation.
static void DeleteSlide(PresentationDocument presentationDocument, int slideIndex)
{
    if (presentationDocument is null)
    {
        throw new ArgumentNullException(nameof(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;

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

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

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

Voir aussi