gut*_*tch 6 java docx apache-poi
我一直在使用Apache POI来操作Microsoft Word .docx文件 - 即打开最初在Microsoft Word中创建的文档,对其进行修改,将其保存到新文档中.
我注意到Apache POI创建的新段落缺少修订保存ID,通常称为RSID或rsidR.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不冲突?
看起来有效的 rsid 条目列表保存在<w:rsids>条目的 word/settings.xml 中。XWPF 应该已经可以让您访问它了。
您可能想要生成一个 8 十六进制数字长的随机数,检查它是否在其中,如果在则重新生成。一旦您有了一个独特的段落,请将其添加到该列表中,然后用它标记您的段落。
我建议您加入 poi 开发列表(邮件列表详细信息),我们可以帮助您为其制作补丁。我认为要做的事情有:
不过,我们应该将其添加到开发列表中:)