Compartilhar via


Como trabalhar com slides de anotações

Este tópico aborda a classe Open XML SDK for Office NotesSlide e como se relaciona com o esquema Open XML File Format PresentationML.


Diapositivos de Notas no PresentationML

A especificação ISO/IEC 29500 descreve o elemento Open XML PresentationML <notes/> utilizado para representar diapositivos de notas num documento PresentationML da seguinte forma:

Este elemento especifica a existência de um diapositivo de notas juntamente com os dados correspondentes. Contidos num diapositivo de notas estão todos os elementos comuns do diapositivo, juntamente com propriedades adicionais específicas do elemento notes.

Exemplo: Considere o seguinte diapositivo de notas PresentationML:

<p:notes>
    <p:cSld>
        …
    </p:cSld>
    …
</p:notes>

No exemplo acima, um elemento de notas especifica a existência de um diapositivo de notas com todas as partes. Repare no elemento cSld, que especifica os elementos comuns que podem aparecer em qualquer tipo de diapositivo e, em seguida, todos os elementos especificam propriedades adicionais não comuns para este diapositivo de notas.

© ISO/IEC 29500: 2016

O <notes/> elemento é o elemento raiz da parte Diapositivo de Notas de PresentationML. Para obter mais informações sobre a estrutura geral das partes e elementos que compõem um documento PresentationML, consulte Estrutura de um Documento PresentationML.

A tabela seguinte lista os elementos subordinados do <notes/> elemento utilizado ao trabalhar com diapositivos de notas e as classes open XML SDK que correspondem aos mesmos.

Elemento PresentationML Abrir Classe SDK XML
<clrMapOvr/> ColorMapOverride
<cSld/> CommonSlideData
<extLst/> ExtensionListWithModification

A tabela seguinte da especificação ISO/IEC 29500 descreve os atributos do <notes/> elemento.

Atributos Description
showMasterPhAnim (Mostrar Animações de Marcador de Posição Principal) Especifica se pretende ou não apresentar animações em marcadores de posição do diapositivo master.

Os valores possíveis para este atributo são definidos pelo tipo de dados Esquema boolean XML W3C.
showMasterSp (Mostrar Formas Mestre) Especifica se as formas no diapositivo master devem ou não ser apresentadas nos diapositivos.

Os valores possíveis para este atributo são definidos pelo tipo de dados Esquema boolean XML W3C.

© ISO/IEC 29500: 2016


Open XML SDK NotesSlide Class

A classe SDK NotesSlide OXML representa o <notes/> elemento definido no esquema Open XML File Format para documentos PresentationML. Utilize a NotesSlide classe para manipular elementos individuais <notes/> num documento PresentationML.

As classes que representam elementos subordinados do <notes/> elemento e que, por conseguinte, estão frequentemente associadas à NotesSlide classe são apresentadas na lista seguinte.

  • Classe ColorMapOverride

    A ColorMapOverride classe corresponde ao <clrMapOvr/> elemento . As seguintes informações da especificação ISO/IEC 29500 introduzem o <clrMapOvr/> elemento:

    Este elemento fornece um mecanismo para substituir os esquemas de cores listados no <ClrMap/> elemento . Se o <masterClrMapping/> elemento subordinado estiver presente, é utilizado o esquema de cores definido pelo master. Se o <overrideClrMapping/> elemento subordinado estiver presente, define um novo esquema de cores específico para o diapositivo de notas principais, diapositivo de apresentação ou esquema de diapositivo.

© ISO/IEC 29500: 2016

  • Classe CommonSlideData

    A CommonSlideData classe corresponde ao <cSld/> elemento . As seguintes informações da especificação ISO/IEC 29500 introduzem o <cSld/> elemento:

    Este elemento especifica um contentor para o tipo de informações de diapositivos relevantes para todos os tipos de diapositivos. Todos os diapositivos partilham um conjunto comum de propriedades independentes do tipo de diapositivo; a descrição destas propriedades para qualquer diapositivo específico é armazenada no contentor do <cSld/> diapositivo. Os dados de diapositivos específicos do tipo de diapositivo indicado pelo elemento principal são armazenados noutro local.

    Os dados reais no <cSld/> descrevem apenas o diapositivo principal específico; é apenas o tipo de informações armazenadas que é comum em todos os diapositivos.

    © ISO/IEC 29500: 2016

  • Classe ExtensionListWithModification

    A ExtensionListWithModification classe corresponde ao <extLst/>elemento . As seguintes informações da especificação ISO/IEC 29500 introduzem o <extLst/> elemento:

    Este elemento especifica a lista de extensões com a capacidade de modificação na qual são definidas todas as extensões futuras do tipo <ext/> de elemento. A lista de extensões, juntamente com as extensões futuras correspondentes, é utilizada para expandir as capacidades de armazenamento da arquitetura PresentationML. Isto permite que vários novos tipos de dados sejam armazenados nativamente dentro da arquitetura.

    [Nota: a utilização deste elemento extLst permite que a aplicação geradora armazene se esta propriedade de extensão foi modificada. nota de fim]

    © ISO/IEC 29500: 2016


Trabalhar com a Classe NotesSlide

Conforme mostrado no exemplo de código SDK Open XML que se segue, todas as instâncias da NotesSlide classe são associadas a uma instância da NotesSlidePart classe, que representa uma parte do diapositivo de notas, uma das partes de um pacote de ficheiros de apresentação PresentationML e uma parte que é necessária para cada diapositivo de notas num ficheiro de apresentação. Cada NotesSlide instância de classe também pode ser associada a uma instância da NotesMaster classe, que por sua vez está associada a uma peça de apresentação com o mesmo nome, representada pela NotesMasterPart classe .

A NotesSlide classe, que representa o <notes/> elemento, também está associada a uma série de outras classes que representam os elementos subordinados do <notes/> elemento. Entre estas classes, conforme mostrado no seguinte exemplo de código, estão a CommonSlideData classe e a ColorMapOverride classe . A ShapeTree classe e as Shape classes estão, por sua vez, associadas à CommonSlideData classe .


Open XML SDK Code Example

Nos fragmentos de P código seguintes, representa o espaço de nomes e D representa o espaço de nomes.

No fragmento abaixo, é aberta uma apresentação com Presentation.Open e a primeira SlidePart é obtida ou adicionada se a apresentação ainda não tiver um 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>();

Neste fragmento, o NoteSlide a é adicionado ao NoteSlidePart se ainda não existir. O NotesSlide construtor de classes cria instâncias da CommonSlideData classe . O CommonSlideData construtor de classe cria uma instância da ShapeTree classe, cujo construtor, por sua vez, cria instâncias de classe adicionais: uma instância da NonVisualGroupShapeProperties classe, uma instância da GroupShapeProperties classe e uma instância da Shape classe.

// 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 })),

O Shape construtor cria uma instância de NonVisualShapeProperties, ShapePropertiese TextBody classes juntamente com os elementos subordinados necessários. Contém TextBody o Paragraph, que tem um Run, que contém o texto da nota. Em seguida, a parte do diapositivo é adicionada à parte do diapositivo 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);

A parte do diapositivo de notas criada com o código acima contém o seguinte 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>

Os fragmentos seguintes adicionam o necessário NotesMasterPart e ThemePart , se estiverem em falta.

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

A seguir está um exemplo de código completo em C# e 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());
}

Confira também

Acerca do SDK Open XML para o Office

Como: Criar uma Apresentação ao Fornecer um Nome de Ficheiro

Como: Inserir um novo diapositivo numa apresentação

Procedimentos: Eliminar um diapositivo de uma apresentação

Como: Aplicar um tema a uma apresentação