Сохранение документов с использованием OpenOffice java api выдает исключение - PullRequest
0 голосов
/ 10 июля 2020

FYI / Контекст: я запускаю переносную установку libreoffice на windows 10 (при обычной установке получаю такое же исключение на ma c).

Чтение документа

Может быть, это важно ... Я читаю документ через InputStream, потому что другой метод не работает из-за другого исключения (вероятно, история для другого раза).

public XComponent openFileViaStream(File file) throws CommandAbortedException, Exception {
    Object fileAccess = this.componentFactory.createInstanceWithContext(SimpleFileAccessClass, this.context);
    XSimpleFileAccess xSimpleFileAccess = (XSimpleFileAccess) UnoRuntime.queryInterface(XSimpleFileAccess.class,
            fileAccess);
    XStream xInputStream = xSimpleFileAccess.openFileReadWrite(file.getAbsolutePath());
    PropertyValue[] loadProps = new PropertyBuilder().add("InputStream", xInputStream).build();

    return loader.loadComponentFromURL("private:stream", "_blank", 0, loadProps);
}

Написание документа

PropertyBuilder - служебный класс, который просто создает массив PropertyValues ​​для простоты использования.

public void save(Object storeMe, File destination) throws IOException, MalformedURLException {
    //@formatter:off
    PropertyValue[] propertyValue = new PropertyBuilder()
            .add("Overwrite", Boolean.TRUE)
            .add("FilterName", "StarOffice XML")
            .build();
    //@formatter:on
        
    XStorable2 st = UnoRuntime.queryInterface(XStorable2.class, storeMe);
    

    // already tried
    // st.storeAsURL(destination.toURI().toURL().toString(), propertyValue);
    // st.storeToURL(destination.toURI().toString(), propertyValue);
    // st.storeToURL(destination.toURI().toURL().toString(), propertyValue);
        
    st.storeAsURL(destination.toURI().toString(), propertyValue);
}

Исключение

Мне не удалось найти решение при поиске в stackoverflow ...

 com.sun.star.task.ErrorCodeIOException: SfxBaseModel::impl_store <file:/E:/test/abc.odt> failed: 0x81a(Error Area:Io Class:Parameter Code:26)
    at com.sun.star.lib.uno.environments.remote.Job.remoteUnoRequestRaisedException(Job.java:173)
    at com.sun.star.lib.uno.environments.remote.Job.execute(Job.java:139)
    at com.sun.star.lib.uno.environments.remote.JobQueue.enter(JobQueue.java:334)
    at com.sun.star.lib.uno.environments.remote.JobQueue.enter(JobQueue.java:303)
    at com.sun.star.lib.uno.environments.remote.JavaThreadPool.enter(JavaThreadPool.java:87)
    at com.sun.star.lib.uno.bridges.java_remote.java_remote_bridge.sendRequest(java_remote_bridge.java:636)
    at com.sun.star.lib.uno.bridges.java_remote.ProxyFactory$Handler.request(ProxyFactory.java:146)
    at com.sun.star.lib.uno.bridges.java_remote.ProxyFactory$Handler.invoke(ProxyFactory.java:128)
    at com.sun.proxy.$Proxy10.storeAsURL(Unknown Source)
    at DocumentHandler.save(DocumentHandler.java:54)
    at Main.test(Main.java:14)
    at Main.main(Main.java:19)

Я действительно понятия не имею, что делаю не так. Я просмотрел примеры с api.libreoffice.org et c. Я что-то упускаю? A PropertyValue?

Заранее спасибо!

1 Ответ

0 голосов
/ 10 июля 2020

Посмотрите, поможет ли какая-либо из этих идей.

  • URI должен выглядеть как file:///E:/test/abc.odt.

  • Задайте имя фильтра StarOffice XML (Writer) или writer8. Или вообще не устанавливайте; передайте одно свойство вместо двух.

  • Убедитесь, что у вас есть разрешение на запись в файл, например, используя стандартные библиотеки Java для создания файла в этом месте. Убедитесь, что файл не заблокирован каким-либо другим процессом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...