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

Java 如何使用ApachePOI在Word.docx文件中正确生成RSID属性?,java,docx,apache-poi,Java,Docx,Apache Poi,我一直在使用ApachePOI操作MicrosoftWord.docx文件,即打开最初在MicrosoftWord中创建的文档,对其进行修改,并将其保存到新文档中 我注意到ApachePOI创建的新段落缺少修订版保存ID,通常称为RSID或rsidR。Word使用它来标识在一个会话中(例如在两次保存之间)对文档所做的更改。它是可选的-用户可以在MicrosoftWord中关闭它,如果他们愿意的话-但实际上几乎每个人都有它,所以几乎每个文档都充满了RSID。阅读更多关于这方面的内容 在Micros

我一直在使用ApachePOI操作MicrosoftWord.docx文件,即打开最初在MicrosoftWord中创建的文档,对其进行修改,并将其保存到新文档中

我注意到ApachePOI创建的新段落缺少修订版保存ID,通常称为RSID或rsidR。Word使用它来标识在一个会话中(例如在两次保存之间)对文档所做的更改。它是可选的-用户可以在MicrosoftWord中关闭它,如果他们愿意的话-但实际上几乎每个人都有它,所以几乎每个文档都充满了RSID。阅读更多关于这方面的内容

在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>
    byte[] rsid = ???;
    XWPFParagraph paragraph = document.createParagraph();
    paragraph.getCTP().setRsidR(rsid);
    paragraph.getCTP().setRsidRDefault(rsid);
我发现我可以使用如下代码强制POI向每个段落添加RSID:

<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>
    byte[] rsid = ???;
    XWPFParagraph paragraph = document.createParagraph();
    paragraph.getCTP().setRsidR(rsid);
    paragraph.getCTP().setRsidRDefault(rsid);
然而,我不知道如何生成RSID


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

有效RSID条目列表似乎保存在
条目的word/settings.xml中。XWPF应该已经能够让您访问它了

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

我建议您加入poi-dev列表,我们可以帮助您为其开发补丁。我认为应该做的事情是:

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

不过,我们应该把这一点带到开发人员列表中:)

来自您引用的文章:“它们是完全随机的,只用于查看匹配的位置。因此,除非您与另一个也有RSID的文档合并,否则它们没有多大用处。”因此,您可以生成适当的随机数。至于冲突,它们的列表存储在其中一个属性部分中。你真的需要添加它们吗?它们只会改善某些比较/差异情况。感谢您的回答,这看起来是一个合理的解决方案,既然我需要功能,那么我还是构建它为好!因此,我确实会将其列入POI-dev列表。