解压缩 docx 文件,比较其内容并创建新的合并 docx 文件

本文关键字:文件 docx 创建 合并 比较 解压缩 | 更新日期: 2023-09-27 17:56:29

为什么用ZipFile.CreateFromDirectory重新压缩的docx与原始的不一样?

我正在构建一个用于"docx"(和其他 word 文档)比较的模块。首先,我解压缩两个"docx"文件。然后,我比较并合并文档解压缩后创建的目录结构中的xml文件。最后,我压缩合并的目录并创建新的"docx"文件。根据单词比较,两个"docx"文件(原始文件和合并文件)Microsoft相同。此外,根据CRC32比较,xml内容是相同的,但合并的"docx"文件的大小或CRC32值与原始文件不同。对于减压,我使用系统.IO.压缩库。

这是压缩问题吗?Microsoft Word(和其他查看器)用于创建开放 xml 格式文档(如"docx"文件)的压缩算法是什么?

我运行了一些单元技术进行几个docx比较。所以我认为检查测试是否正确通过的唯一方法是比较 crc32 数字。

 public static void CreateCompressFile(string dirinfo, string originalFile)
 {
     FileInfo fi = new FileInfo(originalFile);
     ZipFile.CreateFromDirectory(dirinfo, 
         originalFile.Replace(fi.Extension, "_tmp" + fi.Extension),
         CompressionLevel.Fastest, false);
 }

解压缩 docx 文件,比较其内容并创建新的合并 docx 文件

Docx 是 ZIP 文件。只要解压缩的内容相同,从 Word 的角度来看,就可以认为文件相同(除非您出于某种原因需要对 ZIP 文件本身进行签名)。

ZIP 文件格式不需要压缩数据的某些特定格式 - 它明确允许压缩质量的变化。每个压缩库/工具都可以根据其内部标准自由选择压缩级别。即使传递给压缩的选项相似,2 个不同的实现也不太可能从相同的内容生成相同的 ZIP 文件。

即,即使您拥有的样本也显示能够选择压缩级别:ZipFile.CreateFromDirectory(...,CompressionLevel.Fastest, ...);

之前在 SE 上讨论过的类似问题:使用 GUI 创建的 ZIP 文件比在 shell 中创建的 ZIP 文件具有更多的字节数。