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 问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/lindexi_gd/article/details/111406201
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/226454

相关文章

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图