Freigeben über


Öffnen eines Präsentationsdokuments mit Schreibschutz

In diesem Thema wird beschrieben, wie Sie die Klassen im Open XML SDK für Office verwenden, um ein Präsentationsdokument programmgesteuert für den schreibgeschützten Zugriff zu öffnen.

So öffnen Sie eine Datei mit Schreibschutz

Möglicherweise möchten Sie ein Präsentationsdokument öffnen, um die Folien zu lesen. Vielleicht möchten Sie Informationen aus einer Folie extrahieren, eine Folie in eine Folienbibliothek kopieren oder die Titel der Folien auflisten. In diesen Fällen möchten Sie dies auf eine Art und Weise tun, in der sichergestellt wird, dass das Dokument nicht geändert wird. Hierzu können Sie das Dokument mit Schreibschutz öffnen. In diesem Thema vom Typ "Gewusst wie" werden verschiedene Möglichkeiten vorgestellt, ein Präsentationsdokument mit Schreibschutz zu öffnen.

Erstellen einer Instanz der PresentationDocument-Klasse

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 eine der Open Methoden auf. Es stehen verschiedene Open-Methoden mit einer jeweils anderen Signatur zur Verfügung. Die folgende Tabelle enthält eine Teilmenge der Überladungen für die Open -Methode, die Sie zum Öffnen des Pakets verwenden können.

Name Beschreibung
Open Erstellen Sie eine neue instance der PresentationDocument -Klasse aus der angegebenen Datei.
Open Erstellen Sie eine neue instance der PresentationDocument -Klasse aus dem E/A-Stream.
Open Erstellen Sie eine neue instance der PresentationDocument -Klasse aus dem angegebenen Paket.

Die vorherige Tabelle enthält zwei Open Methoden, die einen booleschen Wert als zweiten Parameter akzeptieren, um anzugeben, ob ein Dokument bearbeitet werden kann. Um ein Dokument für schreibgeschützten Zugriff zu öffnen, geben Sie den Wert false für diesen Parameter an.

Beispielsweise können Sie die Präsentationsdatei schreibgeschützt öffnen und sie einem PresentationDocument -Objekt zuweisen, wie in der folgenden using Anweisung gezeigt. In diesem Code ist der presentationFile Parameter eine Zeichenfolge, die den Pfad der Datei darstellt, aus der Sie das Dokument öffnen möchten.

    using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFilePath, false))
    {
        // Insert other code here.
    }

Sie können auch die zweite Überladung der Open -Methode in der obigen Tabelle verwenden, um eine instance der PresentationDocument Klasse basierend auf einem E/A-Stream zu erstellen. Sie können diesen Ansatz verwenden, wenn Sie über eine Microsoft SharePoint Foundation 2010-Anwendung verfügen, die Stream-E/A verwendet, und Sie das Open XML SDK für die Arbeit mit einem Dokument verwenden möchten. Im folgenden Codesegment wird ein Dokument auf der Grundlage eines Datenstroms geöffnet.

    Stream stream = File.Open(strDoc, FileMode.Open);
    using (PresentationDocument presentationDocument = PresentationDocument.Open(stream, false)) 
    {
        // Place other code here.
    }

Angenommen, Sie haben eine Anwendung, die die Open XML-Unterstützung im System.IO.Packaging Namespace der .NET Framework-Klassenbibliothek verwendet, und Sie möchten das Open XML SDK verwenden, um mit einem schreibgeschützten Paket zu arbeiten. Das Open XML SDK enthält eine Methodenüberladung, die als einzigen Parameter akzeptiert Package . Es ist kein boolescher Parameter vorhanden, um anzugeben, ob das Dokument zur Bearbeitung geöffnet werden soll. Der empfohlene Ansatz besteht darin, das Paket vor dem Erstellen des instance der PresentationDocument Klasse als schreibgeschützt zu öffnen. Im folgenden Codesegment wird dieser Vorgang ausgeführt.

    Package presentationPackage = Package.Open(filepath, FileMode.Open, FileAccess.Read);
    using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationPackage))
    {
        // Other code goes here.
    }

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 -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.

Funktionsweise des Beispielcodes

Instanziieren PresentationPartSie im Beispielcode, nachdem Sie das Präsentationsdokument in der using -Anweisung für den schreibgeschützten Zugriff geöffnet haben, und öffnen Sie die Folienliste. Sie erhalten dann die Beziehungs-ID der ersten Folie.

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

Aus der Beziehungs-ID erhalten relIdSie den Folienteil und dann den inneren Text der Folie, indem Sie mit StringBuildereine Textzeichenfolge erstellen.

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

Der innere Text der Folie, der ein out Parameter der GetSlideIdAndText -Methode ist, wird an die anzuzeigende Standard-Methode zurückgegeben.

Wichtig

In diesem Beispiel wird nur der Text in der Präsentationsdatei angezeigt. Teile, bei denen es sich nicht um Text handelt, wie Formen oder Grafiken, werden nicht angezeigt.

Beispielcode

Im folgenden Beispiel wird eine Präsentationsdatei für schreibgeschützten Zugriff geöffnet und der innere Text einer Folie an einem angegebenen Index abgerufen. Um die -Methode GetSlideIdAndText aufzurufen, übergeben Sie den vollständigen Pfad des Präsentationsdokuments. Übergeben Sie auch den out Parameter sldText, dem ein Wert in der Methode selbst zugewiesen wird, und dann können Sie seinen Wert im Standard-Programm anzeigen. Der folgende Aufruf der GetSlideIdAndText -Methode ruft z. B. den inneren Text in einer Präsentationsdatei aus dem Index und dem Dateipfad ab, der als Argumente an die Anwendung übergeben wird.

Tipp

Die am häufigsten erwartete Ausnahme in diesem Programm ist die ArgumentOutOfRangeException Ausnahme. Sie könnte z. B. ausgegeben werden, wenn eine Datei zwei Folien enthält und der Text in Folie 4 angezeigt werden soll. Daher empfiehlt es sich, einen try -Block zu verwenden, wenn Sie die GetSlideIdAndText -Methode aufrufen, wie im folgenden Beispiel gezeigt.

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

Es folgt die vollständige Codeliste in C# und 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();
    }
}