【问题标题】:How to generate RSID attributes correctly in Word .docx files using Apache POI?如何使用 Apache POI 在 Word .docx 文件中正确生成 RSID 属性?
【发布时间】:2011-06-25 08:44:12
【问题描述】:

我一直在使用 Apache POI 来处理 Microsoft Word .docx 文件——即打开一个最初在 Microsoft Word 中创建的文档,对其进行修改,然后将其保存到一个新文档中。

我注意到 Apache POI 创建的新段落缺少 Revision Save ID,通常称为 RSIDrsidR。 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


【解决方案1】:

看起来有效 rsid 条目的列表保存在 &lt;w:rsids&gt; 条目的 word/settings.xml 中。 XWPF 应该已经可以让你访问它了。

您可能想要生成一个 8 位十六进制数字长的随机数,检查其中是否存在,如果存在则重新生成。一旦你有了一个独特的,将它添加到该列表中,然后用它标记你的段落。

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

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

不过,我们应该把它放到开发者列表中:)

【讨论】:

  • 感谢您的回答,这看起来是一个明智的解决方案,既然我需要该功能,那么我不妨构建它!所以我确实会把它带到 POI 开发者列表中。
猜你喜欢
  • 1970-01-01
  • 2011-04-06
  • 2020-02-27
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
相关资源
最近更新 更多