我一直在使用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冲突?