

dotnet OpenXML 解析 WPS 不符合压缩文档规范的文档
source link: https://lindexi.gitee.io/post/dotnet-OpenXML-%E8%A7%A3%E6%9E%90-WPS-%E4%B8%8D%E7%AC%A6%E5%90%88%E5%8E%8B%E7%BC%A9%E6%96%87%E6%A1%A3%E8%A7%84%E8%8C%83%E7%9A%84%E6%96%87%E6%A1%A3.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

我遇到了有老师给我反馈说用我的小工具去辅助编辑课件的时候,遇到了他使用 WPS 制作的文档打开失败,原因是 WPS 制作的一些文档不符合压缩文档规范。而 Office 的基于 ECMA 376 的文档,都是使用标准的 ZIP 压缩规范的文档,因此对于这些不符合压缩文档规范的文件,将会解析失败
如果使用了不符合压缩规范的文件,那么在使用 OpenXML SDK 读取的时候,将会在解压缩的时候炸掉,如下
System.IO.FileFormatException:“File contains corrupted data.”
此异常最初是在此调用堆栈中引发的:
System.IO.Packaging.ZipPackage.ZipPackage(System.IO.Stream, System.IO.FileMode, System.IO.FileAccess)
System.IO.Packaging.Package.Open(System.IO.Stream, System.IO.FileMode, System.IO.FileAccess)
DocumentFormat.OpenXml.Packaging.OpenXmlPackage.OpenCore(System.IO.Stream, bool)
DocumentFormat.OpenXml.Packaging.PresentationDocument.Open(System.IO.Stream, bool, DocumentFormat.OpenXml.Packaging.OpenSettings)
DocumentFormat.OpenXml.Packaging.PresentationDocument.Open(System.IO.Stream, bool)
或者下面提示
//如果是 InvalidDataException 或 FileFormatException 是 WPS 的诡异格式,此时使用此方法解决
System.IO.InvalidDataException End of Central Directory record could not be found.
at System.IO.Compression.ZipArchive.ReadEndOfCentralDirectory()
at System.IO.Compression.ZipArchive.Init(Stream stream, ZipArchiveMode mode, Boolean leaveOpen)
at System.IO.Compression.ZipArchive..ctor(Stream stream, ZipArchiveMode mode, Boolean leaveOpen, Encoding entryNameEncoding)
at System.IO.Packaging.ZipPackage..ctor(String path, FileMode packageFileMode, FileAccess packageFileAccess, FileShare share)
at System.IO.Packaging.Package.Open(String path, FileMode packageMode, FileAccess packageAccess, FileShare packageShare)
at DocumentFormat.OpenXml.Packaging.OpenXmlPackage.OpenCore(String path, Boolean readWriteMode)
at DocumentFormat.OpenXml.Packaging.PresentationDocument.Open(String path, Boolean isEditable, OpenSettings openSettings)
at DocumentFormat.OpenXml.Packaging.PresentationDocument.Open(String path, Boolean isEditable)
在读取到 System.IO.InvalidDataException End of Central Directory record could not be found. 就是因为压缩文档不符合规范,或者文件损坏
而给我反馈的老师的课件其实只是压缩文档不符合规范,我使用 Office 2016 打开,此时会提示文档损坏
当然了,点击修复还是能打开课件的
但是我的工具无法通过 OpenXML SDK 读取
解决方法就是先使用其他压缩库进行解压缩和压缩,这样的文件就符合压缩规范了
如使用 DotNetZip 进行解压缩,在 csproj 上添加下面代码,用来安装 DotNetZip 这个 NuGet 库。当然了,使用 NuGet 安装也可以
<PackageReference Include="DotNetZip" Version="1.15.0" />
接下来使用下面代码进行解压缩,然后压缩
var folder = tempFolder;
using (var zipFile = Ionic.Zip.ZipFile.Read(file))
{
zipFile.ExtractAll(folder);
}
// 重新压缩回
System.IO.Compression.ZipFile.CreateFromDirectory(folder, newZipFile);
这样文件就符合压缩规范了,以上代码特别使用运行时提供的压缩方法
本文的代码放在 github 欢迎小伙伴访问
本文会经常更新,请阅读原文: https://blog.lindexi.com/post/dotnet-OpenXML-%E8%A7%A3%E6%9E%90-WPS-%E4%B8%8D%E7%AC%A6%E5%90%88%E5%8E%8B%E7%BC%A9%E6%96%87%E6%A1%A3%E8%A7%84%E8%8C%83%E7%9A%84%E6%96%87%E6%A1%A3.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
如果你想持续阅读我的最新博客,请点击 RSS 订阅,推荐使用RSS Stalker订阅博客,或者前往 CSDN 关注我的主页
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。
无盈利,不卖课,做纯粹的技术博客
以下是广告时间
推荐关注 Edi.Wang 的公众号
欢迎进入 Eleven 老师组建的 .NET 社区
以上广告全是友情推广,无盈利
Recommend
-
17
本文收集我写的 Office 解析相关博客 C# dotnet 使用 OpenXml 解析 PPT 文件
-
8
dotnet OpenXML 从文档生成创建文档的代码的库本文和大家介绍 Serialize.OpenXml.CodeGen 这个支持从某个文档生成用于创建出这个文档的 C# 或 VB 代码的库。作用就是可以让小伙伴在拿到一份模版文件之后,可以通过 Serialize.OpenXml.CodeGen 生成能创建出...
-
11
dotnet OpenXML 解析 WPS 不规范的 PPT 文件的 cNvPr 重复 id 问题在收到了反馈说有一份课件,打开解析就发现替换的元素不对,原因是这个课件里面的 Slide Master 里面存在一个元素的 id 和某个页面的元素 id 是相同的,这不符合 ECMA 376 的规范。通过读...
-
9
dotnet OpenXML 修复 Office 文档里面包含格式不正确的 Uri 而无法解析在使用 OpenXML 解析 Office 文档,无论是 PPT 还是 Word 还是 Excel 文档,都会使用标准方式解析。而此时的文档如果包含了错误的 Url 格式,例如不正确的邮件名的时候,将会在解析的...
-
12
dotnet OpenXML 图片特效的 BiLevel 黑白特效修改图片颜色在 Office 中,如 PPT 和 Word 可以不对原图修改的前提下,通过叠加特效的方式,提供对图片的视觉输出进行修改的方法,本文将介绍 ECMA 376 里面的 第 20.1.8.11 章的 Bi-Level (Black White Effec...
-
16
dotnet OpenXML 解压缩文档为文件夹工具做 Office 解析,是需要进行不断的测试才能了解 OpenXML 里面的属性的作用。根据 Ecma 376 的定义,文档其实只是一个压缩文件,可以使用压缩工具进行解压缩。但是我需要不断进行修改文档里面的属性,然后用 Office...
-
6
C# dotnet 使用 OpenXml 解析 PPT 里面的视频本文告诉大家如何从 PPTX 文件里面解析出视频 我期望看到本文的小伙伴是了解 OpenXML 的,如果想要解析 Office 的文档,我推荐使用使用 OpenXML SDK 这个开源的库,更多入门级博客请看
-
4
dotnet OpenXML 文本删除线解析方法本文来告诉大家如何解析读取在 OpenXML 里面存放的文本删除线,本文使用 PowerPoint 作为例子来告诉大家如何读取然后在 WPF 应用里面显示 在开始之前,期望大家已了解如何在 dotnet 应用里面读取 PPT 文件,...
-
24
dotnet OpenXML 利用合并表格单元格在 PPT 文档插入不可见的额外版权信息本文告诉大家如何利用 Office 对于 OpenXML 支持的特性,在 PPT 的表格里面,通过合并单元格存放一些额外的信息,这些信息对用户来说是不可见的,但是进行拷贝表格等的时候,可以保...
-
10
dotnet OpenXML WPF 解析实现 PPT 文本描边效果 本文是使用 WPF 做个 PowerPoint 系列的博客,本文来告诉大家如何解析 PPT 里面的文本描边效果,在 WPF 应用中绘制出来,实现像素级相同 在开始之前,期望你了解了 PPT 解析的入门知...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK