如何使用OpenXML读取PPT备注页(NotesSlide)的页眉和页脚?
读取PPT备注页(NotesSlide)的页眉和页脚(OpenXML实现)
核心思路
备注页的页眉/页脚内容存储在对应幻灯片的NotesSlidePart中,需遍历幻灯片的关联部件定位到NotesSlide,再通过占位符类型筛选出目标文本。
具体实现步骤(C#)
- 遍历PPT文档所有
SlidePart,获取每个幻灯片关联的NotesSlidePart(部分幻灯片无备注页,需做空值判断) - 在
NotesSlide的形状树中,筛选类型为Header和Footer的占位符形状 - 提取占位符内的文本内容
代码示例
using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Presentation; using System.Linq; public static void ReadNotesSlideHeaderFooter(string pptFilePath) { using (PresentationDocument presentationDocument = PresentationDocument.Open(pptFilePath, false)) { foreach (SlidePart slidePart in presentationDocument.PresentationPart.SlideParts) { // 获取当前幻灯片对应的备注页部件 NotesSlidePart notesSlidePart = slidePart.NotesSlidePart; if (notesSlidePart == null) continue; NotesSlide notesSlide = notesSlidePart.NotesSlide; if (notesSlide == null) continue; // 遍历备注页形状,筛选页眉/页脚占位符 foreach (Shape shape in notesSlide.ShapeTree.Elements<Shape>()) { PlaceholderShape placeholder = shape.NonVisualShapeProperties.ApplicationNonVisualDrawingProperties.GetFirstChild<PlaceholderShape>(); if (placeholder == null) continue; // 读取页眉 if (placeholder.Type == PlaceholderValues.Header) { string headerText = shape.TextBody.Elements<Paragraph>() .Select(p => string.Join("", p.Elements<Run>().Select(r => r.Text.Text))) .Aggregate((curr, next) => curr + "\n"); System.Console.WriteLine($"幻灯片{slidePart.SlideIdPart.SlideId.Value}备注页页眉:{headerText}"); } // 读取页脚 if (placeholder.Type == PlaceholderValues.Footer) { string footerText = shape.TextBody.Elements<Paragraph>() .Select(p => string.Join("", p.Elements<Run>().Select(r => r.Text.Text))) .Aggregate((curr, next) => curr + "\n"); System.Console.WriteLine($"幻灯片{slidePart.SlideIdPart.SlideId.Value}备注页页脚:{footerText}"); } } } } }
关键说明
- 必须从
NotesSlidePart读取,而非幻灯片的SlidePart,二者占位符分属不同部件 - 若备注页未自定义页眉/页脚,需从
NotesMasterPart(备注母版)读取默认值 - 通过
PlaceholderShape.Type精准筛选备注页专属的页眉/页脚,避免和幻灯片的页眉/页脚混淆
内容的提问来源于stack exchange,提问作者Beto Hiro
相关产品推荐
相关产品推荐

