OOo: UNO (Java) TrackedChanges: Как принять (или скрыть) Tracked Changes, когда документ скрыт?

Моя проблема: я пишу автоматизированную систему, которая должна читать .doc и .odt, выполнять над ней какую-то операцию и снова экспортировать в pdf.

В настоящее время это отлично работает для всего, что мне нужно, я мог решить все проблемы до этой:

Если пользователь предоставляет документ, в котором записаны изменения (пометки), мне нужно автоматически принять все эти изменения или скрыть их.

Я мог бы решить эту проблему с помощью приведенного ниже кода, пока OOo отображается на экране. Когда я запускаю его скрыто, мои звонки вообще ничего не делают.

Итак, вот что я делаю в настоящее время:

    // DO NOT try to cast this to Desktop as com.sun.star.frame.Desktop is NOT a valid class!
    // keep it as Object and cast it to XDesktop later (via queryInterface)
    Object desktop = xMCF.createInstanceWithContext("com.sun.star.frame.Desktop", xContext);
    XMultiServiceFactory xFactory = (XMultiServiceFactory) UnoRuntime.queryInterface(
        XMultiServiceFactory.class, xMCF);
    // what goes for desktop above is valid for DispatchHelper as well.
    Object dispatchHelper = xFactory.createInstance("com.sun.star.frame.DispatchHelper");

    // the DispatchHelper is the class that handles the interaction with dialogs.
    XDispatchHelper helper = (XDispatchHelper) UnoRuntime.queryInterface(
        XDispatchHelper.class, dispatchHelper);
    XDesktop xDesktop = (XDesktop) UnoRuntime.queryInterface(com.sun.star.frame.XDesktop.class, desktop);
    XFrame xFrame = xDesktop.getCurrentFrame();
    XDispatchProvider xDispatchProvider = (XDispatchProvider) UnoRuntime.queryInterface(XDispatchProvider.class, xFrame);

    // We issute the Track Changes Dialog (Bearbeiten - Änderungen // Edit - Changes) and tell it
    // to ACCEPT all changes.
    PropertyValue[] acceptChanges = new PropertyValue[1];
    acceptChanges[0] = new PropertyValue();
    acceptChanges[0].Name = "AcceptTrackedChanges";
    acceptChanges[0].Value = Boolean.TRUE;
    helper.executeDispatch(xDispatchProvider, ".uno:AcceptTrackedChanges", "", 0, acceptChanges);

    // We issue it again to tell it to stop showing changes.
    PropertyValue[] showChanges = new PropertyValue[1];
    showChanges[0] = new PropertyValue();
    showChanges[0].Name = "ShowTrackedChanges";
    showChanges[0].Value = Boolean.FALSE;
    helper.executeDispatch(xDispatchProvider, ".uno:ShowTrackedChanges", "", 0, showChanges);

Мое текущее предположение состоит в том, что я не могу вызвать это, потому что, будучи скрытым, у меня нет фрейма, к которому можно было бы вызвать какой-либо диспетчер. Но я не смог найти способ получить Диспетчер для Компонента.

Я уже пытался отправить TrackChangesFALSE), но это тоже не помогло.


person Angelo Fuchs    schedule 28.02.2012    source источник
comment
Вы когда-нибудь обходили это? Я надеялся, что для этого есть варианты загрузки, но, похоже, их тоже нет.   -  person Fabian Lange    schedule 08.01.2014
comment
@FabianLange Нет, не знал. Но сегодня GorgiKosev опубликовал ответ на этот вопрос. Вы бы проверили это?   -  person Angelo Fuchs    schedule 21.02.2014
comment
дайте этому человеку его щедрость!   -  person Fabian Lange    schedule 23.02.2014


Ответы (1)


Потратив два дня на изучение OOo API, я понял, что документ не загружается во внешнем интерфейсе, поэтому этот подход не работает. Однако вы можете напрямую изменить свойство документа:

XPropertySet docProperties = UnoRuntime.queryInterface(XPropertySet.class, document);
docProperties.setPropertyValue("RedlineDisplayType", RedlineDisplayType.NONE);

Имя свойства "RedlineDisplayType" можно найти в Документация RedlinePort

person Gorgi Kosev    schedule 21.02.2014
comment
Фантастическая работа Горги, она работает отлично. Я не знаю, где вы нашли этот документ, потому что я не могу найти его сам. Но это простое свойство работает на нас! Я сдался после нескольких дней поиска :) - person Fabian Lange; 23.02.2014
comment
@AngeloNeuschitzer ты это проверял? :) - person Gorgi Kosev; 02.04.2014