使用Buffer.concat的NodeJS合并Docx文件给出“无法找到单词的内容”

问题描述

我有一个简单的 a.docx 文件,其中仅包含单词 a (这只是一个简单的例子)。我使用readFileSync读取了文件,该文件提供了 buffer 。我的目标是(从另一个.docx文件中)添加一个缓冲区并以合并的.docx文件结束。

这是我要做的测试:

var buf = fs.readFileSync(path.resolve(__dirname,"a.docx"));
console.log(buf);
console.log(Buffer.concat([buf,buf]));

礼物:

<Buffer 50 4b 03 04 0a 00 00 00 00 00 00 00 21 00 df a4 d2 6c 20 05 00 00 20 05 00 00 13 00 00 00 5b 43 6f 6e 74 65 6e 74 5f 54 79 70 65 73 5d 2e 78 6d 6c 3c ... 51319 more bytes>
<Buffer 50 4b 03 04 0a 00 00 00 00 00 00 00 21 00 df a4 d2 6c 20 05 00 00 20 05 00 00 13 00 00 00 5b 43 6f 6e 74 65 6e 74 5f 54 79 70 65 73 5d 2e 78 6d 6c 3c ... 102688 more bytes>

符合预期(双字节)。但是,当我使用以下命令保存新的串联缓冲区时:

fs.writeFileSync(
    path.resolve(__dirname,"hello.docx"),Buffer.concat([buf,buf])
  );

...并尝试打开生成 hello.docx 文件,我得到:

Output Document Error

如果我单击“是”,则文档仅显示原始的 a.docx 文件,而没有预期的重复-为什么会发生这种情况?

解决方法

在字节级别将DOCX文件与其自身连接起来根本无法生成可行的DOCX文件。

您完全忽略了数千个标准文档中指定的多个抽象级别。阅读OOXML和WordProcessingML。至少,您需要使用Zip和XML处理库。您更有可能希望找到更高级的DOCX / OOXML库来提供帮助。

Word刚好能够修复损坏的“ DOCX”文件,以向您显示其原始格式。这说明Word修复功能的健壮性胜于证明文件是正确的DOCX文档。