Как переопределить ODF Root RSID с помощью API
Я генерирую документы ODT, используя API openoffice / libreoffice, и я хочу, чтобы файлы каждый раз были на 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 ответ
Простое решение - просто удалить часть settings.xml из пакета Zip. Это все материал, зависящий от реализации, и он не должен иметь значения для создаваемого вами документа.
Если вы обеспокоены тем, что он все еще находится в манифесте, но не в пакете, альтернативой является замена файла settings.xml стандартным файлом, созданным вами, который учитывает схему и является наименее необходимым для достижения этой цели.
Обратите внимание, что существуют условия, при которых разные запуски openoffice/libreoffice могут встраивать разные UUID и идентификаторы на основе UIID в content.xml и в имена частей пакета. Похоже, что ваше поколение через API не приводит ни к одному из них.