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

我注意到由Apache POI创建的新段落缺少修订保存ID,通常称为RSID或rsidR。 Word使用它来识别在一个会话中(例如两次保存之间)对文档所做的更改。它是可选的-用户可以根据需要在Microsoft Word中将其关闭-但实际上几乎每个人都可以使用它,因此几乎每个文档都充满了RSID。有关更多信息,请阅读this excellent explanation of 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);

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

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

最佳答案

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

您可能希望生成一个8进制数字长的随机数,检查该数字是否在其中,然后重新生成它。拥有唯一的一个后,将其添加到该列表中,然后为其标记段落。

我建议您加入poi开发人员列表(mailing list details),我们可以助您一臂之力。我认为要做的事情是:

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

  • 我们应该把它带到开发者列表中:)

    07-26 07:45