欧拉2403+libreoffice24.8 JodConverter 不能正常转化

欧拉版本

Linux bogon 6.6.0-98.0.0.103.oe2403sp2.x86_64 #1 SMP Wed Jun 25 23:16:20 CST 2025 x86_64 x86_64 x86_64 GNU/Linux

libreoffice版本

LibreOffice 24.8.3.2 48a6bac9e7e268aeb4c3483fcf825c94556d9f92

libreoffice 2001和2002端口,可以正常启动

命令行 word转pdf 可以正常转化

但是 Java代码 转化时 报如下错误

converterFile OfficeException
org.jodconverter.core.office.OfficeException: Task did not complete within timeout (300000 ms): LocalConversionTask{source=SourceDocumentSpecsFromFile{file=1772507795114@2_3_投稿介绍信.docx, format=docx}, loadProperties={ReadOnly=true, Hidden=true, UpdateDocMode=0}, target=TargetDocumentSpecsFromFile{file=1772507795114@2_3_投稿介绍信.pdf, format=pdf}, storeProperties=null, useStreamAdapters=false}
at org.jodconverter.core.office.AbstractOfficeManagerPoolEntry.waitTaskCompletion(AbstractOfficeManagerPoolEntry.java:120)
at org.jodconverter.core.office.AbstractOfficeManagerPoolEntry.execute(AbstractOfficeManagerPoolEntry.java:86)
at org.jodconverter.core.office.AbstractOfficeManagerPool.execute(AbstractOfficeManagerPool.java:216)
at org.jodconverter.local.LocalConverter$LocalConversionJob.doExecute(LocalConverter.java:181)
at org.jodconverter.core.job.AbstractConversionJob.execute(AbstractConversionJob.java:63)

以上具体是什么原因, 感谢老师和大佬指教。

答案内容由AI生成,仅供参考:

:end_arrow: 结论

您的问题是典型的 “命令行可用但 Java 接口超时” 场景。根本原因很可能在于:

:cross_mark: LibreOffice 未真正处于稳定监听状态,或
:cross_mark: 缺少字体/语言包导致文档处理阻塞,或
:cross_mark: Java 与 LibreOffice 权限/用户空间不一致

:white_check_mark: 建议操作顺序

  1. 验证 LibreOffice 是否通过 --accept 指令监听端口;
  2. 安装 glibc-langpack-zh 和中文字体;
  3. 确保 Java 与 office 进程同用户运行;
  4. 增加 JodConverter 超时时间;
  5. 使用 Docker 封装测试,排除环境差异。
点击此处查看详细分析解答

关于 openEuler 24.03 + LibreOffice 24.8.3 环境下 JodConverter 转换失败问题的分析与建议

根据您提供的信息,您在 openEuler 24.03 LTS SP2 系统上成功安装并运行了 LibreOffice 24.8.3,并且可以通过命令行完成文档转换(如 .docx.pdf),但使用 JodConverter(基于 Java 的 Office 文档转换工具)进行转换时出现超时异常。以下是基于所提供的知识库内容和系统环境的全面分析。


:magnifying_glass_tilted_left: 问题摘要

  • 操作系统:openEuler 24.03 LTS SP2(内核版本 6.6.88-...
  • LibreOffice 版本:24.8.3.2,已确认可正常启动,支持 headless 模式
  • 命令行转换:white_check_mark: 成功
  • Java 应用(JodConverter)转换:cross_mark: 失败,报错:Task did not complete within timeout (300000 ms)
  • 错误类型org.jodconverter.core.office.OfficeException

:puzzle_piece: 核心原因分析

虽然 LibreOffice 本身在系统中可以正常运行,但从 Java 环境调用 JodConverter 执行转换任务时失败,可能涉及以下几个关键因素:

1. :white_check_mark: LibreOffice 已正确安装并支持 headless 模式

根据知识库信息:

  • LibreOffice 24.8.3 是一个被正式用于容器化部署的版本,支持运行于 openEuler,并能以 headless 模式(无图形界面)执行文档转换。
  • 在 Docker 部署案例中,明确使用了如下启动命令:
    /opt/libreoffice24.8/program/soffice --headless --accept="socket,host=0.0.0.0,port=8100;urp;" --nofirststartwizard
    
    这与 JodConverter 所需的连接方式一致。

:white_check_mark: 说明 LibreOffice 本身具备远程控制和后台服务能力。


2. :warning: JodConverter 连接超时 —— 常见原因分析

错误信息:

Task did not complete within timeout (300000 ms)

表示 JodConverter 已连接到 LibreOffice 的 office 进程,但在规定时间内未收到响应,常见于以下场景:

(1)LibreOffice 实例未以多路复用(listening mode)正确启动

JodConverter 需要 LibreOffice 提前运行在一个或多个监听端口(如 2001, 2002)上,等待连接请求。即便您看到“2001 和 2002 端口可以正常启动”,仍需验证:

:white_check_mark: 是否通过 --accept 参数启用 URP/RMI 通信

正确启动方式应为:

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

若未加 --accept,即使进程在运行,也无法接受外部连接。

:magnifying_glass_tilted_left: 检查方法:

netstat -tuln | grep 2001
ps aux | grep soffice

(2)Java 应用与 LibreOffice 不在同一用户空间或权限隔离

  • LibreOffice 若以某个用户身份启动,其临时目录(如 ~/.config/libreoffice)和锁文件会对其他用户访问造成冲突。
  • 如果 Java 服务是以 applicationtomcat 用户运行,而 LibreOffice 是用 root 启动,则可能出现权限问题。

:light_bulb: 建议:

  • 统一使用同一用户启动 LibreOffice 和 Java 服务。
  • 使用 -env:UserInstallation=file:///path/to/custom/profile 指定独立配置路径,避免冲突。

(3)缺少必要的依赖组件或语言包

尽管命令行转换正常,但 JodConverter 可能需要更完整的运行环境。

从知识库可见:

  • LibreOffice 在 openEuler 安装时需依赖如下关键库:
    gtk3, glibc-langpack-zh, fontconfig, java-1.8.0-openjdk, cups
    
  • 若缺少字体支持或中文语言包,可能导致复杂文档打开缓慢甚至卡死(超时)
  • 特别是文档中含有中文(如“投稿介绍信”),若系统中无合适字体(如 wqy-zenhei 或 SourceHanSerifCN),LibreOffice 在渲染时可能阻塞。

:pushpin: 建议安装中文语言包和中文字体:

dnf install -y glibc-langpack-zh wqy-zenhei-fonts

或参考知识库中通过 Docker 方式添加思源宋体:

ADD ./SourceHanSerifCN.zip /usr/share/fonts/
fc-cache -fv

(4)Python 相关警告提示潜在环境异常

您执行命令时出现如下提示:

Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Considering setting PYTHONHOME to <prefix>:<exec_prefix>

这表明 LibreOffice 内嵌的 Python 环境未正确配置。虽然不影响简单转换,但在某些文档加载或宏处理中可能导致不稳定行为,进而延长处理时间导致超时

:wrench: 解决方案:
设置 Python 环境变量(可选):

export PYTHONHOME=/usr
export PYTHONPATH=/usr/lib64/python3.9

注意:openEuler 默认可能未安装完整 Python 支持包。


(5)JodConverter 超时时间设置过短 or 处理并发任务过多

当前错误明确提示超时时间为 300000 ms = 5分钟,对于大文件或多页文档,可能不足。

:hammer_and_wrench: 建议在代码中增加超时配置:

LocalConverter.builder()
    .taskExecutionTimeout(Duration.ofMinutes(10)) // 提高至 10 分钟
    .build();

:white_check_mark: 推荐解决方案汇总

问题点 建议操作
:white_check_mark: 确保 LibreOffice 处于监听模式 使用 --accept="socket,host=...,port=xxx;urp;" 启动
:white_check_mark: 统一用户与权限 Java 进程与 LibreOffice 使用同一用户运行
:white_check_mark: 安装中文语言包和字体 glibc-langpack-zh, wqy-zenhei-fonts 或思源系列
:white_check_mark: 检查并修复 Python 警告 设置 PYTHONHOME 环境变量或忽略(除非使用宏)
:white_check_mark: 增加 JodConverter 超时时间 至少设为 5~10 分钟
:white_check_mark: 使用调试日志排查 启用 JodConverter 的 DEBUG 日志输出

:pushpin: 附加建议:使用 Docker 统一环境(参考知识库)

您可以参考知识库中 wushifeng 提供的 Docker 构建方案(来自 Document Chunk 2),确保所有依赖打包一致:

FROM hub.oepkgs.net/openeuler/openeuler:24.03-lts

# 安装基础依赖
RUN dnf install -y fontconfig-devel cups java-1.8.0-openjdk glibc-langpack-zh && \
    dnf clean all

# 生成 zh_CN.UTF-8 locale
RUN localedef -i zh_CN -f UTF-8 zh_CN.UTF-8

# 安装中文字体
ADD ./SourceHanSerifCN.zip /usr/share/fonts/
RUN unzip /usr/share/fonts/SourceHanSerifCN.zip -d /usr/share/fonts/ && \
    rm /usr/share/fonts/SourceHanSerifCN.zip && \
    fc-cache -fv

# 安装 LibreOffice
ADD LibreOffice_24.8.3_Linux_x86-64_rpm.tar.gz /opt/office/
RUN rpm -ivh /opt/office/LibreOffice_24.8.3.2_Linux_x86-64_rpm/RPMS/*.rpm && \
    rm -rf /opt/office

# 设置时区与环境变量
ENV LC_ALL=zh_CN.UTF-8 LANG=zh_CN.UTF-8
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 启动 headless server
CMD ["/opt/libreoffice24.8/program/soffice", "--headless", "--accept=socket,host=0.0.0.0,port=8100;urp;", "--nofirststartwizard"]

此方式能最大程度保证环境一致性和可移植性。


:end_arrow: 结论

您的问题是典型的 “命令行可用但 Java 接口超时” 场景。根本原因很可能在于:

:cross_mark: LibreOffice 未真正处于稳定监听状态,或
:cross_mark: 缺少字体/语言包导致文档处理阻塞,或
:cross_mark: Java 与 LibreOffice 权限/用户空间不一致

:white_check_mark: 建议操作顺序

  1. 验证 LibreOffice 是否通过 --accept 指令监听端口;
  2. 安装 glibc-langpack-zh 和中文字体;
  3. 确保 Java 与 office 进程同用户运行;
  4. 增加 JodConverter 超时时间;
  5. 使用 Docker 封装测试,排除环境差异。

:pushpin: 如需进一步调试,建议开启 JodConverter 的 DEBUG 日志,并观察 LibreOffice 进程的 CPU/内存占用及日志输出(可重定向到文件)。

如您提供更多 Java 初始化代码或 soffice 启动命令,可进一步精准诊断。