Freigeben über


Abrufen des gesamten Texts aller Folien in einer Präsentation

In diesem Thema wird gezeigt, wie Sie die Klassen im Open XML SDK verwenden, um den gesamten Text in allen Folien einer Präsentation programmgesteuert abzurufen.


Abrufen eines PresentationDocument-Objekts

Im Open XML SDK stellt die PresentationDocument -Klasse ein Präsentationsdokumentpaket dar. Um mit einem Präsentationsdokument zu arbeiten, erstellen Sie zuerst eine instance der PresentationDocument Klasse, und arbeiten Sie dann mit diesem instance. Um die Klasse instance aus dem Dokument zu erstellen, rufen Sie die Open -Methode auf, die einen Dateipfad verwendet, und einen booleschen Wert als zweiten Parameter, um anzugeben, ob ein Dokument bearbeitet werden kann. Um ein Dokument für Lese-/Schreibzugriff zu öffnen, weisen Sie den Wert true diesem Parameter zu. Weisen Sie ihm für den schreibgeschützten Zugriff den Wert false zu, wie in der folgenden using Anweisung gezeigt. In diesem Code ist der presentationFile Parameter eine Zeichenfolge, die den Pfad für die Datei darstellt, aus der Sie das Dokument öffnen möchten.

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

Mit v3.0.0 und höher wurde die Close() -Methode entfernt, um sich auf die using-Anweisung zu verlassen. Dadurch wird sichergestellt, dass die Dispose() -Methode automatisch aufgerufen wird, wenn die schließende Klammer erreicht ist. Der Block, der auf die using -Anweisung folgt, richtet einen Bereich für das Objekt ein, das in der using -Anweisung erstellt oder benannt wird, in diesem Fall presentationDocument.


Grundlegende Präsentationsdokumentstruktur

Die grundlegende Dokumentstruktur eines PresentationML Dokuments besteht aus einer Reihe von Teilen, darunter der Standard Teil, der die Präsentationsdefinition enthält. Der folgende Text aus der SPEZIFIKATION ISO/IEC 29500 stellt die Gesamtform eines Pakets vor PresentationML .

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 Text in einem einzelnen Teil gespeichert. Die Elemente, mit deren Hilfe bestimmte Funktionsgruppierungen erfolgen, sind stattdessen in mehreren Teilen gespeichert. Beispielsweise werden alle Autoren in einem Dokument in einem Autorenteil gespeichert, während jede Folie über einen eigenen Teil verfügt.

ISO/IEC 29500: 2016

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. In der folgenden Tabelle sind die Klassennamen der Klassen aufgeführt, die den sldElementen , sldLayout, sldMasterund 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.

Beispielcode

Der folgende Code ruft den ganzen Text aller Folien in einer bestimmten Präsentationsdatei ab. Sie können z. B. den Namen der Datei als Argument übergeben und dann eine foreach Schleife in Ihrem Programm verwenden, um das Array von Zeichenfolgen abzurufen, das von der Methode GetSlideIdAndText zurückgegeben wird, wie im folgenden Beispiel gezeigt.

if (args is [{ } path])
{
    int numberOfSlides = CountSlides(path);
    Console.WriteLine($"Number of slides = {numberOfSlides}");

    for (int i = 0;  i < numberOfSlides; i++)
    {
        GetSlideIdAndText(out string text, path, i);
        Console.WriteLine($"Side #{i + 1} contains: {text}");
    }
}

Es folgt der vollständige Beispielcode in C# und Visual Basic.

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

// Count the slides in the presentation.
static int CountSlidesFromPresentation(PresentationDocument presentationDocument)
{
    // Check for a null document object.
    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;
}

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 (part is null || slideIds.Count == 0)
        {
            sldText = "";
            return;
        }

        string? relId = ((SlideId)slideIds[index]).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();
    }
}

Siehe auch

Referenz zur Open XML SDK-Klassenbibliothek