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

相关文章

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

resultMap如何处理复杂映射问题

《resultMap如何处理复杂映射问题》:本文主要介绍resultMap如何处理复杂映射问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录resultMap复杂映射问题Ⅰ 多对一查询:学生——老师Ⅱ 一对多查询:老师——学生总结resultMap复杂映射问题

基于Python实现高效PPT转图片工具

《基于Python实现高效PPT转图片工具》在日常工作中,PPT是我们常用的演示工具,但有时候我们需要将PPT的内容提取为图片格式以便于展示或保存,所以本文将用Python实现PPT转PNG工具,希望... 目录1. 概述2. 功能使用2.1 安装依赖2.2 使用步骤2.3 代码实现2.4 GUI界面3.效