2013-05-19 2 views
0

Я создаю документы ODT, используя API openoffice/libreoffice, и хочу, чтобы файлы выходили на 100% идентично каждый раз (по сравнению с MD5).Как переопределить RoD RSID ODF с помощью API

На этом этапе я могу разархивировать два файла, сгенерированные в разное время, и проверить все файлы в 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 не приводит ни к одному из них.

+0

Да, это был мой собственный первый обходной путь, и он отлично работает, я просто надеялся, что смогу избежать процесса модификации пакета. Я не знал о возможности идентификаторов UUID/UIID, я еще не сталкивался с ними, но мне нужно будет изучить это и посмотреть, могут ли это повлиять на меня. –

Смежные вопросы