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

8

我一直在使用Apache POI来操作Microsoft Word .docx文件,也就是打开一个最初在Microsoft Word中创建的文档,修改它,将其保存到新文档中。

我注意到由Apache POI创建的新段落缺少一个“修订保存ID”,通常称为“RSID”或“rsidR”。Word用它来标识在一个会话中对文档所做的更改,例如在保存之间。它是可选的——如果用户想要关闭它,可以在Microsoft Word中关闭——但实际上几乎每个人都会打开它,因此几乎每个文档都充满了RSIDs。阅读这篇关于RSIDs的优秀解释以了解更多信息。

在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);

然而,我不知道我应该如何生成RSIDs。

POI有一种生成和/或跟踪RSID的方法吗?如果没有,有没有办法确保我生成的RSID不会与文档中已经存在的RSID冲突?


从您引用的文章中可以看出:“它们是完全随机的,只用于查看事物是否匹配。因此,除非您正在与另一个具有RSID的文档合并,否则它们没有太多用处。” 因此,您可以生成适当的随机数。至于冲突,它们的列表存储在属性部分之一中。您真的需要添加它们吗?它们只会改善某些比较/差异情况。 - JasonPlutext
1个回答

5
看起来有效rsid条目的列表保存在word/settings.xml中的条目中。XWPF应该已经可以让您访问它。
你可能想要生成一个8个十六进制数字长的随机数,检查它是否在其中,如果是,则重新生成。一旦你有了一个唯一的数字,就将其添加到该列表中,然后给你的段落打上标记。
我建议你加入poi开发者列表(邮件列表详情),我们可以帮助你制作补丁。我认为要做的事情有:
  • 在word/settings.xml中RSids条目周围包装,以便您轻松获取列表并生成新的(唯一的)
  • 在段落和运行中不同的RSid条目周围包装
  • 在段落和运行上的方法来获取RSid包装器,添加新的或清除现有的
我们应该把这个问题提交到开发者列表 :)

谢谢您的回答,这看起来是一个合理的解决方案,既然我需要这个功能,那我也可以构建它!所以我确实会把这个问题带到POI开发列表中。 - gutch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接