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

gut*_*tch 6 java docx apache-poi

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

我注意到Apache POI创建的新段落缺少修订保存ID,通常称为RSIDrsidR.Word使用它来标识在一个会话中对文档所做的更改,例如在保存之间.它是可选的 - 用户可以根据需要在Microsoft Word中关闭它 - 但实际上几乎每个人都有它,所以几乎每个文档都充满了RSID.阅读有关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>
Run Code Online (Sandbox Code Playgroud)

但是,POI创建的相同段落将如下所示word/document.xml:

<w:p>
  <w:r>
    <w:t>Paragraph of text here.</w:t>
  </w:r>
</w:p>
Run Code Online (Sandbox Code Playgroud)

我已经发现我可以强制POI使用以下代码为每个段落添加一个RSID:

    byte[] rsid = ???;
    XWPFParagraph paragraph = document.createParagraph();
    paragraph.getCTP().setRsidR(rsid);
    paragraph.getCTP().setRsidRDefault(rsid);
Run Code Online (Sandbox Code Playgroud)

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

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

Gag*_*arr 5

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

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

我建议您加入 poi 开发列表(邮件列表详细信息),我们可以帮助您为其制作补丁。我认为要做的事情有:

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

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