使用Apache POI转换Docx到PDF时遇ST_Jc枚举值无效错误求助
解决Apache POI转换Docx到PDF时的XmlValueOutOfRangeException错误
这个错误我之前也碰到过,本质是你用的旧版本Apache POI(3.15)和XWPF转换器不支持Word文档里用到的对齐方式枚举值end——在OOXML规范中,ST_Jc枚举定义了文本对齐的合法值,旧版本POI没把end纳入支持范围,导致解析时抛出异常。结合你的场景,给你几个可行的解决方案:
1. 升级依赖版本(最推荐)
Apache POI 3.15是2016年的旧版本,对后续Word新增的格式支持不足,建议升级到较新的稳定版,同时匹配对应的XWPF转换器版本:
推荐的依赖配置(适配POI 4.1.2)
<!-- Apache POI核心依赖 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratchpad</artifactId> <version>4.1.2</version> </dependency> <!-- XWPF转换器依赖(匹配POI 4.x) --> <dependency> <groupId>fr.opensagres.xdocreport</groupId> <artifactId>org.apache.poi.xwpf.converter.core</artifactId> <version>2.0.2</version> </dependency> <dependency> <groupId>fr.opensagres.xdocreport</groupId> <artifactId>org.apache.poi.xwpf.converter.pdf</artifactId> <version>2.0.2</version> </dependency>
升级后,新版本POI的ST_Jc枚举已经包含end等更多对齐值,能正确解析你的文档。
2. 检查并修改Word文档的对齐格式
如果暂时不想升级依赖,可以尝试排查文档中的特殊对齐设置:
- 打开待转换的Docx文件,检查所有段落、表格单元格的对齐方式,把非常规的对齐(比如可能被标记为
end的右对齐变体)改成POI 3.15支持的标准类型(左对齐、居中、右对齐、两端对齐) - 保存文档后重新尝试转换,看是否能绕过枚举值错误
3. 手动修复Docx中的无效XML
如果文档是自动生成或被修改过,可能存在不符合OOXML规范的枚举值:
- 将Docx文件重命名为
.zip并解压 - 打开
word/document.xml文件,搜索包含<w:jc w:val="end"/>的标签 - 将
end替换为POI 3.15支持的有效值,比如right(对应右对齐) - 重新打包所有文件为zip,再改回
.docx后缀,然后执行转换
另外,你的转换代码可以稍微优化一下,确保资源正确关闭(用try-with-resources语法):
try (FileInputStream in = new FileInputStream(inputFile); XWPFDocument document = new XWPFDocument(in); OutputStream out = new FileOutputStream(outputFile)) { PdfOptions options = PdfOptions.create(); PdfConverter.getInstance().convert(document, out, options); } catch (IOException | XWPFConverterException e) { e.printStackTrace(); }
内容的提问来源于stack exchange,提问作者kirti
相关产品推荐
相关产品推荐

