通过 JODConverter 和 LibreOffice 将 docx 转换为 pdf 会导致错误

Posted

技术标签:

【中文标题】通过 JODConverter 和 LibreOffice 将 docx 转换为 pdf 会导致错误【英文标题】:Converting docx to pdf via JODConverter and LibreOffice causes error 【发布时间】:2014-02-04 03:32:48 【问题描述】:

我有 1000 个要转换为 pdf 的 .docx 文件,因此我编写了一个程序来执行此操作,但在引发错误之前我永远无法通过所有 1000 个文件。我使用 soffice --headless --accept="socket,host=127.0.0.1,port=2002;urp;" 启动了一个无头版本的 LibreOffice。我正在使用 LibreOffice 4.2.0.4 和 JODConverter 2.2.2。这是我的转换代码(在此之前我只是迭代一个目录中的所有 .docx 文件):

try 
        File inputFile = new File(sourceFile);
        if (!inputFile.exists()) 
            return -1;
        

        File outputFile = new File(destFile);
        OpenOfficeConnection connection = new SocketOpenOfficeConnection(host_Str, 
            Integer.parseInt(port_Str));
        connection.connect();
        DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
        converter.convert(inputFile, outputFile);

        connection.disconnect();

        return 0;
    

    catch (ConnectException e) 
        System.out.println("Openoffice listener exception!");
        return 1;
    

在抛出错误之前,我总是可以转换至少 50 个左右的文件;这是我遇到的错误之一:

Exception in thread "main" com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException: 
    conversion failed: could not save output document; OOo errorCode: 3088
at com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter.loadAndExport(OpenOfficeDocumentConverter.java:142)
at com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter.convertInternal(OpenOfficeDocumentConverter.java:120)
at com.artofsolving.jodconverter.openoffice.converter.AbstractOpenOfficeDocumentConverter.convert(AbstractOpenOfficeDocumentConverter.java:104)
at com.artofsolving.jodconverter.openoffice.converter.AbstractOpenOfficeDocumentConverter.convert(AbstractOpenOfficeDocumentConverter.java:74)
at com.artofsolving.jodconverter.openoffice.converter.AbstractOpenOfficeDocumentConverter.convert(AbstractOpenOfficeDocumentConverter.java:70)
at previews.ConvertToPdfJOD.office2PDF(ConvertToPdfJOD.java:119)
at previews.ConvertToPdfJOD.beginConvert(ConvertToPdfJOD.java:91)
at previews.ConvertToPdfJOD.main(ConvertToPdfJOD.java:177)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

Caused by: com.sun.star.task.ErrorCodeIOException: SfxBaseModel::impl_store <file:///C:/dev/testFiles/docx/newsletter_t3w7-2012.docx.pdf> failed: 0xc10
at com.sun.star.lib.uno.environments.remote.Job.remoteUnoRequestRaisedException(Job.java:182)
at com.sun.star.lib.uno.environments.remote.Job.execute(Job.java:148)
at com.sun.star.lib.uno.environments.remote.JobQueue.enter(JobQueue.java:344)
at com.sun.star.lib.uno.environments.remote.JobQueue.enter(JobQueue.java:313)
at com.sun.star.lib.uno.environments.remote.JavaThreadPool.enter(JavaThreadPool.java:101)
at com.sun.star.lib.uno.bridges.java_remote.java_remote_bridge.sendRequest(java_remote_bridge.java:652)
at com.sun.star.lib.uno.bridges.java_remote.ProxyFactory$Handler.request(ProxyFactory.java:154)
at com.sun.star.lib.uno.bridges.java_remote.ProxyFactory$Handler.invoke(ProxyFactory.java:136)
at com.sun.proxy.$Proxy8.storeToURL(Unknown Source)
at com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter.storeDocument(OpenOfficeDocumentConverter.java:156)
at com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter.loadAndExport(OpenOfficeDocumentConverter.java:140)
... 12 more

其他错误示例包括:

Exception in thread "main" com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException: 
    conversion failed: could not save output document

Caused by: com.sun.star.uno.RuntimeException: [msci_uno bridge error] 
    UNO type of C++ exception unknown: "std.bad_alloc", RTTI-name=".?AVbad_alloc@std@@"!

Exception in thread "main" com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException: 
    conversion failed: could not save output document; OOo errorCode: 283

Caused by: com.sun.star.task.ErrorCodeIOException: SfxBaseModel::impl_store 
    <file:///R:/document%20preview%20DY/speedTests/doc/cm9draftfinallist.doc.pdf> failed: 0x11b

Exception in thread "main" com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException: 
    conversion failed: could not load input document

Exception in thread "main" com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException: 
    conversion failed: could not save output document; OOo errorCode: 3088

Caused by: com.sun.star.task.ErrorCodeIOException: SfxBaseModel::impl_store 
    <file:///C:/dev/testFiles/docx/newsletter_t3w7-2012.docx.pdf> failed: 0xc10

在所有情况下(到目前为止),我都能够在发生错误的 docx 文件上重试转换并且转换成功。

我在这个网站上查看过类似的问题,但大多数都是针对第一次尝试转换时引发错误的情况,而在我的情况下,总是在失败之前成功转换。我也尝试过使用 OpenOffice 获得相同的结果。我试过用谷歌搜索错误消息,但无济于事。

我的问题是为什么会出现这些错误,我该怎么做才能转换所有 1000 个 docx 文件?我也知道docx4j,但我需要能够转换不支持的 .doc 文件。

【问题讨论】:

【参考方案1】:

我正在使用 php 并使用 python 脚本进行转换,我遇到了与您类似的问题,我有 errorCode 283 和 SfxBaseModel::impl_store failed: 0x11b。

我有一个运行 apache 用户的 Apache 服务器和一个运行 LibreOffice 服务的普通用户,比如说 theusertheuser 已开启apache 组,以便在我的应用程序的 tmp 文件夹上写入。当我转换为 pdf 时,我创建了一个文件夹(我们称之为 thefolder)来存储转换后的文件(使用 PHP 上的 mkdir 函数)我看到 thefolder 没有组写入许可,我从终端(使用 theuser 用户)的其他位置进行测试,它在 thefolder 上有效,我有错误代码 283,我所做的是在 PHP 中使用 umask 函数来更改文件夹的创建权限。

总结:检查文件夹的权限,您将把结果文件放入其中

【讨论】:

我没有使用任何文件夹,而是使用 ByteStream instad,即使使用 chmod 777 也会显示相同的错误。【参考方案2】:

我也遇到过类似的问题。为我解决的问题是以 root 身份运行 soffice:

soffice --headless --accept="socket,host=127.0.0.1,port=2002;urp;"

【讨论】:

以上是关于通过 JODConverter 和 LibreOffice 将 docx 转换为 pdf 会导致错误的主要内容,如果未能解决你的问题,请参考以下文章

jodconverter实现在线预览

LibreOffice 4.4.3 - 在不同服务器上使用 jodconverter 访问文档

使用 jodconverter 和 OpenOffice 将 doc/docx 转换为 pdf

使用 Jodconverter 和 openoffice.org 将 PPT 转换为 JPG

比 JODCONVERTER 更快 [关闭]

JODConverter 页面方向