我正在寻找一种方法,将机器可读的元数据添加到我生成的 DOCX 报告中。目标是允许用户修改文档的样式,然后将其重新上传到系统,同时保留元数据。
第一次尝试时,我天真地尝试将元数据存储在评论中,但我注意到一些编辑器,特别是 Microsoft Word,在修改后会删除我的评论并生成没有它们的 DOCX 文件。
我也尝试了结构化文档标签,但 Google Docs 和 Microsoft Word 都会在样式修改后删除它们。
最后,我尝试使用自定义 XML,但 Google Docs 和 Microsoft Word 都删除了我添加的属性和标签。
我搜索了很多,但还是没找到有效的解决方案。有人遇到过类似的问题吗?可以分享一些建议吗?
PS1
由于即使是小型 DOCX 文件中也包含太多行,因此我创建了一个极简的 repo,以便更好地展示我迄今为止的尝试。每次尝试都放在一个单独的目录中。每个目录包含:
- Document.docx — 使用一些隐藏元数据手动创建的基础文件。
- ModifiedWithGoogle.docx 和 ModifiedWithWord.docx — 在 Google Docs 或 Microsoft Word 中编辑文档后的结果。
- 解压每个 .docx 文件的内容,以便更轻松地检查内部 XML。
仓库:https://github.com/kishieel/docx-metadata
第一次尝试时,我使用注释添加了元数据。这在 Google Docs 上效果很好,即使使用剪切粘贴移动文本,注释也能保留。然而,Microsoft Word 删除了所有注释。也许 Word 需要一种不同的注释创建方式?
示例输入:
<!-- 1_comments/Document/word/document.xml -->
<w:document ...>
<w:body>
<w:p>
<w:commentRangeStart w:id="0" />
<w:r>
<w:t xml:space="preserve">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris quis mollis tellus. Aenean at maximus nunc.</w:t>
</w:r>
<w:commentRangeEnd w:id="0" />
</w:p>
</w:body>
</w:document>
<!-- 1_comments/Document/word/comments.xml -->
<w:comments ...>
<w:comment w:id="0" w:date="2025-04-07T09:10:21.783Z">
<w:p>
<w:r>
<w:t xml:space="preserve">Some metadata #1</w:t>
</w:r>
</w:p>
</w:comment>
</w:comments>
在第二种方法中,我尝试使用 SDT。在这种情况下,Microsoft Word 保留了它们(尽管它将每个句子拆分成了单独的单词,这可能是默认行为,也可能是出了什么问题)。Google Docs 将它们从修改后的文件中完全删除了。
示例输入:
<!-- 2_structured_document_tags/Document/word/document.xml -->
<w:document ...>
<w:body>
<w:p>
<w:sdt>
<w:sdtPr>
<w:tag w:val="Some metadata #1" />
<w:alias w:val="Some alias #1" />
</w:sdtPr>
<w:sdtContent>
<w:r>
<w:t xml:space="preserve">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris quis mollis tellus. Aenean at maximus nunc.</w:t>
</w:r>
</w:sdtContent>
</w:sdt>
</w:p>
</w:body>
</w:document>
准备好后我将提供自定义 XML 示例。