Gewusst wie: Öffnen eines Präsentationsdokuments mit Schreibschutz

Letzte Änderung: Donnerstag, 13. Januar 2011

Gilt für: Excel 2010 | Office 2010 | PowerPoint 2010 | Word 2010

Inhalt dieses Artikels
So öffnen Sie eine Datei mit Schreibschutz
Erstellen einer Instanz der PresentationDocument-Klasse
Grundlegende Präsentationsdokumentstruktur
Funktionsweise des Beispielcodes
Beispielcode

In diesem Thema wird erklärt, wie Sie mithilfe der Klassen im Open XML SDK 2.0 für Microsoft Office programmgesteuert ein Präsentationsdokument mit Schreibschutz öffnen.

Die folgenden Assemblydirektiven sind zum Kompilieren des Codes in diesem Thema erforderlich.

using System;
using System.Collections.Generic;
using DocumentFormat.OpenXml.Presentation;
using A = DocumentFormat.OpenXml.Drawing;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml;
using System.Text;
Imports System
Imports System.Collections.Generic
Imports DocumentFormat.OpenXml.Presentation
Imports A = DocumentFormat.OpenXml.Drawing
Imports DocumentFormat.OpenXml.Packaging
Imports DocumentFormat.OpenXml
Imports System.Text

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. Zur Verwendung eines Präsentationsdokuments müssen Sie zuerst eine Instanz der PresentationDocument-Klasse erstellen und anschließend mit dieser Instanz arbeiten. Rufen Sie zum Erstellen der Klasseninstanz aus dem Dokument eine der Open-Methoden auf. Es stehen verschiedene Open-Methoden mit einer jeweils anderen Signatur zur Verfügung. Die folgende Tabelle enthält eine Untergruppe der Überladungen für die Open-Methode, die Sie zum Öffnen des Pakets verwenden können.

Name

Beschreibung

Open(String, Boolean)

Erstellt eine neue Instanz der PresentationDocument-Klasse anhand der angegebenen Datei.

Open(Stream, Boolean)

Erstellt eine neue Instanz der PresentationDocument-Klasse anhand des E/A-Datenstroms.

Open(Package)

Erstellt eine neue Instanz der PresentationDocument-Klasse anhand des angegebenen Pakets.

In der vorherigen Tabelle sind die beiden Open-Methoden enthalten, die als zweiten Parameter einen booleschen Wert akzeptieren, um anzugeben, ob ein Dokument bearbeitet werden kann. Geben Sie zum Öffnen eines Dokuments mit Schreibschutz den Wert false für diesen Parameter an.

Sie können die Präsentationsdatei beispielsweise mit Schreibschutz öffnen und einem PresentationDocument-Objekt wie in der folgenden using-Anweisung gezeigt zuordnen. 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(presentationFile, false))
{
    // Insert other code here.
}
Using presentationDocument As PresentationDocument = PresentationDocument.Open(presentationFile, False)
    ' Insert other code here.
End Using

Sie können auch die zweite Überladung der Open-Methode (siehe Tabelle oben) zum Erstellen einer Instanz der PresentationDocument-Klasse basierend auf einem E/A-Datenstrom verwenden. Sie können diesen Ansatz verwenden, wenn eine Microsoft SharePoint Foundation 2010-Anwendung Datenstrom-E/A verwendet und Sie das Open XML SDK 2.0 zur Bearbeitung eines Dokuments 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.
}
Dim stream As Stream = File.Open(strDoc, FileMode.Open)
Using presentationDocument As PresentationDocument = PresentationDocument.Open(stream, False)
    ' Other code goes here.
End Using

Angenommen, Ihre Anwendung nutzt die Open XML-Unterstützung im System.IO.Packaging-Namespace der .NET Framework-Klassenbibliothek, und Sie möchten das Open XML SDK 2.0 verwenden, um mit einem Paket mit Schreibschutz zu arbeiten. Das Open XML SDK 2.0 enthält eine Methodenüberladung, die ein Package-Element als einzigen Parameter akzeptiert. Es ist kein boolescher Parameter vorhanden, um anzugeben, ob das Dokument zur Bearbeitung geöffnet werden soll. Es wird empfohlen, das Paket mit Schreibschutz zu öffnen, bevor die Instanz der PresentationDocument-Klasse erstellt wird. 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.
}
Dim presentationPackage As Package = Package.Open(filepath, FileMode.Open, FileAccess.Read)
Using presentationDocument As PresentationDocument = PresentationDocument.Open(presentationPackage)
    ' Other code goes here.
End Using

Grundlegende Präsentationsdokumentstruktur

Die grundlegende Dokumentstruktur eines PresentationML-Dokuments besteht aus vielen Teilen, darunter der Hauptteil mit der Präsentationsdefinition. Im folgenden Text aus der ISO/IEC 29500-Spezifikation wird das Gesamtformat eines PresentationML-Pakets erläutert.

Der Hauptteil eines PresentationML-Pakets beginnt mit dem Stammelement der Präsentation. Dieses Element enthält eine Präsentation, die wiederum auf eine Folienliste, eine Folienmasterliste, eine Notizenmasterliste und eine Handzettelmasterliste verweist. Die Folienliste verweist auf alle Folien in der Präsentation. Die Folienmasterliste verweist auf sämtliche in der Präsentation verwendeten Folienmaster. Der Notizenmaster enthält Informationen zur Formatierung der Notizenseiten. Und der Handzettelmaster beschreibt das Aussehen eines Handzettels.

Ein Handzettel ist ein gedruckter Foliensatz, der an eine Zielgruppe zur späteren Bezugnahme 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 Anmerkung der Person, die die Foliengruppe der Präsentation verwaltet. Eine Notiz ist eine Erinnerung oder eine kurze Textstelle, die für den Präsentator oder die Zielgruppe bestimmt ist.)

Andere Features, die in einem PresentationML-Dokument enthalten sein können, sind Animationen, Audio, Video und Überblendungen zwischen den 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-Codesegment stellt eine Präsentation dar, die zwei Folien mit den IDs 267 und 256 enthält. Die ID-Eigenschaft gibt die Folien-ID an, die einen in der Präsentation eindeutigen Wert enthält. Die möglichen Werte für dieses Attribut liegen zwischen 256 und 2147483647.

<p:presentation xmlns:p="…" … > 
   <p:sldMasterIdLst>
      <p:sldMasterId
         xmlns:rel="http://…/relationships" rel:id="rId1"/>
   </p:sldMasterIdLst>
   <p:notesMasterIdLst>
      <p:notesMasterId
         xmlns:rel="http://…/relationships" rel:id="rId4"/>
   </p:notesMasterIdLst>
   <p:handoutMasterIdLst>
      <p:handoutMasterId
         xmlns:rel="http://…/relationships" rel:id="rId5"/>
   </p:handoutMasterIdLst>
   <p:sldIdLst>
      <p:sldId id="267"
         xmlns:rel="http://…/relationships" rel:id="rId2"/>
      <p:sldId id="256"
         xmlns:rel="http://…/relationships" rel:id="rId3"/>
   </p:sldIdLst>
       <p:sldSz cx="9144000" cy="6858000"/>
   <p:notesSz cx="6858000" cy="9144000"/>
</p:presentation>

Funktionsweise des Beispielcodes

Instanziieren Sie im Beispielcode, nachdem Sie das Präsentationsdokument in der using-Anweisung mit Schreibschutz geöffnet haben, das PresentationPart-Element, und öffnen Sie dann 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;
string relId = (slideIds[index] as SlideId).RelationshipId;
' Get the relationship ID of the first slide.
Dim part As PresentationPart = ppt.PresentationPart
Dim slideIds As OpenXmlElementList = part.Presentation.SlideIdList.ChildElements
Dim relId As String = (TryCast(slideIds(index), SlideId)).RelationshipId

Aus der Beziehungs-ID relId erhalten Sie den Folienteil und dann den inneren Text der Folie, indem eine Textzeichenfolge mit StringBuilder erstellt wird.

// 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();
' Get the slide part from the relationship ID.
Dim slide As SlidePart = CType(part.GetPartById(relId), SlidePart)

' Build a StringBuilder object.
Dim paragraphText As New StringBuilder()

' Get the inner text of the slide.
Dim texts As IEnumerable(Of A.Text) = slide.Slide.Descendants(Of A.Text)()
For Each text As A.Text In texts
    paragraphText.Append(text.Text)
Next text
sldText = paragraphText.ToString()

Der innere Text der Folie, bei dem es sich um einen out-Parameter der GetSlideIdAndText-Methode handelt, wird an die Hauptmethode zurückgegeben, die angezeigt werden soll.

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 mit Schreibschutz geöffnet, und der innere Text einer Folie wird an einem angegebenen Index abgerufen. Übergeben Sie zum Aufrufen der GetSlideIdAndText-Methode den vollständigen Pfad des Präsentationsdokuments. Übergeben Sie auch den out-Parameter sldText, dem in der Methode ein Wert zugeordnet wird. Anschließend können Sie den Wert im Hauptprogramm anzeigen. Mit dem folgenden Aufruf der GetSlideIdAndText-Methode wird z. B. der innere Text der zweiten Folie in einer Präsentationsdatei mit dem Namen Myppt13.pptx abgerufen.

Tipp

Die am meisten 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 ist es empfehlenswert, einen try-Block verwendet werden, wenn Sie die GetSlideIdAndText-Methode wie im folgenden Beispiel gezeigt aufrufen.

string file = @"C:\Users\Public\Documents\Myppt13.pptx";
string slideText;
int index = 1;
try
{
    GetSlideIdAndText(out slideText, file, index);
    Console.WriteLine("The text in the slide #{0} is: {1}", index + 1, slideText);
}
catch (ArgumentOutOfRangeException exp)
{
    Console.WriteLine(exp.Message);
}
Dim file As String = "C:\Users\Public\Documents\Myppt13.pptx"
Dim slideText As String = Nothing
Dim index As Integer = 1
Try
    GetSlideIdAndText(slideText, file, index)
    Console.WriteLine("The text in the slide #{0} is: {1}", index + 1, slideText)
Catch exp As ArgumentOutOfRangeException
    Console.WriteLine(exp.Message)
End Try

Es folgt die vollständige Codeliste in C# und Visual Basic.

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

        // 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();
    }
}
Public Sub GetSlideIdAndText(ByRef sldText As String, ByVal docName As String, ByVal index As Integer)
    Using ppt As PresentationDocument = PresentationDocument.Open(docName, False)
        ' Get the relationship ID of the first slide.
        Dim part As PresentationPart = ppt.PresentationPart
        Dim slideIds As OpenXmlElementList = part.Presentation.SlideIdList.ChildElements
        Dim relId As String = TryCast(slideIds(index), SlideId).RelationshipId
        relId = TryCast(slideIds(index), SlideId).RelationshipId

        ' Get the slide part from the relationship ID.
        Dim slide As SlidePart = DirectCast(part.GetPartById(relId), SlidePart)

        ' Build a StringBuilder object.
        Dim paragraphText As New StringBuilder()

        ' Get the inner text of the slide:
        Dim texts As IEnumerable(Of A.Text) = slide.Slide.Descendants(Of A.Text)()
        For Each text As A.Text In texts
            paragraphText.Append(text.Text)
        Next
        sldText = paragraphText.ToString()
    End Using
End Sub

Siehe auch

Referenz

Class Library Reference