Моя проблема: я пишу автоматизированную систему, которая должна читать .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);
Мое текущее предположение состоит в том, что я не могу вызвать это, потому что, будучи скрытым, у меня нет фрейма, к которому можно было бы вызвать какой-либо диспетчер. Но я не смог найти способ получить Диспетчер для Компонента.
Я уже пытался отправить TrackChanges
(к FALSE
), но это тоже не помогло.