如何使用 Apache POI 在 Word .docx 文件中正确生成 RSID 属性?

2024-03-17

我一直在使用 Apache POI 来操作 Microsoft Word .docx 文件 - 即打开最初在 Microsoft Word 中创建的文档,对其进行修改,然后将其保存到新文档中。

我注意到 Apache POI 创建的新段落缺少修订保存 ID,通常称为RSID or rsidR。 Word 使用它来识别在一个会话中(例如在保存之间)对文档所做的更改。它是可选的——用户可以根据需要在 Microsoft Word 中将其关闭——但实际上几乎每个人都打开了它,因此几乎每个文档都充满了 RSID。读RSID 的精彩解释 http://blogs.msdn.com/b/brian_jones/archive/2006/12/11/what-s-up-with-all-those-rsids.aspx了解更多相关信息。

在 Microsoft Word 文档中,word/document.xml包含这样的段落:

<w:p w:rsidR="007809A1" w:rsidRDefault="007809A1" w:rsidP="00191825">
  <w:r>
    <w:t>Paragraph of text here.</w:t>
  </w:r>
</w:p>

然而,由 POI 创建的同一段落将如下所示word/document.xml:

<w:p>
  <w:r>
    <w:t>Paragraph of text here.</w:t>
  </w:r>
</w:p>

我发现我可以使用如下代码强制 POI 添加 RSID 到每个段落:

    byte[] rsid = ???;
    XWPFParagraph paragraph = document.createParagraph();
    paragraph.getCTP().setRsidR(rsid);
    paragraph.getCTP().setRsidRDefault(rsid);

但是我不知道应该如何生成 RSID。

POI 有办法生成和/或跟踪 RSID 吗?如果没有,有什么方法可以确保我生成的 RSID 不会与文档中已有的 RSID 冲突?


看起来有效的 rsid 条目列表保存在 word/settings.xml 中<w:rsids>入口。 XWPF 应该已经可以让您访问它了。

您可能想要生成一个 8 十六进制数字长的随机数,检查它是否在其中,如果在则重新生成。一旦你有了一个独特的,将其添加到该列表中,然后用它标记你的段落。

我建议你加入 poi 开发者列表(邮件列表详细信息) http://poi.apache.org/mailinglists.html,我们可以帮助您制作补丁。我认为要做的事情有:

  • 包装 word/settings.xml 中的 RSids 条目,让您轻松获取列表并生成一个新的(唯一的)
  • 段落和运行中不同 RSid 条目的包装器
  • 段落和运行中的方法,用于获取 RSid 包装器、添加新包装器或清除现有包装器

不过,我们应该将其添加到开发列表中:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Apache POI 在 Word .docx 文件中正确生成 RSID 属性? 的相关文章

随机推荐