Trabajar con diapositivas de notas
En este tema se describe la clase Open XML SDK for Office NotesSlide y cómo se relaciona con el esquema PresentationML de formato de archivo Open XML.
Diapositivas de notas en PresentationML
La especificación ISO/IEC 29500 describe al elemento de PresentationML de Office Open XML <notes/>
, que se usa para representar diapositivas de notas en un documento PresentationML de la siguiente manera:
Este elemento especifica la existencia de una diapositiva de notas junto con sus datos correspondientes. Dentro de una diapositiva de notas se encuentran todos los elementos de diapositivas comunes, junto con otras propiedades que son específicas del elemento de notas.
Ejemplo: tenga en cuenta la siguiente diapositiva de notas presentationML:
<p:notes>
<p:cSld>
…
</p:cSld>
…
</p:notes>
En el ejemplo anterior, un elemento de notas especifica la existencia de una diapositiva de notas con todas sus partes. Tenga en cuenta el elemento cSld, que especifica los elementos comunes que pueden aparecer en cualquier tipo de diapositiva y, también, todos los elementos que especifican otras propiedades que no son comunes para esta diapositiva de notas.
© ISO/IEC 29500: 2016
El atributo <notes/>
es el elemento raíz del elemento NotesSlide de PresentationML. Para obtener más información acerca de la estructura global de los elementos que conforman un documento PresentationML, vea Estructura de un documento PresentationML.
En la tabla siguiente se enumeran los elementos secundarios del <notes/>
elemento que se usan al trabajar con diapositivas de notas y las clases del SDK de Open XML que se corresponden con ellas.
Elemento de PresentationML | Open XML SDK (clase) |
---|---|
<clrMapOvr/> |
ColorMapOverride |
<cSld/> |
CommonSlideData |
<extLst/> |
ExtensionListWithModification |
La siguiente tabla de la especificación ISO/IEC 29500 describe los atributos del elemento <notes/>
.
Atributos | Descripción |
---|---|
showMasterPhAnim (Mostrar animaciones de marcador de posición maestro) |
Especifica si se deben mostrar o no animaciones en los marcadores de posición de la diapositiva patrón. Los valores posibles para este atributo se definen mediante el tipo de datos de esquema boolean XML W3C. |
showMasterSp (Mostrar formas maestras) |
Especifica si se deben mostrar o no formas en la diapositiva patrón. Los valores posibles para este atributo se definen mediante el tipo de datos de esquema boolean XML W3C. |
© ISO/IEC 29500: 2016
Notas del SDK de Open XMLSlide (clase)
La clase DEL SDK NotesSlide
de OXML representa el <notes/>
elemento definido en el esquema de formato de archivo Open XML para documentos PresentationML. Use la NotesSlide
clase para manipular elementos individuales <notes/>
en un documento PresentationML.
Las clases que representan elementos secundarios del <notes/>
elemento y que, por lo tanto, se asocian normalmente a la NotesSlide
clase se muestran en la lista siguiente.
Clase ColorMapOverride
La
ColorMapOverride
clase corresponde al<clrMapOvr/>
elemento . La siguiente información de la especificación ISO/IEC 29500 presenta el<clrMapOvr/>
elemento :Este elemento proporciona un mecanismo con el cual se pueden invalidar las combinaciones de colores que se enumeran en el elemento
<ClrMap/>
. Si está presente el elemento secundario<masterClrMapping/>
, se usa la combinación de colores que definió el patrón. Si está presente el elemento secundario<overrideClrMapping/>
, define una nueva combinación de colores específica de la diapositiva de notas, diapositiva de presentaciones o diseño de la diapositiva primarios.
© ISO/IEC 29500: 2016
Clase CommonSlideData
La
CommonSlideData
clase corresponde al<cSld/>
elemento . La siguiente información de la especificación ISO/IEC 29500 presenta el<cSld/>
elemento :Este elemento especifica un contenedor para el tipo de información sobre diapositivas que es pertinente a todos los tipos de diapositiva. Todas las diapositivas comparten un conjunto de propiedades común, que es independiente del tipo de diapositiva; la descripción de estas propiedades para una diapositiva específica se almacena en el contenedor
<cSld/>
de la diapositiva. Los datos de la diapositiva específicos del tipo de diapositiva, que indica el elemento primario, se almacenan en otro lugar.Los datos reales de
<cSld/>
describen solo la diapositiva primaria determinada; solo el tipo de información almacenada es común a todas las diapositivas.© ISO/IEC 29500: 2016
Clase ExtensionListWithModification
La
ExtensionListWithModification
clase corresponde al<extLst/>
elemento . La siguiente información de la especificación ISO/IEC 29500 presenta el<extLst/>
elemento :Este elemento especifica la lista de extensiones con capacidad de modificación, en la cual se definen todas las futuras extensiones del tipo de elemento
<ext/>
. La lista de extensiones, junto con las extensiones futuras correspondientes, se usa para ampliar la capacidad de almacenamiento del marco PresentationML. Esto permite que se almacenen en el marco diversos tipos de datos nuevos de forma nativa.[Nota: el uso de este elemento extLst permite que la aplicación que lo genera almacene si se ha modificado la propiedad Extension. Fin de la nota]
© ISO/IEC 29500: 2016
Trabajar con la clase NotesSlide
Como se muestra en el ejemplo de código del SDK de Open XML que sigue, cada instancia de la NotesSlide
clase está asociada a una instancia de la NotesSlidePart clase , que representa una parte de la diapositiva de notas, una de las partes de un paquete de archivo de presentación PresentationML y una parte necesaria para cada diapositiva de notas de un archivo de presentación. Cada NotesSlide
instancia de clase también puede estar asociada a una instancia de la NotesMaster clase , que a su vez está asociada a una parte de presentación con nombre similar, representada por la NotesMasterPart clase .
Por NotesSlide
lo tanto, la clase , que representa el <notes/>
elemento , también está asociada a una serie de otras clases que representan los elementos secundarios del <notes/>
elemento .
Entre estas clases, como se muestra en el ejemplo de código siguiente, se encuentran la CommonSlideData
clase y la ColorMapOverride
clase . A ShapeTree su vez, la clase y las Shape clases están asociadas a la CommonSlideData
clase .
Ejemplo de código de Open XML SDK 2.0
En los siguientes fragmentos
P
de código representa el espacio de nombres yD
representa el espacio de nombres.
En el fragmento de código siguiente, se abre una presentación con Presentation.Open
y la primera SlidePart se recupera o se agrega si la presentación aún no tiene .SlidePart
using (PresentationDocument presentationDocument = PresentationDocument.Open(pptxPath, true) ?? throw new Exception("Presentation Document does not exist"))
{
// Get the first slide in the presentation or use the InsertNewSlide.InsertNewSlideIntoPresentation helper method to insert a new slide.
SlidePart slidePart = presentationDocument.PresentationPart?.SlideParts.FirstOrDefault() ?? InsertNewSlideNS.InsertNewSlide(presentationDocument, 1, "my new slide");
// Add a new NoteSlidePart if one does not already exist
NotesSlidePart notesSlidePart = slidePart.NotesSlidePart ?? slidePart.AddNewPart<NotesSlidePart>();
En este fragmento de código, se agrega a NoteSlide
NoteSlidePart
si aún no existe uno.
El NotesSlide
constructor de clase crea instancias de la CommonSlideData
clase .
El CommonSlideData
constructor de clase crea una instancia de la ShapeTree clase , cuyo constructor a su vez crea instancias de clase adicionales: una instancia de la NonVisualGroupShapeProperties clase, una instancia de la GroupShapeProperties clase y una instancia de la Shape clase .
// Add a NoteSlide to the NoteSlidePart if one does not already exist.
notesSlidePart.NotesSlide ??= new P.NotesSlide(
new P.CommonSlideData(
new P.ShapeTree(
new P.NonVisualGroupShapeProperties(
new P.NonVisualDrawingProperties() { Id = 1, Name = "" },
new P.NonVisualGroupShapeDrawingProperties(),
new P.ApplicationNonVisualDrawingProperties()),
new P.GroupShapeProperties(
new D.Transform2D(
new D.Offset() { X = 0, Y = 0 },
new D.Extents() { Cx = 0, Cy = 0 },
new D.ChildOffset() { X = 0, Y = 0 },
new D.ChildExtents() { Cx = 0, Cy = 0 })),
El Shape
constructor crea una instancia de NonVisualShapeProperties, ShapePropertiesy TextBody clases junto con sus elementos secundarios necesarios.
TextBody
contiene , Paragraphque tiene , Runque contiene el texto de la nota. A continuación, la parte de diapositiva se agrega a la parte de la diapositiva de notas.
new P.Shape(
new P.NonVisualShapeProperties(
new P.NonVisualDrawingProperties() { Id = 3, Name = "test Placeholder 3" },
new P.NonVisualShapeDrawingProperties(),
new P.ApplicationNonVisualDrawingProperties(
new P.PlaceholderShape() { Type = PlaceholderValues.Body, Index = 1 })),
new P.ShapeProperties(),
new P.TextBody(
new D.BodyProperties(),
new D.Paragraph(
new D.Run(
new D.Text("This is a test note!"))))))));
notesSlidePart.AddPart(slidePart);
La parte de diapositiva de notas creada con el código anterior contiene el siguiente XML.
<?xml version="1.0" encoding="utf-8"?>
<p:notes xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main">
<p:cSld>
<p:spTree>
<p:nvGrpSpPr>
<p:cNvPr id="1" name=""/>
<p:cNvGrpSpPr/>
<p:nvPr/>
</p:nvGrpSpPr>
<p:grpSpPr>
<a:xfrm xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
<a:off x="0" y="0"/>
<a:ext cx="0" cy="0"/>
<a:chOff x="0" y="0"/>
<a:chExt cx="0" cy="0"/>
</a:xfrm>
</p:grpSpPr>
<p:sp>
<p:nvSpPr>
<p:cNvPr id="3" name="test Placeholder 3"/>
<p:cNvSpPr/>
<p:nvPr/>
</p:nvSpPr>
<p:spPr/>
<p:txBody>
<a:bodyPr xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"/>
<a:p xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
<a:r>
<a:t>This is a test note!</a:t>
</a:r>
</a:p>
</p:txBody>
</p:sp>
</p:spTree>
</p:cSld>
</p:notes>
En los fragmentos de código siguientes se agrega el valor requerido NotesMasterPart y ThemePart si faltan.
// Add the required NotesMasterPart if it is missing
NotesMasterPart notesMasterPart = notesSlidePart.NotesMasterPart ?? notesSlidePart.AddNewPart<NotesMasterPart>();
// Add a NotesMaster to the NotesMasterPart if not present
notesMasterPart.NotesMaster ??= new NotesMaster(
new P.CommonSlideData(
new P.ShapeTree(
new P.NonVisualGroupShapeProperties(
new P.NonVisualDrawingProperties() { Id = 1, Name = "New Placeholder" },
new P.NonVisualGroupShapeDrawingProperties(),
new P.ApplicationNonVisualDrawingProperties()),
new P.GroupShapeProperties())),
new P.ColorMap()
{
Background1 = D.ColorSchemeIndexValues.Light1,
Background2 = D.ColorSchemeIndexValues.Light2,
Text1 = D.ColorSchemeIndexValues.Dark1,
Text2 = D.ColorSchemeIndexValues.Dark2,
Accent1 = D.ColorSchemeIndexValues.Accent1,
Accent2 = D.ColorSchemeIndexValues.Accent2,
Accent3 = D.ColorSchemeIndexValues.Accent3,
Accent4 = D.ColorSchemeIndexValues.Accent4,
Accent5 = D.ColorSchemeIndexValues.Accent5,
Accent6 = D.ColorSchemeIndexValues.Accent6,
Hyperlink = D.ColorSchemeIndexValues.Hyperlink,
FollowedHyperlink = D.ColorSchemeIndexValues.FollowedHyperlink,
});
// Add a new ThemePart for the NotesMasterPart
ThemePart themePart = notesMasterPart.ThemePart ?? notesMasterPart.AddNewPart<ThemePart>();
// Add the Theme if it is missing
themePart.Theme ??= new Theme(
new ThemeElements(
new ColorScheme(
new Dark1Color(
new SystemColor() { Val = SystemColorValues.WindowText }),
new Light1Color(
new SystemColor() { Val = SystemColorValues.Window }),
new Dark2Color(
new RgbColorModelHex() { Val = "f1d7be" }),
new Light2Color(
new RgbColorModelHex() { Val = "171717" }),
new Accent1Color(
new RgbColorModelHex() { Val = "ea9f7d" }),
new Accent2Color(
new RgbColorModelHex() { Val = "168ecd" }),
new Accent3Color(
new RgbColorModelHex() { Val = "e694db" }),
new Accent4Color(
new RgbColorModelHex() { Val = "f0612a" }),
new Accent5Color(
new RgbColorModelHex() { Val = "5fd46c" }),
new Accent6Color(
new RgbColorModelHex() { Val = "b158d1" }),
new D.Hyperlink(
new RgbColorModelHex() { Val = "699f82" }),
new FollowedHyperlinkColor(
new RgbColorModelHex() { Val = "699f82" }))
{ Name = "Office2" },
new D.FontScheme(
new MajorFont(
new LatinFont(),
new EastAsianFont(),
new ComplexScriptFont()),
new MinorFont(
new LatinFont(),
new EastAsianFont(),
new ComplexScriptFont()))
{ Name = "Office2" },
new FormatScheme(
new FillStyleList(
new NoFill(),
new SolidFill(),
new D.GradientFill(),
new D.BlipFill(),
new D.PatternFill(),
new GroupFill()),
new LineStyleList(
new D.Outline(),
new D.Outline(),
new D.Outline()),
new EffectStyleList(
new EffectStyle(
new EffectList()),
new EffectStyle(
new EffectList()),
new EffectStyle(
new EffectList())),
new BackgroundFillStyleList(
new NoFill(),
new SolidFill(),
new D.GradientFill(),
new D.BlipFill(),
new D.PatternFill(),
new GroupFill()))
{ Name = "Office2" }),
new ObjectDefaults(),
new ExtraColorSchemeList());
Código de ejemplo
El siguiente es el ejemplo de código completo en C# y Visual Basic.
using (PresentationDocument presentationDocument = PresentationDocument.Open(pptxPath, true) ?? throw new Exception("Presentation Document does not exist"))
{
// Get the first slide in the presentation or use the InsertNewSlide.InsertNewSlideIntoPresentation helper method to insert a new slide.
SlidePart slidePart = presentationDocument.PresentationPart?.SlideParts.FirstOrDefault() ?? InsertNewSlideNS.InsertNewSlide(presentationDocument, 1, "my new slide");
// Add a new NoteSlidePart if one does not already exist
NotesSlidePart notesSlidePart = slidePart.NotesSlidePart ?? slidePart.AddNewPart<NotesSlidePart>();
// Add a NoteSlide to the NoteSlidePart if one does not already exist.
notesSlidePart.NotesSlide ??= new P.NotesSlide(
new P.CommonSlideData(
new P.ShapeTree(
new P.NonVisualGroupShapeProperties(
new P.NonVisualDrawingProperties() { Id = 1, Name = "" },
new P.NonVisualGroupShapeDrawingProperties(),
new P.ApplicationNonVisualDrawingProperties()),
new P.GroupShapeProperties(
new D.Transform2D(
new D.Offset() { X = 0, Y = 0 },
new D.Extents() { Cx = 0, Cy = 0 },
new D.ChildOffset() { X = 0, Y = 0 },
new D.ChildExtents() { Cx = 0, Cy = 0 })),
new P.Shape(
new P.NonVisualShapeProperties(
new P.NonVisualDrawingProperties() { Id = 3, Name = "test Placeholder 3" },
new P.NonVisualShapeDrawingProperties(),
new P.ApplicationNonVisualDrawingProperties(
new P.PlaceholderShape() { Type = PlaceholderValues.Body, Index = 1 })),
new P.ShapeProperties(),
new P.TextBody(
new D.BodyProperties(),
new D.Paragraph(
new D.Run(
new D.Text("This is a test note!"))))))));
notesSlidePart.AddPart(slidePart);
// Add the required NotesMasterPart if it is missing
NotesMasterPart notesMasterPart = notesSlidePart.NotesMasterPart ?? notesSlidePart.AddNewPart<NotesMasterPart>();
// Add a NotesMaster to the NotesMasterPart if not present
notesMasterPart.NotesMaster ??= new NotesMaster(
new P.CommonSlideData(
new P.ShapeTree(
new P.NonVisualGroupShapeProperties(
new P.NonVisualDrawingProperties() { Id = 1, Name = "New Placeholder" },
new P.NonVisualGroupShapeDrawingProperties(),
new P.ApplicationNonVisualDrawingProperties()),
new P.GroupShapeProperties())),
new P.ColorMap()
{
Background1 = D.ColorSchemeIndexValues.Light1,
Background2 = D.ColorSchemeIndexValues.Light2,
Text1 = D.ColorSchemeIndexValues.Dark1,
Text2 = D.ColorSchemeIndexValues.Dark2,
Accent1 = D.ColorSchemeIndexValues.Accent1,
Accent2 = D.ColorSchemeIndexValues.Accent2,
Accent3 = D.ColorSchemeIndexValues.Accent3,
Accent4 = D.ColorSchemeIndexValues.Accent4,
Accent5 = D.ColorSchemeIndexValues.Accent5,
Accent6 = D.ColorSchemeIndexValues.Accent6,
Hyperlink = D.ColorSchemeIndexValues.Hyperlink,
FollowedHyperlink = D.ColorSchemeIndexValues.FollowedHyperlink,
});
// Add a new ThemePart for the NotesMasterPart
ThemePart themePart = notesMasterPart.ThemePart ?? notesMasterPart.AddNewPart<ThemePart>();
// Add the Theme if it is missing
themePart.Theme ??= new Theme(
new ThemeElements(
new ColorScheme(
new Dark1Color(
new SystemColor() { Val = SystemColorValues.WindowText }),
new Light1Color(
new SystemColor() { Val = SystemColorValues.Window }),
new Dark2Color(
new RgbColorModelHex() { Val = "f1d7be" }),
new Light2Color(
new RgbColorModelHex() { Val = "171717" }),
new Accent1Color(
new RgbColorModelHex() { Val = "ea9f7d" }),
new Accent2Color(
new RgbColorModelHex() { Val = "168ecd" }),
new Accent3Color(
new RgbColorModelHex() { Val = "e694db" }),
new Accent4Color(
new RgbColorModelHex() { Val = "f0612a" }),
new Accent5Color(
new RgbColorModelHex() { Val = "5fd46c" }),
new Accent6Color(
new RgbColorModelHex() { Val = "b158d1" }),
new D.Hyperlink(
new RgbColorModelHex() { Val = "699f82" }),
new FollowedHyperlinkColor(
new RgbColorModelHex() { Val = "699f82" }))
{ Name = "Office2" },
new D.FontScheme(
new MajorFont(
new LatinFont(),
new EastAsianFont(),
new ComplexScriptFont()),
new MinorFont(
new LatinFont(),
new EastAsianFont(),
new ComplexScriptFont()))
{ Name = "Office2" },
new FormatScheme(
new FillStyleList(
new NoFill(),
new SolidFill(),
new D.GradientFill(),
new D.BlipFill(),
new D.PatternFill(),
new GroupFill()),
new LineStyleList(
new D.Outline(),
new D.Outline(),
new D.Outline()),
new EffectStyleList(
new EffectStyle(
new EffectList()),
new EffectStyle(
new EffectList()),
new EffectStyle(
new EffectList())),
new BackgroundFillStyleList(
new NoFill(),
new SolidFill(),
new D.GradientFill(),
new D.BlipFill(),
new D.PatternFill(),
new GroupFill()))
{ Name = "Office2" }),
new ObjectDefaults(),
new ExtraColorSchemeList());
}
Recursos adicionales
Acerca del SDK de Open XML para Office
Procedimiento para crear un documento de presentación proporcionando un nombre de archivo
Procedimiento para insertar una nueva diapositiva en una presentación
Procedimiento para eliminar una diapositiva de una presentación