本文告诉大家在 OpenXML 里面的 PPT 页面 Slide 的元素文档格式

是否小伙伴还记得如何使用 OpenXML SDK 获取一份 PPTX 文件的某一个页面?如果不记得,请看 C# dotnet 使用 OpenXml 解析 PPT 文件

如下是一个简单的 PPTX 的 Slide 页面

大概的主结构如下

对应缩写如下

p - Presentation
p:sld - Slide
p:cSld - CommonSlideData
p:spTree - ShapeTree

对应获取代码如下

            using (var presentationDocument =
                PresentationDocument.Open("test.pptx", false))
            {
                var presentationPart = presentationDocument.PresentationPart;
                foreach (var slidePart in presentationPart.SlideParts)
                {
                    var slide = slidePart.Slide;

                    var slideData = slide.CommonSlideData;
                    var shapeTree = slideData.ShapeTree;
                }
            }

元素放在 ShapeTree 里面,文档格式如下

尽管有多媒体元素等不属于 Shape 形状,但是在 PPT 里面形状属于最基础的元素, 在 PPT 里面的所有的元素都放在 ShapeTree 里面。虽然 ShapeTree 命名是形状,但实际上所有元素都可以当成形状使用

例如在 ShapeTree 里面放一个文本,文本本身就是 DocumentFormat.OpenXml.Presentation.Shape 也就是形状。形状是形状,而文本框也是形状

获取页面里面的形状的方法如下

foreach (var openXmlElement in shapeTree)
{
    if (openXmlElement is DocumentFormat.OpenXml.Presentation.Shape shape)
    {

    }
}

这里的代码放在 github 欢迎小伙伴访问,运行代码在 openXmlElement is DocumentFormat.OpenXml.Presentation.Shape shape 添加断点就可以看到断点进入

在 VS 的帮助下,其实咱可以不理会PPT文档本身,直接使用 OpenXML 解析完成的值,这样做的优势在于不需要频繁去找文档。除非真的在看了注释之后依然不理解属性的含义和作用,不过一般此时看文档作用也不大

例如想要看某个页面包含的元素,可以点开 shapeTree 的 ChildElements 属性

此时对应的 XML 的缩写的含义以及对应的属性将可以在 VS 调试的时候看到,看到具体的属性含义以及值,相对来说开发效率会提升很多。当然这需要你学会 VS 的调试方法哈

每个元素都有一些通用的属性,例如元素的变换,也就是表示元素的坐标和大小等的属性,元素翻转旋转等

此外对于特定的元素,例如形状元素有形状元素自己的属性,例如线条填充等,这部分就需要每个元素自己去解析了

在 PPT 里面所有文本都是形状,只是文本框是有趣的形状,而其他的形状大部分都是可以添加文本的。但 PPT 使用的文本和 Word 的文本是等价的,而 Word 的文本小伙伴都知道有多复杂了…… 因此在 PPT 解析里面的神坑其实就是文本的解析部分,关于文本解析我写了一些博客

换句话说如果完成了 PPT 的文本的解析和渲染,那么基本上 Word 的文本解析就完成了大半了。当然强大的 Word 可不止文本这一项

现在市面大部分的 PPT 解析工具和软件都只是实现了基础元素的基础属性,例如

  • 通用颜色
  • 通用动画的基础动画
  • 占位符
  • 形状
    • 形状线条
    • 形状样式
  • 文本
    • 纯文本
    • 文本多行多段
    • 文本装饰下划线等
    • 文本字体字号
    • 文本上下标
  • 图片
    • 图片文件
    • 图片裁剪
    • 基础图片特效
  • 音视频
    • 音视频图片
    • 音视频文件
  • 表格
    • 基础表格
    • 表格线条
    • 表格颜色

其中公式以及 Ole 元素等都可以作为图片显示,因此大部分包括 WPS 在内基本上对于公式和 Ole 元素都是当成图片,当然 WPS 很强,能解析一些公式和 Ole 元素

其实PPT解析里面的元素部分大部分都是 Office 通用的,例如文本是 PPT 和 Word 和 Excel 通用的。而表格是 Excel 的简化版

基本上完成一个元素的完全解析,基本上也就完成 Office 系列软件某个元素的解析

本文说的解析其实是不对的,因为使用 OpenXML SDK 库就是瞬间完成了内存模型解析。其他的业务都是根据业务本身从数据拿出来进行处理,例如进行渲染或者修改等


本文会经常更新,请阅读原文: https://dotnet-campus.github.io//post/dotnet-OpenXML-%E8%A7%A3%E6%9E%90-PPT-%E9%A1%B5%E9%9D%A2%E5%85%83%E7%B4%A0%E6%96%87%E6%A1%A3%E6%A0%BC%E5%BC%8F.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 lindexi (包含链接: https://dotnet-campus.github.io/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系