0

我正在使用 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);
4

1 回答 1

1

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

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

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

于 2013-05-19T17:04:28.227 回答