如何使用 API 覆盖 ODF 根 RSID

Posted

技术标签:

【中文标题】如何使用 API 覆盖 ODF 根 RSID【英文标题】:How do I override ODF Root RSID using the API 【发布时间】:2013-05-19 15:55:18 【问题描述】:

我正在使用 openoffice/libreoffice API 生成 ODT 文档,并且我希望每次输出的文件都 100% 相同(通过 MD5 比较)。

此时我可以解压缩在不同时间生成的两个文件并检查 zip 文件中的所有文件,它们都匹配 100%,除了 Settings.xml 有两个独特的差异(都与 RSID 相关)。

<config:config-item config:name="Rsid" config:type="int">1835643</config:config-item>

<config:config-item config:name="RsidRoot" config:type="int">1835643</config:config-item>

我了解到这是为了合并和跟踪原始文档,但我希望它们是我控制的固定值,因为我不打算合并它们,但我找不到在哪里设置这些属性。

我已经尝试了一些选项(如下)并输出了属性,但到目前为止还没有找到。有没有办法覆盖 RSID,无需我(编码)解压缩文件并修改 XML,我现在已经完成了,但感觉有点尴尬所以仍在寻找这个。

// Looking for RSID in all the wrong places - test 1
XPropertySet xSettings = (XPropertySet) xRemoteServiceManager.createInstanceWithContext("com.sun.star.document.Settings", componentContext);

// Looking for RSID in all the wrong places - test 2
Object configProvider = xRemoteServiceManager.createInstanceWithContext( "com.sun.star.configuration.ConfigurationProvider", componentContext);
XMultiServiceFactory xConfigProvider = (XMultiServiceFactory) UnoRuntime.queryInterface( XMultiServiceFactory.class, configProvider);

PropertyValue[] lParams = new PropertyValue[1];

lParams[0] = new PropertyValue();
lParams[0].Name = "nodepath";
lParams[0].Value = "/";

Object xAccess = xConfigProvider.createInstanceWithArguments( "com.sun.star.configuration.ConfigurationUpdateAccess" , lParams);

XNameAccess xNameAccess = (com.sun.star.container.XNameAccess) UnoRuntime.queryInterface(XNameAccess.class, xAccess);

【问题讨论】:

【参考方案1】:

简单的解决方案是简单地删除 Zip 包中的 settings.xml 部分。这都是依赖于实现的材料,对于您正在生成的文档来说应该无关紧要。

如果您担心它仍然在清单中,虽然不在包中,另一种方法是将 settings.xml 替换为您创建的标准文件,该文件尊重架构并且是完成该操作的最少需要。

请注意,在某些情况下,openoffice/libreoffice 的不同运行可能会在 content.xml 和包部件的名称中嵌入不同的 UUID 和基于 UIID 的标识符。看来您通过 API 生成的代不会导致任何这些。

【讨论】:

是的,这也是我自己的第一个解决方法,而且效果很好,我只是希望我可以避免修改包的过程。我不知道 UUID/UIID 标识符的可能性,我还没有遇到它们,但我必须调查一下,看看这些是否会影响我。

以上是关于如何使用 API 覆盖 ODF 根 RSID的主要内容,如果未能解决你的问题,请参考以下文章

如何将 OpenOffice ODF 文件转换为 HTML

如何覆盖 Apple Watch 后退按钮以弹出到根控制器

聚合根中覆盖的实体如何保存在 DDD 中?

如何使覆盖范围包括未测试的文件?

如何使用历史 API 将 slug 附加到根路径?

如何使用 nuxt 和 @vue/composition-api 提供/注入 Vue 根实例?