dotnet OpenXML 解析 WPS 不规范的 PPT 文件的 cNvPr 重复 id 问题

2023-10-17 15:59

本文主要是介绍dotnet OpenXML 解析 WPS 不规范的 PPT 文件的 cNvPr 重复 id 问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在收到了反馈说有一份课件,打开解析就发现替换的元素不对,原因是这个课件里面的 Slide Master 里面存在一个元素的 id 和某个页面的元素 id 是相同的,这不符合 ECMA 376 的规范。通过读取文档的内容,发现这是 WPS 制作出来的 PPT 文件。本文做一个存档,用来告诉大家有这个坑

在 Office 2016 和 Office 2019 的行为判断请看以下两篇博客

dotnet OpenXML 元素 cNvPr NonVisual Drawing Properties 的属性作用

dotnet OpenXML 元素 cNvPr NonVisual Drawing Properties 重复 id 标识处理

上面博客对于相同页面里面存在重复的 id 处理比较简单,但是对于在 Slide Master 里面存在一个元素的 id 和某个页面的元素 id 是相同的比较坑,但是做法就是将 Slide Master 里面存在相同 id 元素当成比较先发现的元素

下面咱来看看这份有趣的课件,测试课件请点击 解析 WPS 不规范的 PPT 文件的 cNvPr 重复 id 问题.pptx 下载

在这份课件的 SlideMaster1.xml 文件里面,可以看到有如下定义

      <p:sp><p:nvSpPr><p:cNvPr id="7" name="KSO_TEMPLATE" hidden="1" /><p:cNvSpPr /><p:nvPr userDrawn="1"><p:custDataLst><p:tags r:id="rId8" /></p:custDataLst></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="0" y="0" /><a:ext cx="0" cy="0" /></a:xfrm><a:prstGeom prst="rect"><a:avLst /></a:prstGeom></p:spPr><!-- 忽略代码 --></p:sp>

根据 dotnet OpenXML 元素 cNvPr NonVisual Drawing Properties 的属性作用 可以了解到 p:cNvPr 的 id 就是元素的 id 属性

这个元素的属性是 7 同时有趣的是 name="KSO_TEMPLATE" 表示了这是 KSO 金山的 Template 模版

这个元素的 X 和 Y 和 宽度高度根据 a:xfrm 可以看到都是 0 没有宽度和高度,特别诡异

在页面 Slide1.xml 文件里面,可以看到里面有一个元素,这个元素的 p:cNvPr 也是 7 如下面代码

      <p:sp><p:nvSpPr><p:cNvPr id="7" name="标题 6" /><p:cNvSpPr txBox="1" /><p:nvPr><p:custDataLst><p:tags r:id="rId2" /></p:custDataLst></p:nvPr></p:nvSpPr><!-- 忽略代码 --></p:sp>

这个元素有一个有趣的属性,那就是 p:custDataLst 的值,这里面包含了 WPS 无文档的内容,可以看到 p:tags 通过 r:id 属性指向 rId2 的资源。在 Slide1.xml.rels 文件里面,可以看到下面代码

<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/tags" Target="../tags/tag12.xml"/>

也就是说加载了 tag12.xml 文件的内容,这个文件内容如下

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<p:tagLst xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"><p:tag name="KSO_WM_UNIT_HIGHLIGHT" val="0" /><p:tag name="KSO_WM_UNIT_COMPATIBLE" val="1" /><p:tag name="KSO_WM_UNIT_DIAGRAM_ISNUMVISUAL" val="0" /><p:tag name="KSO_WM_UNIT_DIAGRAM_ISREFERUNIT" val="0" /><p:tag name="KSO_WM_UNIT_LAYERLEVEL" val="1" /><p:tag name="KSO_WM_TAG_VERSION" val="1.0" /><p:tag name="KSO_WM_BEAUTIFY_FLAG" val="#wm#" /><p:tag name="KSO_WM_UNIT_ISCONTENTSTITLE" val="0" /><p:tag name="KSO_WM_UNIT_PRESET_TEXT" val="PART 01" /><p:tag name="KSO_WM_UNIT_NOCLEAR" val="0" /><p:tag name="KSO_WM_UNIT_VALUE" val="5" /><p:tag name="KSO_WM_UNIT_TYPE" val="e" /><p:tag name="KSO_WM_UNIT_INDEX" val="1" /><p:tag name="KSO_WM_TEMPLATE_CATEGORY" val="custom" /><p:tag name="KSO_WM_TEMPLATE_INDEX" val="20204217" /><p:tag name="KSO_WM_UNIT_ID" val="custom20204217_7*e*1" />
</p:tagLst>

可以看到这些都是 WPS 自己定义的内容,这样的课件在 Office 打开还是可以认的,只是还原效果没有在 WPS 上好。而在我自己的软件上,就凉凉了

这份课件可以通过 docProps\custom.xml 文件找到 WPS 应用的版本

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"><property fmtid="{D5CDD505-2E9C-101B-9397-08002B2CF9AE}" pid="2" name="KSOProductBuildVer"><vt:lpwstr>2052-11.1.0.9198</vt:lpwstr></property>
</Properties>

这里的 KSOProductBuildVer 就是表示构建这份文档的 WPS 应用版本,而 2052-11.1.0.9198 是版本号

本文的属性是依靠 dotnet OpenXML 解压缩文档为文件夹工具 工具协助测试的,这个工具是开源免费的工具,欢迎小伙伴使用

更多请看 Office 使用 OpenXML SDK 解析文档博客目录

我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入

如有不方便在博客评论的问题,可以加我 QQ 2844808902 交流

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

这篇关于dotnet OpenXML 解析 WPS 不规范的 PPT 文件的 cNvPr 重复 id 问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/226454

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

poj2406(连续重复子串)

题意:判断串s是不是str^n,求str的最大长度。 解题思路:kmp可解,后缀数组的倍增算法超时。next[i]表示在第i位匹配失败后,自动跳转到next[i],所以1到next[n]这个串 等于 n-next[n]+1到n这个串。 代码如下; #include<iostream>#include<algorithm>#include<stdio.h>#include<math.

poj3261(可重复k次的最长子串)

题意:可重复k次的最长子串 解题思路:求所有区间[x,x+k-1]中的最小值的最大值。求sa时间复杂度Nlog(N),求最值时间复杂度N*N,但实际复杂度很低。题目数据也比较水,不然估计过不了。 代码入下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k