使用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属性的解析逻辑漏洞。
验证步骤
- 应用上述任一方案后重新执行转换代码。
- 若异常消失,说明问题已解决;若仍报错,需排查文档中是否存在其他格式非法的元素。
内容的提问来源于stack exchange,提问作者user18336444
相关产品推荐
相关产品推荐

