Löschen aller Kommentare eines Autors aus allen Folien einer Präsentation
In diesem Thema wird gezeigt, wie Sie die Klassen im Open XML SDK für Office verwenden, um alle Kommentare eines bestimmten Autors in einer Präsentation programmgesteuert zu löschen.
Abrufen eines PresentationDocument-Objekts
Im Open XML SDK stellt die PresentationDocument-Klasse ein Präsentationsdokumentpaket dar. Zum Arbeiten mit einem Präsentationsdokument müssen Sie zuerst eine Instanz der PresentationDocument-Klasse erstellen und anschließend mit dieser Instanz arbeiten. Um die Klasse instance aus dem Dokument zu erstellen, rufen Sie die Open(String, Boolean)-Methode auf, die einen Dateipfad verwendet, und einen booleschen Wert als zweiten Parameter, um anzugeben, ob ein Dokument bearbeitet werden kann. Zum Öffnen eines Dokuments mit Lese-/Schreibzugriff geben Sie den Wert true für diesen Parameter an (siehe die folgende using-Anweisung). In diesem Code ist der FileName-Parameter eine Zeichenfolge, die den Pfad für die Datei darstellt, aus der Sie das Dokument öffnen möchten, und der Autor ist der Benutzername, der auf der Registerkarte Allgemein der PowerPoint-Optionen angezeigt wird.
public static void DeleteCommentsByAuthorInPresentation(string fileName, string author)
{
using (PresentationDocument doc = PresentationDocument.Open(fileName, true))
{
// Insert other code here.
}
Die using-Anweisung ist eine empfohlene Alternative zur herkömmlichen Reihenfolge ".Open, .Save, .Close". Sie stellt sicher, dass die Dispose-Methode (vom Open XML SDK verwendete interne Methode zum Bereinigen von Ressourcen) bei Erreichen der schließenden Klammer automatisch aufgerufen wird. Der auf die using-Anweisung folgende Block richtet einen Bereich für das Objekt ein, das in der using-Anweisung erstellt oder benannt wird, in diesem Fall doc.
Grundlegende Präsentationsdokumentstruktur
Die grundlegende Dokumentstruktur eines PresentationML-Dokuments besteht aus vielen Teilen, darunter der Hauptteil mit der Präsentationsdefinition. Der folgende Text aus der SPEZIFIKATION ISO/IEC 29500 stellt die Gesamtform eines PresentationML-Pakets vor.
Der Standard Teil eines PresentationML-Pakets beginnt mit einem Präsentationsstammelement. Dieses Element enthält eine Präsentation, die wiederum auf eine Folienliste, eine Folie master Liste, eine Notizen- master Liste und ein Handzettel master Liste verweist. Die Folienliste bezieht sich auf alle Folien in der Präsentation; Die Folie master Liste bezieht sich auf die gesamten Folienmaster, die in der Präsentation verwendet werden; die Notizen master enthält Informationen zur Formatierung von Notizenseiten; und die Handzettel master beschreibt, wie ein Handzettel aussieht.
Ein Handzettel ist ein gedruckter Foliensatz, der an das Publikum verteilt werden kann.
Neben Text und Grafiken kann jede Folie Kommentare und Notizen enthalten, ein Layout aufweisen und Teil mindestens einer zielgruppenorientierten Präsentation sein. Ein Kommentar ist eine an die Person, die die Präsentationsfolien verwaltet, gerichtete Anmerkung. Eine Notiz ist eine Erinnerung oder eine kurze Textstelle, die für den Präsentator oder das Publikum bestimmt ist.
Weitere Features, die ein PresentationML-Dokument umfassen kann: Animation, Audio, Video und Übergänge zwischen Folien.
Ein PresentationML-Dokument wird nicht als ein großer Textkörper in einem einzelnen Teil gespeichert. Die Elemente, mit deren Hilfe bestimmte Funktionsgruppierungen erfolgen, sind stattdessen in mehreren Teilen gespeichert. Beispielsweise sind alle Kommentare in einem Dokument in einem Kommentarteil gespeichert, wobei jede Folie über einen eigenen Teil verfügt.
© ISO/IEC29500: 2008.
Das folgende XML-Codebeispiel stellt eine Präsentation dar, die zwei Folien mit den IDs 267 und 256 enthält.
<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>
Mit dem Open XML SDK können Sie Dokumentstrukturen und -inhalte mithilfe stark typisierter Klassen erstellen, die PresentationML-Elementen entsprechen. Sie finden diese Klassen im DocumentFormat.OpenXml.Presentation-Namespace . Die folgende Tabelle enthält die Namen der Klassen, die den Elementen sld, sldLayout, sldMaster und notesMaster entsprechen.
PresentationML-Element | Open XML SDK-Klasse | Beschreibung |
---|---|---|
Sld | Slide | Präsentationsfolie. Das SlidePart-Stammelement. |
sldLayout | SlideLayout | Das Folienlayout. Das SlideLayoutPart-Stammelement. |
sldMaster | SlideMaster | Der Folienmaster. Das SlideMasterPart-Stammelement. |
notesMaster | NotesMaster | Notizenmaster (oder Handzettelmaster). Das NotesMasterPart-Stammelement. |
Die Struktur des Kommentarelements
Der folgende Text aus der SPEZIFIKATION ISO/IEC 29500 enthält Kommentare in einem Präsentationspaket.
Ein Kommentar ist eine an eine Folie angefügte Textnotiz und hat den Hauptzweck, den Lesern der Präsentation die Möglichkeit zu bieten, dem Autor der Präsentation Feedback zu geben. Jeder Kommentar besteht aus einer unformatierten Textzeichenfolge sowie Informationen zum Autor und ist an einer bestimmten Stelle einer Folie angefügt. Kommentare können beim Bearbeiten der Bildschirmpräsentation sichtbar sein, sie werden jedoch beim Halten der Präsentation nicht angezeigt. Die anzeigende Anwendung bestimmt, wann Kommentare angezeigt werden sollen, und deren visuelle Darstellung.
© ISO/IEC29500: 2008.
Das folgende XML-Element gibt einen einzelnen an eine Folie angefügten Kommentar an. Es enthält den Text des Kommentars (text), seine Position auf der Folie (pos) und Attribute, die auf den Autor (authorId), Datum und Uhrzeit (dt) und den Kommentarindex (idx) verweisen.
<p:cm authorId="0" dt="2006-08-28T17:26:44.129" idx="1">
<p:pos x="10" y="10"/>
<p:text>Add diagram to clarify.</p:text>
</p:cm>
In der folgenden Tabelle sind die Definitionen der Member und Attribute des cm-Kommentarelements aufgeführt.
Member/Attribut | Definition |
---|---|
authorId | Verweist auf die ID eines Autors in der Kommentarautorenliste des Dokuments. |
Dt | Datum und Uhrzeit der letzten Änderung dieses Kommentars. |
Idx | Eine Kennung dieses Kommentars, die in einer Liste aller Kommentare dieses Autors in diesem Dokument eindeutig ist. Der erste Kommentar eines Autors in einem Dokument hat den Index 1. |
Pos | Die Positionierungsinformationen zum Platzieren eines Kommentars auf einer Folienoberfläche. |
text | Der Textinhalt des Kommentars. |
extLst | Gibt die Erweiterungsliste mit Modifikationsmöglichkeit an, in der alle künftigen Erweiterungen des Elementtyps ext definiert werden. Die Erweiterung wird gemeinsam mit den entsprechenden künftigen Erweiterungen genutzt, um die Speicherfähigkeiten des PresentationML-Frameworks zu vergrößern. Dadurch können verschiedene neue Arten von Daten systeminhärent im Framework gespeichert werden. |
Das folgende XML-Schemabeispiel definiert die Member des cm-Elements zusätzlich zu den erforderlichen und optionalen Attributen.
<complexType name="CT_Comment">
<sequence>
<element name="pos" type="a:CT_Point2D" minOccurs="1" maxOccurs="1"/>
<element name="text" type="xsd:string" minOccurs="1" maxOccurs="1"/>
<element name="extLst" type="CT_ExtensionListModify" minOccurs="0" maxOccurs="1"/>
</sequence>
<attribute name="authorId" type="xsd:unsignedInt" use="required"/>
<attribute name="dt" type="xsd:dateTime" use="optional"/>
<attribute name="idx" type="ST_Index" use="required"/>
</complexType>
Funktionsweise des Beispielcodes
Nach Öffnen des Präsentationsdokuments mit Lese-/Schreibzugriff und Instanziieren der PresentationDocument-Klasse ruft der Code den angegebenen Kommentarautor aus der Liste der Kommentarautoren ab.
// Get the specifed comment author.
IEnumerable<CommentAuthor> commentAuthors =
doc.PresentationPart.CommentAuthorsPart.CommentAuthorList.Elements<CommentAuthor>()
.Where(e => e.Name.Value.Equals(author));
Durch Durchlaufen der übereinstimmenden Autoren und aller Folien in der Präsentation erhält der Code alle Folienteile und den Kommentarteil jedes Folienteils. Anschließend ruft er die Liste der Kommentare des angegebenen Autors ab und löscht jeden. Außerdem wird überprüft, ob der Kommentarteil über keinen vorhandenen Kommentar verfügt. In diesem Fall wird dieser Teil gelöscht. Außerdem wird der Kommentarautor aus dem Kommentarautorenteil gelöscht.
// Iterate through all the matching authors.
foreach (CommentAuthor commentAuthor in commentAuthors)
{
UInt32Value authorId = commentAuthor.Id;
// Iterate through all the slides and get the slide parts.
foreach (SlidePart slide in doc.PresentationPart.SlideParts)
{
SlideCommentsPart slideCommentsPart = slide.SlideCommentsPart;
// Get the list of comments.
if (slideCommentsPart != null && slide.SlideCommentsPart.CommentList != null)
{
IEnumerable<Comment> commentList =
slideCommentsPart.CommentList.Elements<Comment>().Where(e => e.AuthorId == authorId.Value);
List<Comment> comments = new List<Comment>();
comments = commentList.ToList<Comment>();
foreach (Comment comm in comments)
{
// Delete all the comments by the specified author.
slideCommentsPart.CommentList.RemoveChild<Comment>(comm);
}
// If the commentPart has no existing comment.
if (slideCommentsPart.CommentList.ChildElements.Count == 0)
// Delete this part.
slide.DeletePart(slideCommentsPart);
}
}
// Delete the comment author from the comment authors part.
doc.PresentationPart.CommentAuthorsPart.CommentAuthorList.RemoveChild<CommentAuthor>(commentAuthor);
}
Beispielcode
Die folgende Methode verwendet als Parameter den Namen und Pfad der Quellpräsentationsdatei sowie den Namen des Autors, dessen Kommentare gelöscht werden sollen. Sie findet alle Kommentare des angegebenen Autors in der Präsentation und löscht diese. Anschließend löscht sie den Kommentarautor aus der Liste der Kommentarautoren.
Mithilfe des folgenden Beispiels können Sie die DeleteCommentsByAuthorInPresentation-Methode zum Entfernen der Kommentare des angegebenen Autors aus der Präsentationsdatei, myppt5.pptx aufrufen.
string fileName = @"C:\Users\Public\Documents\myppt5.pptx";
string author = "Katie Jordan";
DeleteCommentsByAuthorInPresentation(fileName, author);
Hinweis
Um den genauen Namen des Autors abzurufen, öffnen Sie die Präsentationsdatei, klicken Sie auf das Menüelement Datei , und klicken Sie dann auf Optionen. Das Fenster PowerPoint-Optionen wird geöffnet, und der Inhalt der Registerkarte Allgemein wird angezeigt. Der Name des Autors muss mit dem Benutzernamen auf dieser Registerkarte übereinstimmen.
Es folgt der vollständige Beispielcode in C# und Visual Basic.
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Presentation;
using System.Collections.Generic;
using System.Linq;
DeleteCommentsByAuthorInPresentation(args[0], args[1]);
// Remove all the comments in the slides by a certain author.
static void DeleteCommentsByAuthorInPresentation(string fileName, string author)
{
using (PresentationDocument doc = PresentationDocument.Open(fileName, true))
{
// Get the specified comment author.
IEnumerable<CommentAuthor>? commentAuthors = doc.PresentationPart?.CommentAuthorsPart?.CommentAuthorList?.Elements<CommentAuthor>()
.Where(e => e.Name is not null && e.Name.Value is not null && e.Name.Value.Equals(author));
if (commentAuthors is null)
{
return;
}
// Iterate through all the matching authors.
foreach (CommentAuthor commentAuthor in commentAuthors)
{
UInt32Value? authorId = commentAuthor.Id;
IEnumerable<SlidePart>? slideParts = doc.PresentationPart?.SlideParts;
// If there's no author ID or slide parts, return.
if (authorId is null || slideParts is null)
{
return;
}
// Iterate through all the slides and get the slide parts.
foreach (SlidePart slide in slideParts)
{
SlideCommentsPart? slideCommentsPart = slide.SlideCommentsPart;
// Get the list of comments.
if (slideCommentsPart is not null && slide.SlideCommentsPart?.CommentList is not null)
{
IEnumerable<Comment> commentList = slideCommentsPart.CommentList.Elements<Comment>().Where(e => e.AuthorId is not null && e.AuthorId == authorId.Value);
List<Comment> comments = new List<Comment>();
comments = commentList.ToList<Comment>();
foreach (Comment comm in comments)
{
// Delete all the comments by the specified author.
slideCommentsPart.CommentList.RemoveChild<Comment>(comm);
}
// If the commentPart has no existing comment.
if (slideCommentsPart.CommentList.ChildElements.Count == 0)
// Delete this part.
slide.DeletePart(slideCommentsPart);
}
}
// Delete the comment author from the comment authors part.
doc.PresentationPart?.CommentAuthorsPart?.CommentAuthorList.RemoveChild(commentAuthor);
}
}
}