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 insertar una nueva diapositiva en una presentación (SDK de Open XML)

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

Última modificación: viernes, 27 de julio de 2012

Hace referencia a: Office 2013 | Open XML

En este artículo
Obtención de un objeto PresentationDocument
Estructura básica de un documento de presentación
Funcionamiento del código de ejemplo
Código de ejemplo

En este tema se muestra cómo usar las clases de SDK de Open XML 2.5 para insertar mediante programación una nueva diapositiva en una presentación.

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

using System;
using DocumentFormat.OpenXml.Presentation;
using DocumentFormat.OpenXml.Packaging;
using Drawing = DocumentFormat.OpenXml.Drawing;

En Open XML SDK, la clase PresentationDocument representa un paquete de documentos de presentación. Para trabajar con un documento de presentación, debe crear primero una instancia de la clase PresentationDocument y, a continuación, trabajar con esa instancia. Para crear la instancia de clase a partir del documento, llame al método Open(String, Boolean) que usa una ruta de acceso del archivo y, como segundo parámetro, un valor booleano para especificar si un documento puede modificarse. Para abrir un documento en modo de lectura y escritura, especifique el valor true para este parámetro, como se muestra en la siguiente instrucción using. En este segmento de código, el parámetro presentationFile es una cadena que representa la ruta de acceso completa del archivo a partir del cual desea abrir el documento.

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

La instrucción using proporciona una alternativa recomendada a la típica secuencia .Open, .Save, .Close. Garantiza 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 denotadas por los identificadores 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 InsertNewSlide. El primer método sobrecargado toma tres parámetros: la ruta de acceso completa del archivo de presentación al cual se debe agregar una diapositiva, un número entero que representa la posición del índice de la diapositiva con base cero en la presentación donde se debe agregar la diapositiva y la cadena que representa el título de la nueva diapositiva. Abre el archivo de presentación para lectura y escritura, obtiene un objeto PresentationDocument y, a continuación, pasa ese objeto al segundo método sobrecargado InsertNewSlide, que realiza la inserción.

// Insert a slide into the specified presentation.
 public static void InsertNewSlide(string presentationFile, int position, string slideTitle)
{
    // Open the source document as read/write. 
    using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))
    {
        // Pass the source document and the position and title of the slide to be inserted to the next method.
        InsertNewSlide(presentationDocument, position, slideTitle);
    }
}

El segundo método InsertNewSlide sobrecargado crea un nuevo objeto Slide, establece sus propiedades y lo inserta en el orden de las diapositivas de la presentación. La primera sección del método crea la diapositiva y establece sus propiedades.

// Insert the specified slide into the presentation at the specified position.
public static void InsertNewSlide(PresentationDocument presentationDocument, int position, string slideTitle)
{
    if (presentationDocument == null)
    {
        throw new ArgumentNullException("presentationDocument");
    }

    if (slideTitle == null)
    {
        throw new ArgumentNullException("slideTitle");
    }

    PresentationPart presentationPart = presentationDocument.PresentationPart;

    // Verify that the presentation is not empty.
    if (presentationPart == null)
    {
        throw new InvalidOperationException("The presentation document is empty.");
    }

    // Declare and instantiate a new slide.
    Slide slide = new Slide(new CommonSlideData(new ShapeTree()));
    uint drawingObjectId = 1;

    // Construct the slide content.            
    // Specify the non-visual properties of the new slide.
    NonVisualGroupShapeProperties nonVisualProperties = slide.CommonSlideData.ShapeTree.AppendChild(new NonVisualGroupShapeProperties());
    nonVisualProperties.NonVisualDrawingProperties = new NonVisualDrawingProperties() { Id = 1, Name = "" };
    nonVisualProperties.NonVisualGroupShapeDrawingProperties = new NonVisualGroupShapeDrawingProperties();
    nonVisualProperties.ApplicationNonVisualDrawingProperties = new ApplicationNonVisualDrawingProperties();

    // Specify the group shape properties of the new slide.
    slide.CommonSlideData.ShapeTree.AppendChild(new GroupShapeProperties());

La siguiente sección del segundo método InsertNewSlide sobrecargado agrega una forma de título a la diapositiva y configura sus propiedades, incluido el texto.

// Declare and instantiate the title shape of the new slide.
Shape titleShape = slide.CommonSlideData.ShapeTree.AppendChild(new Shape());

drawingObjectId++;

// Specify the required shape properties for the title shape. 
titleShape.NonVisualShapeProperties = new NonVisualShapeProperties
    (new NonVisualDrawingProperties() { Id = drawingObjectId, Name = "Title" },
    new NonVisualShapeDrawingProperties(new Drawing.ShapeLocks() { NoGrouping = true }),
    new ApplicationNonVisualDrawingProperties(new PlaceholderShape() { Type = PlaceholderValues.Title }));
titleShape.ShapeProperties = new ShapeProperties();

// Specify the text of the title shape.
titleShape.TextBody = new TextBody(new Drawing.BodyProperties(),
        new Drawing.ListStyle(),
        new Drawing.Paragraph(new Drawing.Run(new Drawing.Text() { Text = slideTitle })));

La siguiente sección del segundo método InsertNewSlide sobrecargado agrega una forma de cuerpo a la diapositiva y configura sus propiedades, incluido el texto.

// Declare and instantiate the body shape of the new slide.
Shape bodyShape = slide.CommonSlideData.ShapeTree.AppendChild(new Shape());
drawingObjectId++;

// Specify the required shape properties for the body shape.
bodyShape.NonVisualShapeProperties = new NonVisualShapeProperties(
        new NonVisualDrawingProperties() { Id = drawingObjectId, Name = "Content Placeholder" },
        new NonVisualShapeDrawingProperties(new Drawing.ShapeLocks() { NoGrouping = true }),
        new ApplicationNonVisualDrawingProperties(new PlaceholderShape() { Index = 1 }));
bodyShape.ShapeProperties = new ShapeProperties();

// Specify the text of the body shape.
bodyShape.TextBody = new TextBody(new Drawing.BodyProperties(),
        new Drawing.ListStyle(),
        new Drawing.Paragraph());

La sección final del segundo método InsertNewSlide sobrecargado crea una parte de nueva diapositiva, busca la posición del índice especificada donde se debe insertar la diapositiva, la inserta y guarda la presentación modificada.

// Create the slide part for the new slide.
SlidePart slidePart = presentationPart.AddNewPart<SlidePart>();

// Save the new slide part.
slide.Save(slidePart);

// Modify the slide ID list in the presentation part.
// The slide ID list should not be null.
SlideIdList slideIdList = presentationPart.Presentation.SlideIdList;

// Find the highest slide ID in the current list.
uint maxSlideId = 1;
SlideId prevSlideId = null;

foreach (SlideId slideId in slideIdList.ChildElements)
{
    if (slideId.Id > maxSlideId)
    {
        maxSlideId = slideId.Id;
    }

position--;
if (position == 0)
{
    prevSlideId = slideId;
}

}

maxSlideId++;

// Get the ID of the previous slide.
SlidePart lastSlidePart;

if (prevSlideId != null)
{
    lastSlidePart = (SlidePart)presentationPart.GetPartById(prevSlideId.RelationshipId);
}
else
{
    lastSlidePart = (SlidePart)presentationPart.GetPartById(((SlideId)(slideIdList.ChildElements[0])).RelationshipId);
}

// Use the same slide layout as that of the previous slide.
if (null != lastSlidePart.SlideLayoutPart)
{
    slidePart.AddPart(lastSlidePart.SlideLayoutPart);
}

// Insert the new slide into the slide list after the previous slide.
SlideId newSlideId = slideIdList.InsertAfter(new SlideId(), prevSlideId);
newSlideId.Id = maxSlideId;
newSlideId.RelationshipId = presentationPart.GetIdOfPart(slidePart);

// Save the modified presentation.
presentationPart.Presentation.Save();
}

Mediante el código de ejemplo puede agregar una nueva diapositiva a una presentación existente. En el programa, puede usar la siguiente llamada al método InsertNewSlide para agregar una nueva diapositiva a un archivo de presentación denominado "Myppt10.pptx", con el título "My new slide", en la posición 1.

InsertNewSlide(@"C:\Users\Public\Documents\Myppt10.pptx", 1, "My new slide");

Una vez ejecutado el programa, la nueva diapositiva se mostrará como la segunda diapositiva de la presentación.

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

// Insert a slide into the specified presentation.
public static void InsertNewSlide(string presentationFile, int position, string slideTitle)
{
    // Open the source document as read/write. 
    using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))
    {
        // Pass the source document and the position and title of the slide to be inserted to the next method.
        InsertNewSlide(presentationDocument, position, slideTitle);
    }
}

// Insert the specified slide into the presentation at the specified position.
public static void InsertNewSlide(PresentationDocument presentationDocument, int position, string slideTitle)
{

    if (presentationDocument == null)
    {
        throw new ArgumentNullException("presentationDocument");
    }

    if (slideTitle == null)
    {
        throw new ArgumentNullException("slideTitle");
    }

    PresentationPart presentationPart = presentationDocument.PresentationPart;

    // Verify that the presentation is not empty.
    if (presentationPart == null)
    {
        throw new InvalidOperationException("The presentation document is empty.");
    }

    // Declare and instantiate a new slide.
    Slide slide = new Slide(new CommonSlideData(new ShapeTree()));
    uint drawingObjectId = 1;

    // Construct the slide content.            
    // Specify the non-visual properties of the new slide.
    NonVisualGroupShapeProperties nonVisualProperties = slide.CommonSlideData.ShapeTree.AppendChild(new NonVisualGroupShapeProperties());
    nonVisualProperties.NonVisualDrawingProperties = new NonVisualDrawingProperties() { Id = 1, Name = "" };
    nonVisualProperties.NonVisualGroupShapeDrawingProperties = new NonVisualGroupShapeDrawingProperties();
    nonVisualProperties.ApplicationNonVisualDrawingProperties = new ApplicationNonVisualDrawingProperties();

    // Specify the group shape properties of the new slide.
    slide.CommonSlideData.ShapeTree.AppendChild(new GroupShapeProperties());

    // Declare and instantiate the title shape of the new slide.
    Shape titleShape = slide.CommonSlideData.ShapeTree.AppendChild(new Shape());

    drawingObjectId++;

    // Specify the required shape properties for the title shape. 
    titleShape.NonVisualShapeProperties = new NonVisualShapeProperties
        (new NonVisualDrawingProperties() { Id = drawingObjectId, Name = "Title" },
        new NonVisualShapeDrawingProperties(new Drawing.ShapeLocks() { NoGrouping = true }),
        new ApplicationNonVisualDrawingProperties(new PlaceholderShape() { Type = PlaceholderValues.Title }));
    titleShape.ShapeProperties = new ShapeProperties();

    // Specify the text of the title shape.
    titleShape.TextBody = new TextBody(new Drawing.BodyProperties(),
            new Drawing.ListStyle(),
            new Drawing.Paragraph(new Drawing.Run(new Drawing.Text() { Text = slideTitle })));

    // Declare and instantiate the body shape of the new slide.
    Shape bodyShape = slide.CommonSlideData.ShapeTree.AppendChild(new Shape());
    drawingObjectId++;

    // Specify the required shape properties for the body shape.
    bodyShape.NonVisualShapeProperties = new NonVisualShapeProperties(new NonVisualDrawingProperties() { Id = drawingObjectId, Name = "Content Placeholder" },
            new NonVisualShapeDrawingProperties(new Drawing.ShapeLocks() { NoGrouping = true }),
            new ApplicationNonVisualDrawingProperties(new PlaceholderShape() { Index = 1 }));
    bodyShape.ShapeProperties = new ShapeProperties();

    // Specify the text of the body shape.
    bodyShape.TextBody = new TextBody(new Drawing.BodyProperties(),
            new Drawing.ListStyle(),
            new Drawing.Paragraph());

    // Create the slide part for the new slide.
    SlidePart slidePart = presentationPart.AddNewPart<SlidePart>();

    // Save the new slide part.
    slide.Save(slidePart);

    // Modify the slide ID list in the presentation part.
    // The slide ID list should not be null.
    SlideIdList slideIdList = presentationPart.Presentation.SlideIdList;

    // Find the highest slide ID in the current list.
    uint maxSlideId = 1;
    SlideId prevSlideId = null;

    foreach (SlideId slideId in slideIdList.ChildElements)
    {
        if (slideId.Id > maxSlideId)
        {
            maxSlideId = slideId.Id;
        }

    position--;
    if (position == 0)
    {
        prevSlideId = slideId;
    }

}

    maxSlideId++;

    // Get the ID of the previous slide.
    SlidePart lastSlidePart;

    if (prevSlideId != null)
    {
        lastSlidePart = (SlidePart)presentationPart.GetPartById(prevSlideId.RelationshipId);
    }
    else
    {
        lastSlidePart = (SlidePart)presentationPart.GetPartById(((SlideId)(slideIdList.ChildElements[0])).RelationshipId);
    }

    // Use the same slide layout as that of the previous slide.
    if (null != lastSlidePart.SlideLayoutPart)
    {
        slidePart.AddPart(lastSlidePart.SlideLayoutPart);
    }

    // Insert the new slide into the slide list after the previous slide.
    SlideId newSlideId = slideIdList.InsertAfter(new SlideId(), prevSlideId);
    newSlideId.Id = maxSlideId;
    newSlideId.RelationshipId = presentationPart.GetIdOfPart(slidePart);

    // Save the modified presentation.
    presentationPart.Presentation.Save();
}

Contribuir a este artículo

¿Desea editar o sugerir cambios para este contenido? Puede editar o enviar los cambios a este artículo con GitHub.

Mostrar:
© 2015 Microsoft