Работа со слайдами заметок
В этом разделе рассматривается класс Open XML SDK для Office NotesSlide и его связь со схемой PresentationML формата файла Open XML.
Слайды заметок в PresentationML
Спецификация ISO/IEC 29500 описывает элемент Open XML PresentationML <notes/>
, используемый для представления слайдов заметок в документе PresentationML следующим образом:
Этот элемент задает слайд заметок и соответствующие данные. Элементы, содержащиеся в слайде заметок, являются общими элементами слайда, включая дополнительные свойства, которые относятся к элементу заметок.
Пример. Рассмотрим следующий слайд примечаний PresentationML:
<p:notes>
<p:cSld>
…
</p:cSld>
…
</p:notes>
В приведенном выше примере элемент notes задает слайд заметок со всеми его частями. Обратите внимание на элемент cSld, задающий общие элементы, которые могут отображаться на слайде любого типа.
© ISO/IEC 29500: 2016
Элемент <notes/>
является корневым элементом части PresentationML Notes Slide. Дополнительные сведения об общей структуре частей и элементов документа PresentationML см. в разделе Структура документа PresentationML.
В следующей таблице перечислены дочерние элементы элемента, <notes/>
используемые при работе со слайдами заметок, и соответствующие им классы пакета SDK Open XML.
Элемент PresentationML | Класс пакета SDK Open XML |
---|---|
<clrMapOvr/> |
ColorMapOverride |
<cSld/> |
CommonSlideData |
<extLst/> |
ExtensionListWithModification |
В следующей таблице из спецификации ISO/IEC 29500 (Возможно, на английском языке) представлено описание атрибутов элемента <notes/>
.
Атрибуты | Описание |
---|---|
showMasterPhAnim (Показать анимации главных заполнителей) |
Указывает, следует ли показывать анимацию заполнителей с главного слайда. Возможные значения для этого атрибута определяются типом данных схемы boolean XML W3C. |
showMasterSp (Показать главные фигуры) |
Указывает, следует ли показывать на слайдах фигуры с главного слайда. Возможные значения для этого атрибута определяются типом данных схемы boolean XML W3C. |
© ISO/IEC 29500: 2016
Класс Open XML SDK NotesSlide
Класс пакета SDK NotesSlide
OXML представляет элемент, определенный <notes/>
в схеме формата файлов Open XML для документов PresentationML. Используйте класс для NotesSlide
управления отдельными <notes/>
элементами в документе PresentationML.
Классы, представляющие дочерние <notes/>
элементы элемента и поэтому обычно связанные с классом NotesSlide
, показаны в следующем списке.
Класс ColorMapOverride
Класс
ColorMapOverride
соответствует элементу<clrMapOvr/>
. Этот элемент представлен<clrMapOvr/>
в следующей информации из спецификации ISO/IEC 29500:Этот элемент предоставляет механизм, с помощью которого можно переопределить цветовые схемы, перечисленные в элементе
<ClrMap/>
. Если дочерний<masterClrMapping/>
элемент присутствует, используется цветовая схема, определенная master. Если дочерний<overrideClrMapping/>
элемент присутствует, он определяет новую цветовую схему, относясь к родительскому слайду заметок, слайду презентации или макету слайда.
© ISO/IEC 29500: 2016
Класс CommonSlideData
Класс
CommonSlideData
соответствует элементу<cSld/>
. Этот элемент представлен<cSld/>
в следующей информации из спецификации ISO/IEC 29500:Этот элемент задает контейнер для сведений о слайде, которые применимы ко всем типам слайдов. Все слайды имеют общий набор свойств, не зависящих от типа слайда; описание этих свойств для любого конкретного слайда хранится в контейнере слайда
<cSld/>
. Сведения о слайде для конкретного типа слайда, определенного родительским элементом, хранятся в другом месте.Фактические данные в
<cSld/>
описывают только конкретный родительский слайд; это только тип хранимой информации, который является общим для всех слайдов.© ISO/IEC 29500: 2016
Класс ExtensionListWithModification
Класс
ExtensionListWithModification
соответствует элементу<extLst/>
. Этот элемент представлен<extLst/>
в следующей информации из спецификации ISO/IEC 29500:Этот элемент задает список расширений с возможностью изменения, в котором определяются все будущие расширения типа
<ext/>
элемента. Список расширений вместе с соответствующими будущими расширениями используется для расширения возможностей хранения инфраструктуры PresentationML. Это обеспечивает встроенную возможность хранения новых типов данных в инфраструктуре.[Примечание. В качестве примера свойств абзаца можно привести выравнивание, границу, переопределение переносов, отступы, межстрочный интервал, заливка, направление текста и запрет висячих строк.]
© ISO/IEC 29500: 2016
Работа с классом NotesSlide
Как показано в следующем примере кода пакета SDK Open XML, каждый экземпляр NotesSlide
класса связан с экземпляром NotesSlidePart класса , который представляет часть слайда заметок, одну из частей пакета файла презентации PresentationML и часть, необходимую для каждого слайда заметок в файле презентации. Каждый NotesSlide
экземпляр класса также может быть связан с экземпляром NotesMaster класса , который, в свою очередь, связан с частью представления с аналогичным именем, представленной классом NotesMasterPart .
Таким NotesSlide
образом, класс, представляющий <notes/>
элемент, также связан с рядом других классов, представляющих дочерние элементы <notes/>
элемента .
Среди этих классов, как показано в следующем примере кода, есть CommonSlideData
класс и ColorMapOverride
класс . Класс ShapeTree и Shape классы, в свою очередь, связаны с классом CommonSlideData
.
Пример кода Open XML SDK
В следующих фрагментах
P
кода представляет пространство имен иD
пространство имен.
В приведенном ниже фрагменте презентации открывается с Presentation.Open
помощью , а первая SlidePart извлекается или добавляется, если в презентации еще 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>();
В этом фрагменте NoteSlide
добавляется в NoteSlidePart
, если он еще не существует.
Конструктор NotesSlide
класса создает экземпляры CommonSlideData
класса .
Конструктор CommonSlideData
класса создает экземпляр ShapeTree класса, конструктор которого, в свою очередь, создает дополнительные экземпляры класса: экземпляр NonVisualGroupShapeProperties класса, экземпляр GroupShapeProperties класса и экземпляр Shape класса .
// 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 })),
Конструктор Shape
создает экземпляр NonVisualShapePropertiesклассов , ShapePropertiesи TextBody вместе с необходимыми дочерними элементами.
ParagraphСодержит TextBody
, который содержит Run, который содержит текст заметки. Затем часть слайда добавляется в часть заметок.
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);
Часть слайда заметок, созданная с помощью приведенного выше кода, содержит следующий 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>
Следующие фрагменты кода добавляют необходимый NotesMasterPart элемент и ThemePart , если они отсутствуют.
// 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# и 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());
}
См. также
Сведения о пакете SDK Open XML для Office
Практическое руководство. Создание презентации путем указания имени файла
Практическое руководство. Вставка нового слайда в презентацию