我一直在使用Apache POI来操作Microsoft Word .docx文件 - 即打开最初在Microsoft Word中创建的文档,修改它,将其保存到新文档中。
我注意到Apache POI创建的新段落缺少 Revision Save 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不冲突?
答案 0 :(得分:4)
看起来有效的rsid条目列表保存在<w:rsids>
条目的word / settings.xml中。 XWPF应该能够让您访问它。
你可能想要生成一个8位十六进制长的随机数,检查那里是否存在,并重新生成(如果是)。一旦你有一个唯一的,将它添加到该列表中,然后用它标记你的段落。
我建议您加入poi开发列表(mailing list details),我们可以帮您编写补丁。我认为要做的事情是:
我们应该把它带到开发列表中:)