Este artículo proviene de un motor de traducción automática. Mueva el puntero sobre las frases del artículo para ver el texto original.
Traducción
Original

Procedimiento para eliminar una diapositiva de una presentación (SDK de Open XML)

Esta documentación es preliminar y está sujeta a modificaciones.

Última modificación:lunes, 9 de marzo de 2015

Hace referencia a:Office 2013 | Open XML

En este artículo
Obtención de un objeto de presentación
Estructura básica de un documento de presentación
Recuento del número de diapositivas
Eliminación de una diapositiva específica
Código de ejemplo

En este tema se muestra cómo usar SDK de Open XML 2.5 para Office para eliminar mediante programación una diapositiva de una presentación. Además, se muestra cómo eliminar todas las referencias a la diapositiva de todas las presentaciones personalizadas que puedan existir. Para eliminar una diapositiva específica de un archivo de presentación, debe conocer el número de diapositivas que esta contiene. Por lo tanto, el código de este procedimiento se divide en dos partes. La primera cuenta el número de diapositivas y la segunda elimina la diapositiva de un determinado índice.

Nota Nota

Para eliminar una diapositiva de presentaciones más complejas, como aquellas que tienen configuración de vista en esquema, es posible que deban llevarse a cabo pasos adicionales.

Se requieren las siguientes directivas de ensamblado para compilar el código de este tema.

using System;
using System.Collections.Generic;
using System.Linq;
using DocumentFormat.OpenXml.Presentation;
using DocumentFormat.OpenXml.Packaging;

En Open XML SDK, la clase PresentationDocument representa un paquete de documentos de presentación. Para trabajar con un documento de presentación, cree una instancia de la clase PresentationDocument y, a continuación, trabaje con dicha instancia. Para crear la instancia de la clase desde el documento, llame a una de las sobrecargas del método Open. El código en este tema usa el método PresentationDocument.Open(String, Boolean), que toma una ruta de archivo como el primer parámetro para especificar el archivo que se abrirá y un valor booleano como el segundo parámetro para especificar si se puede editar el documento. Defina este segundo parámetro en false para abrir el archivo con acceso de solo lectura o en true si desea abrir el archivo con acceso de lectura/escritura. El código en este tema abre el archivo dos veces, una vez para contar el número de diapositivas y otra vez para eliminar una determinada diapositiva. Cuando cuente el número de diapositivas de una presentación, se recomienda abrir el archivo con acceso de solo lectura para evitar escribir accidentalmente el archivo. La siguiente instrucción using abre el archivo con acceso de solo lectura. En este ejemplo de código, el parámetro presentationFile es una cadena que representa la ruta del archivo a partir desde donde desea abrir el documento.

// Open the presentation as read-only.
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, false))
{
    // Insert other code here.
}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                

Para eliminar una diapositiva del archivo de presentación, ábralo con acceso de lectura/escritura como se muestra en la siguiente instrucción using.

// Open the source document as read/write.
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))
{
    // Place other code here.
}

La instrucción using proporciona una alternativa recomendada a la típica secuencia .Open, .Save, .Close. Asegura que se llamará automáticamente al método Dispose (un método interno que Open XML SDK usa para limpiar recursos) cuando se llegue a la llave de cierre. El bloque que sigue a la instrucción using establece un ámbito para el objeto que se crea o se nombra en la instrucción using, en este caso presentationDocument.

La estructura básica de un documento PresentationML consta de la parte principal, que contiene la definición de la presentación. El siguiente texto de la especificación ISO/IEC 29500 presenta el formato general de un paquete de PresentationML.

La parte principal de un paquete de PresentationML comienza con un elemento raíz de presentación. Este elemento contiene una presentación que, a su vez, hace referencia a una lista de diapositivas, una lista de patrones de diapositivas, una lista de patrones de notas y una lista de patrones de documentos. La lista de diapositivas hace referencia a todas las diapositivas de la presentación, la lista de patrones de diapositivas hace referencia a todos los patrones de diapositivas usados en la presentación, el patrón de notas contiene información acerca del formato de las páginas de notas y el patrón de documentos describe la apariencia de los documentos.Un documento es un conjunto impreso de diapositivas que se pueden proporcionar a un público para futuras referencias.Al igual que el texto y los gráficos, cada diapositiva puede incluir comentarios y notas, tener un diseño y formar parte de una o varias presentaciones personalizadas. (Un comentario es una anotación dirigida a la persona que se encarga del mantenimiento de las diapositivas de la presentación. Una nota es un aviso o texto dirigido al moderador o al público).Un documento PresentationML puede incluir otras características, como animación, audio, vídeo y transiciones entre las diapositivas.Los documentos PresentationML no se almacenan como un gran cuerpo en una sola parte. En su lugar, los elementos que implementan ciertas agrupaciones de funcionalidades se almacenan en partes independientes. Por ejemplo, todos los comentarios de un documento se almacenan en una parte de comentarios mientras que cada diapositiva cuenta con su propia parte.© ISO/IEC29500: 2008.

El siguiente segmento de código XML representa una presentación que contiene dos diapositivas indicadas por los ID 267 y 256.

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

Con SDK de Open XML 2.5 puede crear contenido y estructuras de documentos con clases fuertemente tipadas que corresponden a elementos PresentationML. Puede encontrar estas clases en el espacio de nombres DocumentFormat.OpenXml.Presentation. En la tabla siguiente se enumeran los nombres de las clases que corresponden a los elementos sld, sldLayout, sldMaster y notesMaster.

Elemento de PresentationML

Clase de SDK de Open XML 2.5

Descripción

sld

Slide

Diapositiva de presentación. Es el elemento raíz de SlidePart.

sldLayout

SlideLayout

Diseño de la diapositiva. Es el elemento raíz de SlideLayoutPart.

sldMaster

SlideMaster

Patrón de diapositivas. Es el elemento raíz de SlideMasterPart.

notesMaster

NotesMaster

Patrón de notas (o handoutMaster). Es el elemento raíz de NotesMasterPart.

El código de ejemplo consta de dos sobrecargas del método CountSlides. La primera sobrecarga usa un parámetro string y la segunda sobrecarga usa un parámetro PresentationDocument. En el primer método CountSlides, el código de ejemplo abre el documento de presentación en la instrucción using. A continuación, pasa el objeto PresentationDocument al segundo método CountSlides, que devuelve un número entero que representa el número de diapositivas de la presentación.

// Pass the presentation to the next CountSlides method
// and return the slide count.
return CountSlides(presentationDocument);

En el segundo método CountSlides, el código comprueba que el objeto PresentationDocument pasado no sea null y si no lo es, obtiene un objeto PresentationPart del objeto PresentationDocument. Mediante el uso de SlideParts, el código obtiene slideCount y lo devuelve.

// Check for a null document object.
if (presentationDocument == 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 != null)
{
    slidesCount = presentationPart.SlideParts.Count();
}
// Return the slide count to the previous method.
return slidesCount;

El código para eliminar una diapositiva usa dos sobrecargas del método DeleteSlide. El primer método DeleteSlide sobrecargado toma dos parámetros: una cadena que representa el nombre y la ruta del archivo de presentación, y un número entero que representa la ubicación de índice de base cero de la diapositiva que se eliminará. Abre el archivo de presentación con acceso de lectura/escritura, obtiene un objeto PresentationDocument y pasa el objeto y el número de índice al siguiente método DeleteSlide sobrecargado, que realiza la eliminación.

// Get the presentation object and pass it to the next DeleteSlide method.
public static void DeleteSlide(string presentationFile, int slideIndex)
{
    // Open the source document as read/write.

    using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))
    {
      // Pass the source document and the index of the slide to be deleted to the next DeleteSlide method.
      DeleteSlide(presentationDocument, slideIndex);
    }
}  

La primera sección del segundo método DeleteSlide sobrecargado usa el método CountSlides para obtener el número de diapositivas de la presentación. A continuación, obtiene la lista de identificadores de diapositivas de la presentación, identifica la diapositiva especificada y la quita de la lista de diapositivas.

// Delete the specified slide from the presentation.
public static void DeleteSlide(PresentationDocument presentationDocument, int slideIndex)
{
    if (presentationDocument == null)
    {
        throw new ArgumentNullException("presentationDocument");
    }

    // Use the CountSlides sample to get the number of slides in the presentation.
    int slidesCount = CountSlides(presentationDocument);

    if (slideIndex < 0 || slideIndex >= slidesCount)
    {
        throw new ArgumentOutOfRangeException("slideIndex");
    }

    // Get the presentation part from the presentation document. 
    PresentationPart presentationPart = presentationDocument.PresentationPart;

    // Get the presentation from the presentation part.
    Presentation presentation = presentationPart.Presentation;

    // Get the list of slide IDs in the presentation.
    SlideIdList slideIdList = presentation.SlideIdList;

    // Get the slide ID of the specified slide
    SlideId slideId = slideIdList.ChildElements[slideIndex] as SlideId;

    // Get the relationship ID of the slide.
    string slideRelId = slideId.RelationshipId;

    // Remove the slide from the slide list.
    slideIdList.RemoveChild(slideId);

La siguiente sección del segundo método DeleteSlide sobrecargado quita todas las referencias a la diapositiva eliminada de presentaciones personalizadas. Se consigue mediante la iteración de la lista de presentaciones personalizadas y la lista de diapositivas en cada presentación personalizada. A continuación, declara y crea una instancia de una lista vinculada de entradas de listas de diapositivas y busca las referencias a la diapositiva eliminada mediante el identificador de relación de esa diapositiva. Agrega las referencias a la lista de entradas de listas de diapositivas y, a continuación, quita dicha referencia de cada en la lista de la diapositiva de la presentación personalizada correspondiente.

// Remove references to the slide from all custom shows.
if (presentation.CustomShowList != null)
{
    // Iterate through the list of custom shows.
    foreach (var customShow in presentation.CustomShowList.Elements<CustomShow>())
    {
        if (customShow.SlideList != null)
        {
            // Declare a link list of slide list entries.
            LinkedList<SlideListEntry> slideListEntries = new LinkedList<SlideListEntry>();
            foreach (SlideListEntry slideListEntry in customShow.SlideList.Elements())
            {
                // Find the slide reference to remove from the custom show.
                if (slideListEntry.Id != null && slideListEntry.Id == slideRelId)
                {
                    slideListEntries.AddLast(slideListEntry);
                }
            }

            // Remove all references to the slide from the custom show.
            foreach (SlideListEntry slideListEntry in slideListEntries)
            {
                customShow.SlideList.RemoveChild(slideListEntry);
            }
        }
    }
}

Por último, el código guarda la presentación modificada y elimina la parte de diapositiva que corresponde a la diapositiva eliminada.

// Save the modified presentation.
presentation.Save();

// Get the slide part for the specified slide.
SlidePart slidePart = presentationPart.GetPartById(slideRelId) as SlidePart;

// Remove the slide part.
presentationPart.DeletePart(slidePart);
}

A continuación se presenta el código de ejemplo completo de los dos métodos sobrecargados, CountSlides y DeleteSlide. Para usar el código, puede emplear la siguiente llamada de ejemplo para eliminar la diapositiva en el índice 2 del archivo de presentación "Myppt6.pptx."

DeleteSlide(@"C:\Users\Public\Documents\Myppt6.pptx", 2);

También puede usar la siguiente llamada para contar el número de diapositivas de la presentación.

Console.WriteLine("Number of slides = {0}",
CountSlides(@"C:\Users\Public\Documents\Myppt6.pptx"));

Una buena idea sería contar el número de diapositivas antes y después de realizar la eliminación.

A continuación se incluye el código de ejemplo completo en C# y Visual Basic.

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

// Count the slides in the presentation.
public static int CountSlides(PresentationDocument presentationDocument)
{
    // Check for a null document object.
    if (presentationDocument == 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 != null)
    {
         slidesCount = presentationPart.SlideParts.Count();
     }

    // Return the slide count to the previous method.
    return slidesCount;
}
//
// Get the presentation object and pass it to the next DeleteSlide method.
public static void DeleteSlide(string presentationFile, int slideIndex)
{
    // Open the source document as read/write.

    using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))
    {
      // Pass the source document and the index of the slide to be deleted to the next DeleteSlide method.
      DeleteSlide(presentationDocument, slideIndex);
    }
}  

// Delete the specified slide from the presentation.
public static void DeleteSlide(PresentationDocument presentationDocument, int slideIndex)
{
    if (presentationDocument == null)
    {
        throw new ArgumentNullException("presentationDocument");
    }

    // Use the CountSlides sample to get the number of slides in the presentation.
    int slidesCount = CountSlides(presentationDocument);

    if (slideIndex < 0 || slideIndex >= slidesCount)
    {
        throw new ArgumentOutOfRangeException("slideIndex");
    }

    // Get the presentation part from the presentation document. 
    PresentationPart presentationPart = presentationDocument.PresentationPart;

    // Get the presentation from the presentation part.
    Presentation presentation = presentationPart.Presentation;

    // Get the list of slide IDs in the presentation.
    SlideIdList slideIdList = presentation.SlideIdList;

    // Get the slide ID of the specified slide
    SlideId slideId = slideIdList.ChildElements[slideIndex] as SlideId;

    // Get the relationship ID of the slide.
    string slideRelId = slideId.RelationshipId;

    // Remove the slide from the slide list.
    slideIdList.RemoveChild(slideId);

//
    // Remove references to the slide from all custom shows.
    if (presentation.CustomShowList != null)
    {
        // Iterate through the list of custom shows.
        foreach (var customShow in presentation.CustomShowList.Elements<CustomShow>())
        {
            if (customShow.SlideList != null)
            {
                // Declare a link list of slide list entries.
                LinkedList<SlideListEntry> slideListEntries = new LinkedList<SlideListEntry>();
                foreach (SlideListEntry slideListEntry in customShow.SlideList.Elements())
                {
                    // Find the slide reference to remove from the custom show.
                    if (slideListEntry.Id != null && slideListEntry.Id == slideRelId)
                    {
                        slideListEntries.AddLast(slideListEntry);
                    }
                }

                // Remove all references to the slide from the custom show.
                foreach (SlideListEntry slideListEntry in slideListEntries)
                {
                    customShow.SlideList.RemoveChild(slideListEntry);
                }
            }
        }
    }

    // Save the modified presentation.
    presentation.Save();

    // Get the slide part for the specified slide.
    SlidePart slidePart = presentationPart.GetPartById(slideRelId) as SlidePart;

    // Remove the slide part.
    presentationPart.DeletePart(slidePart);
}
' Count the number of slides in the presentation.
Public Function CountSlides(ByVal presentationFile As String) As Integer
    ' Open the presentation as read-only.
    Using presentationDocument__1 As PresentationDocument = PresentationDocument.Open(presentationFile, False)
        ' Pass the presentation to the next CountSlides method
        ' and return the slide count.
        Return CountSlides(presentationDocument__1)
    End Using
End Function
' Count the slides in the presentation.
Public Function CountSlides(ByVal presentationDocument As PresentationDocument) As Integer
    ' Check for a null document object.
    If presentationDocument Is Nothing Then
        Throw New ArgumentNullException("presentationDocument")
    End If

    Dim slidesCount As Integer = 0

    ' Get the presentation part of document.
    Dim presentationPart As PresentationPart = presentationDocument.PresentationPart

    If presentationPart IsNot Nothing AndAlso presentationPart.Presentation IsNot Nothing Then
        ' Get the Presentation object from the presentation part.
        Dim presentation As Presentation = presentationPart.Presentation

        ' Verify that the presentation contains slides. 
        If presentation.SlideIdList IsNot Nothing Then

            ' Get the slide count from the slide ID list. 
            slidesCount = presentation.SlideIdList.Elements(Of SlideId)().Count()
        End If
    End If

    ' Return the slide count to the previous method.
    Return slidesCount
End Function
' Delete the specified slide from the presentation.
Public Sub DeleteSlide(ByVal presentationFile As String, ByVal slideIndex As Integer)

    ' Open the source document as read/write.
    Dim presentationDocument As PresentationDocument = presentationDocument.Open(presentationFile, True)

    Using (presentationDocument)

        ' Pass the source document and the index of the slide to be deleted to the next DeleteSlide method.
        DeleteSlide2(presentationDocument, slideIndex)

    End Using

End Sub
' Delete the specified slide in the presentation.
Public Sub DeleteSlide2(ByVal presentationDocument As PresentationDocument, ByVal slideIndex As Integer)
    If (presentationDocument Is Nothing) Then
        Throw New ArgumentNullException("presentationDocument")
    End If

    ' Use the CountSlides code example to get the number of slides in the presentation.
    Dim slidesCount As Integer = CountSlides(presentationDocument)
    If ((slideIndex < 0) OrElse (slideIndex >= slidesCount)) Then
        Throw New ArgumentOutOfRangeException("slideIndex")
    End If

    ' Get the presentation part from the presentation document.
    Dim presentationPart As PresentationPart = presentationDocument.PresentationPart

    ' Get the presentation from the presentation part. 
    Dim presentation As Presentation = presentationPart.Presentation

    ' Get the list of slide IDs in the presentation.
    Dim slideIdList As SlideIdList = presentation.SlideIdList

    ' Get the slide ID of the specified slide.
    Dim slideId As SlideId = CType(slideIdList.ChildElements(slideIndex), SlideId)

    ' Get the relationship ID of the specified slide.
    Dim slideRelId As String = slideId.RelationshipId

    ' Remove the slide from the slide list.
    slideIdList.RemoveChild(slideId)
    ' Remove references to the slide from all custom shows.
    If (Not (presentation.CustomShowList) Is Nothing) Then

        ' Iterate through the list of custom shows.
        For Each customShow As System.Object In presentation.CustomShowList.Elements(Of  _
                               DocumentFormat.OpenXml.Presentation.CustomShow)()

            If (Not (customShow.SlideList) Is Nothing) Then

                ' Declare a linked list.
                Dim slideListEntries As LinkedList(Of SlideListEntry) = New LinkedList(Of SlideListEntry)

                ' Iterate through all the slides in the custom show.
                For Each slideListEntry As SlideListEntry In customShow.SlideList.Elements

                    ' Find the slide reference to be removed from the custom show.
                    If ((Not (slideListEntry.Id) Is Nothing) _
                                AndAlso (slideListEntry.Id = slideRelId)) Then

                        ' Add that slide reference to the end of the linked list.
                        slideListEntries.AddLast(slideListEntry)
                    End If
                Next

                ' Remove references to the slide from the custom show.
                For Each slideListEntry As SlideListEntry In slideListEntries
                    customShow.SlideList.RemoveChild(slideListEntry)
                Next
            End If
        Next
    End If

    ' Save the change to the presentation part.
    presentation.Save()

    ' Get the slide part for the specified slide.
    Dim slidePart As SlidePart = CType(presentationPart.GetPartById(slideRelId), SlidePart)

    ' Remove the slide part.
    presentationPart.DeletePart(slidePart)

End Sub
Mostrar:
© 2015 Microsoft