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 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 méthodes . Plusieurs méthodes Open sont fournies, chacune avec une signature différente. Le tableau suivant contient un sous-ensemble des surcharges de la Open
méthode que vous pouvez utiliser pour ouvrir le package.
Nom | Description |
---|---|
Open | Créez un instance de la PresentationDocument classe à partir du fichier spécifié. |
Open | Créez un instance de la PresentationDocument classe à partir du flux d’E/S. |
Open | Créez un instance de la PresentationDocument classe à partir du package spécifié. |
Le tableau précédent inclut deux Open
méthodes qui acceptent une valeur booléenne comme deuxième paramètre pour spécifier si un document est modifiable. Pour ouvrir un document pour l’accès en lecture seule, spécifiez la valeur false
de ce paramètre.
Par exemple, vous pouvez ouvrir le fichier de présentation en lecture seule et l’affecter à un PresentationDocument objet, comme indiqué dans l’instruction suivante using
. Dans ce code, le presentationFile
paramètre est une chaîne qui représente le chemin du fichier à partir duquel vous souhaitez ouvrir le document.
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFilePath, false))
{
// Insert other code here.
}
Vous pouvez également utiliser la deuxième surcharge de la Open
méthode, dans le tableau ci-dessus, pour créer un instance de la PresentationDocument
classe en fonction d’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 System.IO.Packaging
de noms 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 consiste à ouvrir le package en lecture seule avant de créer le instance de la PresentationDocument
classe. 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 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
, 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 avoir ouvert le document de présentation dans l’instruction using
pour l’accès en lecture seule, instanciez le PresentationPart
, puis ouvrez la liste des 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 ?? 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;
}
À partir de l’ID de relation, relId
, vous obtenez le composant diapositive, puis le texte interne de la diapositive en créant une chaîne de texte à l’aide StringBuilder
de .
// 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 out
paramètre de la GetSlideIdAndText
méthode, est repassé à la méthode main à afficher.
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 dans le chemin d’accès complet du document de présentation. Transmettez également le out
paramètre sldText
, qui se verra attribuer une valeur dans la méthode elle-même, puis vous pouvez afficher sa valeur dans le programme main. Par exemple, l’appel suivant à la GetSlideIdAndText
méthode obtient le texte interne dans un fichier de présentation à partir de l’index et du chemin d’accès au fichier transmis à l’application en tant qu’arguments.
Conseil
L’exception la plus attendue 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. Par conséquent, il est préférable d’utiliser un try
bloc lorsque vous appelez la GetSlideIdAndText
méthode, comme indiqué dans l’exemple suivant.
try
{
string file = args[0];
bool isInt = int.TryParse(args[1], out int i);
if (isInt)
{
GetSlideIdAndText(out string sldText, file, i);
Console.WriteLine($"The text in slide #{i + 1} is {sldText}");
}
}
catch(ArgumentOutOfRangeException exp) {
Console.Error.WriteLine(exp.Message);
}
Voici le code complet en C# et en Visual Basic.
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();
}
}