You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Docx4j转换DOCX到PDF时遭遇StringIndexOutOfBoundsException异常

问题分析

从异常栈信息可以明确,问题并非字体映射导致,而是DOCX文档中存在格式非法的语言(Lang)属性,触发了org.docx4j.model.properties.run.Lang.setXslFO方法中的字符串索引越界错误——代码尝试从长度为2的字符串中截取begin 0, end -1的子串,说明文档内的语言代码为空、格式不符合标准(如缺少地区码且逻辑处理错误)或包含无效字符。

解决方案

1. 修复源DOCX文件的语言设置

打开异常对应的DOCX文件,统一修正语言配置:

  • 全选文档内容,右键打开「字体」设置面板,检查「语言」选项,设置为合法的标准语言代码(如zh-CN、en-US),避免留空或使用无效值。
  • 也可通过Word「审阅」选项卡→「语言」功能,统一设置文档默认语言。

2. 代码层面拦截非法Lang属性

若无法修改源文件,可在加载文档后主动清理非法的Lang属性:

// 加载文档后执行此段代码
MainDocumentPart mainPart = wordMlPackage.getMainDocumentPart();
// 遍历所有文本Run元素
List<Object> runs = mainPart.getJAXBNodesViaXPath("//w:r", false);
for (Object runObj : runs) {
    if (runObj instanceof R run) {
        RPr rPr = run.getRPr();
        if (rPr != null && rPr.getLang() != null) {
            String langVal = rPr.getLang().getVal();
            // 过滤空值、长度不足2的非法语言代码
            if (langVal == null || langVal.trim().length() < 2) {
                rPr.setLang(null);
            }
        }
    }
}

3. 升级Docx4j版本

该问题可能是Docx4j的已知bug,尝试升级至最新稳定版(如3.3.7及以上),新版本大概率修复了Lang属性的解析逻辑漏洞。

验证步骤
  1. 应用上述任一方案后重新执行转换代码。
  2. 若异常消失,说明问题已解决;若仍报错,需排查文档中是否存在其他格式非法的元素。

内容的提问来源于stack exchange,提问作者user18336444

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 00:31:15