如何使用Apache POI在Word .docx文件中正确生成RSID属性?

时间:2011-02-11 06:04:29

标签: java docx apache-poi

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

1 个答案:

答案 0 :(得分:4)

看起来有效的rsid条目列表保存在<w:rsids>条目的word / settings.xml中。 XWPF应该能够让您访问它。

你可能想要生成一个8位十六进制长的随机数,检查那里是否存在,并重新生成(如果是)。一旦你有一个唯一的,将它添加到该列表中,然后用它标记你的段落。

我建议您加入poi开发列表(mailing list details),我们可以帮您编写补丁。我认为要做的事情是:

  • 在word / settings.xml中的RSids条目周围包装,让您轻松获取列表并生成新的(唯一的)
  • 段落和运行
  • 上的不同RSid条目的包装器
  • 获取RSid包装器,添加新包装或清除现有包装的段落和运行方法

我们应该把它带到开发列表中:)