我一直在使用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),我们可以助您一臂之力。我认为要做的事情是:
段落上的
我们应该把它带到开发者列表中:)