【发布时间】:2011-06-25 08:44:12
【问题描述】:
我一直在使用 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 不冲突?
【问题讨论】:
-
从您引用的文章中:“它们是完全随机的,仅用于查看匹配的位置。因此,除非您与另一个也具有 RSID 的文档合并,否则它们没有多大用处。 "因此,您可以生成适当的随机数。至于冲突,它们的列表存储在属性部分之一中。你真的需要添加它们吗?它们只会改进某些比较/差异案例。
标签: java docx apache-poi