Abrufen aller externen Hyperlinks in einer Präsentation
In diesem Thema wird gezeigt, wie Sie die Klassen im Open XML SDK für Office verwenden, um alle externen Links in einer Präsentation programmgesteuert abzurufen.
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 PresentationDocument.Open(String, Boolean)-Methode auf, die einen Dateipfad verwendet, und einen booleschen Wert als zweiten Parameter, um anzugeben, ob ein Dokument bearbeitet werden kann. Legen Sie diesen zweiten Parameter auf false fest, um die Datei mit Schreibschutz zu öffnen, oder auf true, falls die Datei mit Lese-/Schreibzugriff geöffnet werden soll. In diesem Thema empfiehlt es sich, die Datei für den schreibgeschützten Zugriff zu öffnen, um die Datei vor versehentlichem Schreiben zu schützen. Mit der folgenden using-Anweisung wird die Datei mit Schreibschutz geöffnet. In diesem Codesegment ist der FileName-Parameter eine Zeichenfolge, die den Pfad für die Datei darstellt, aus der Sie das Dokument öffnen möchten.
// Open the presentation file as read-only.
using (PresentationDocument document = PresentationDocument.Open(fileName, false))
{
// 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 document.
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. |
Struktur des Hyperlinkelements
In diesem Codebeispiel vom Typ "Gewusst wie" verwenden Sie externe Hyperlinks. Daher sollten Sie das Hyperlinkelement näher kennenlernen. Im folgenden Text aus der SPEZIFIKATION ISO/IEC 29500 wird die ID (Hyperlinkziel) eingeführt.
Es gibt die ID der Beziehung an, deren Ziel als Ziel für diesen Hyperlink verwendet werden soll.
Wenn dieses Attribut nicht angegeben wird, darf kein externes Hyperlinkziel für den aktuellen Link vorhanden sein. Eine Position im aktuellen Dokument kann weiterhin über das Anker-Attribut als Ziel verwendet werden. Wenn dieses Attribut vorhanden ist, ersetzt es den Wert im Ankersattribut.
[Beispiel: Betrachten Sie Folgendes :PresentationML**-Fragment für einen Link:
<w:hyperlink r:id="rId9">
<w:r>
<w:t>https://www.example.com</w:t>
</w:r>
</w:hyperlink>
Der Id-Attributwert von rId9 gibt an, dass die Beziehung im zugeordneten Beziehungsteilelement mit einem entsprechenden Id-Attributwert beim Aufrufen dieses Links navigiert werden muss. Wenn beispielsweise der folgende XML-Code im zugeordneten Beziehungsteilelement vorhanden ist:
<Relationships xmlns="…">
<Relationship Id="rId9" Mode="External"
Target=https://www.example.com />
</Relationships>
Das Ziel dieses Links wäre daher das Ziel der Beziehung rId9 , https://www.example.comin diesem Fall . Ende des Beispiels]
Die möglichen Werte dieses Attributs werden durch den einfachen Typ ST_RelationshipId (§22.8.2.1) definiert.
© ISO/IEC29500: 2008.
Funktionsweise des Beispielcodes
Der Beispielcode in diesem Thema besteht aus einer Methode, die den vollständigen Pfad der Präsentationsdatei als Parameter verwendet. Sie durchläuft alle Folien der Präsentation und gibt eine Liste der Zeichenfolgen zurück, die URIs (Universal Resource Identifiers) aller externen Hyperlinks in der Präsentation darstellen.
// Iterate through all the slide parts in the presentation part.
foreach (SlidePart slidePart in document.PresentationPart.SlideParts)
{
IEnumerable<Drawing.HyperlinkType> links = slidePart.Slide.Descendants<Drawing.HyperlinkType>();
// Iterate through all the links in the slide part.
foreach (Drawing.HyperlinkType link in links)
{
// Iterate through all the external relationships in the slide part.
foreach (HyperlinkRelationship relation in slidePart.HyperlinkRelationships)
{
// If the relationship ID matches the link ID…
if (relation.Id.Equals(link.Id))
{
// Add the URI of the external relationship to the list of strings.
ret.Add(relation.Uri.AbsoluteUri);
}
Beispielcode
Es folgt das vollständige Codebeispiel, das Sie zum Zurückgeben der Liste aller externen Hyperlinks in einer Präsentation verwenden können. Sie können die folgende Schleife im Programm verwenden, um die GetAllExternalHyperlinksInPresentation-Methode zum Abrufen der Liste der URIs in der Präsentation aufzurufen.
string fileName = @"C:\Users\Public\Documents\Myppt7.pptx";
foreach (string s in GetAllExternalHyperlinksInPresentation(fileName))
Console.WriteLine(s);
using DocumentFormat.OpenXml.Packaging;
using System;
using System.Collections.Generic;
using Drawing = DocumentFormat.OpenXml.Drawing;
GetAllExternalHyperlinksInPresentation(args[0]);
// Returns all the external hyperlinks in the slides of a presentation.
static IEnumerable<String> GetAllExternalHyperlinksInPresentation(string fileName)
{
// Declare a list of strings.
List<string> ret = new List<string>();
// Open the presentation file as read-only.
using (PresentationDocument document = PresentationDocument.Open(fileName, false))
{
// If there is no PresentationPart then there are no hyperlinks
if (document.PresentationPart is null)
{
return ret;
}
// Iterate through all the slide parts in the presentation part.
foreach (SlidePart slidePart in document.PresentationPart.SlideParts)
{
IEnumerable<Drawing.HyperlinkType> links = slidePart.Slide.Descendants<Drawing.HyperlinkType>();
// Iterate through all the links in the slide part.
foreach (Drawing.HyperlinkType link in links)
{
// Iterate through all the external relationships in the slide part.
foreach (HyperlinkRelationship relation in slidePart.HyperlinkRelationships)
{
// If the relationship ID matches the link ID…
if (relation.Id.Equals(link.Id))
{
// Add the URI of the external relationship to the list of strings.
ret.Add(relation.Uri.AbsoluteUri);
}
}
}
}
}
// Return the list of strings.
return ret;
}