dotnet OpenXML 幻灯片 PPTX 的 Slide Id 和页面序号的关系
在使用 OpenXML SDK 进行 Office 文档的解析时,对幻灯片 PPTX 文档的页面解析也许会遇到页面顺序的问题,本文告诉大家在 Office 文档里面页面的序号和顺序之间的关系以及如何读取页面序号
在开始之前,我期望你是了解一些 PPT 解析的相关知识的,入门级博客请看 C# dotnet 使用 OpenXml 解析 PPT 文件
在 C# dotnet 使用 OpenXml 解析 PPT 文件 这篇博客中没有详细告诉大家页面顺序的问题,但是按照 C# dotnet 使用 OpenXml 解析 PPT 文件 这篇博客的写法就是能拿到对的页面顺序
在 ECMA 376 标准中说明,在 Presentation.xml 文档将会记录页面的顺序和页面的 Id 值,也就是 Slide Id 值,代码大概如下
<p:sldIdLst>
<p:sldId id="277" r:id="rId2" />
</p:sldIdLst>
这里的 p:sldIdLst
将会存放在 PPT 画布里面多个页面之间的顺序,上面代码中页面的 Slide Id 是 id
这个属性,也就是当前的文档只有一个页面,这个页面的 Slide Id 是 277
的值。而后面的 r:id="rId2"
这个指的是文档压缩包里面的资源路径,可以通过这个属性找到对应的页面数据,请看下面代码
var slideIdList = presentation.SlideIdList;
foreach (var slideId in slideIdList.ChildElements.OfType<SlideId>())
{
// 获取页面内容
SlidePart slidePart = (SlidePart) presentationPart.GetPartById(slideId.RelationshipId);
// 忽略代码
}
上面代码的 slideId.RelationshipId
就是对应 r:id
属性。这个属性是通用的属性,详细请看 Office 文档解析 文档格式和协议
而 id="277"
的 id
需要使用 slideId.Id
读取,请看下面代码
public void Foo(FIleInfo file)
{
using var document = PresentationDocument.Open(file.OpenRead(), isEditable: false);
var openXmlPresentation = document.PresentationPart.Presentation;
var slideIdList = openXmlPresentation.SlideIdList;
foreach (var slideId in slideIdList.ChildElements.OfType<SlideId>())
{
var id = slideId.Id;
}
}
如何了解自己读取到的值是否是对的?试试使用 COM 的方式,或者创建一个 VSTO 插件,试试使用下面代码获取
var application = new Application();
var presentation = application.Presentations.Open(file, MsoTriState.msoTrue,
MsoTriState.msoFalse,
MsoTriState.msoFalse);
foreach (Microsoft.Office.Interop.PowerPoint.Slide presentationSlide in presentation.Slides)
{
var slideId = presentationSlide.SlideID;
}
这部分细节在 ECMA 376 文档提到的不多,请看 19.2.1.33 sldId (Slide ID) 和 19.2.1.34 sldIdLst (List of Slide IDs) 这两章
- HDUOJ---hello Kiki
- HDUOJ-----X问题
- POJ-----C Looooops
- POJ--Strange Way to Express Integers
- HDUOJ----More is better(并查集)
- HDUOJ 1099——Lottery
- HDUOJ-----取(m堆)石子游戏
- HDUOJ-----Be the Winner
- HDUOJ-------- Fibonacci again and again
- HDUOJ----Good Luck in CET-4 Everybody!
- 进制转换
- HDUOJ--畅通工程
- poj----Ubiquitous Religions
- POJ----The Suspects
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python百度关键词相关搜索词采集,链轮查询采集exe工具
- Python最火爬虫框架Scrapy入门与实践,豆瓣电影 Top 250 数据采集
- Python爬虫三种解析方式,Pyhton360搜索排名查询
- Python关键词百度指数采集,抓包Cookie及json数据处理
- 常用的package.json,还有这么多你不知道的骚技巧
- 【词库】Python关键词筛选分类,Levenshtein编辑距离算法分词
- 爬取数据缺失的补坑,Python数据爬取的坑坑洼洼如何铲平
- 如何开发跨框架的组件
- SpringBoot系列之异步任务@Async使用教程
- 深入k8s:k8s部署&在k8s中运行第一个程序
- Java是如何实现Future模式的?万字详解!
- Tensorflow基础入门十大操作总结
- Django个人博客,三小时带你入门Django框架
- 微信公众号文章采集工具,可采集文章文字内容信息及图片
- Python打包GUI界面组件汇总,Tkinter(TK)实例代码