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

Apache POI PPT项目抛出java.lang.IllegalArgumentException异常求助

Apache POI PPT 中 accessExternalDTD 属性不支持异常分析与解决

异常本质

这是非致命性警告/异常,POI的XMLHelper.trySet方法会捕获该异常并继续执行后续逻辑,因此代码仍能正常运行。

问题原因

POI处理XML时尝试设置XML安全属性http://javax.xml.XMLConstants/property/accessExternalDTD(JDK 1.8u191+引入的安全配置,用于控制外部DTD访问),但当前项目使用的TransformerFactory实现是org.docx4j.org.apache.xalan.processor.TransformerFactoryImpl(docx4j打包的旧版Xalan),该版本未实现对该属性的支持,因此抛出IllegalArgumentException。

解决方案

1. 升级或替换Xalan依赖

排除docx4j引入的旧版Xalan,改用支持该属性的版本或JDK内置的TransformerFactory:

<!-- Maven依赖排除示例 -->
<dependency>
    <groupId>org.docx4j</groupId>
    <artifactId>docx4j-core</artifactId>
    <version>你的版本号</version>
    <exclusions>
        <exclusion>
            <groupId>org.apache.xalan</groupId>
            <artifactId>xalan</artifactId>
        </exclusion>
    </exclusions>
</dependency>

排除后,JVM会自动使用内置的TransformerFactory实现,该实现支持accessExternalDTD属性。

2. 强制指定JDK内置TransformerFactory

在代码启动初期设置系统属性:

System.setProperty("javax.xml.transform.TransformerFactory", 
    "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl");

或者通过JVM启动参数指定:

-Djavax.xml.transform.TransformerFactory=com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl

3. 忽略警告(不影响功能时可选)

若不想调整依赖或代码,可将org.apache.poi.util.XMLHelper的日志级别设为ERROR,避免打印该警告信息。

异常日志

10:46:45.903 [main] DEBUG org.apache.poi.openxml4j.opc.ZipPackage - Save content types part
10:46:45.927 [main] WARN org.apache.poi.util.XMLHelper - SAX Feature unsupported [log suppressed for 5 minutes]http://javax.xml.XMLConstants/property/accessExternalDTD
java.lang.IllegalArgumentException: Not supported: http://javax.xml.XMLConstants/property/accessExternalDTD
    at org.docx4j.org.apache.xalan.processor.TransformerFactoryImpl.setAttribute(TransformerFactoryImpl.java:571)
    at org.apache.poi.util.XMLHelper.trySet(XMLHelper.java:284)
    at org.apache.poi.util.XMLHelper.getTransformerFactory(XMLHelper.java:224)
    at org.apache.poi.util.XMLHelper.newTransformer(XMLHelper.java:231)
    at org.apache.poi.openxml4j.opc.StreamHelper.saveXmlInStream(StreamHelper.java:56)
    at org.apache.poi.openxml4j.opc.internal.ZipContentTypeManager.saveImpl(ZipContentTypeManager.java:68)
    at org.apache.poi.openxml4j.opc.internal.ContentTypeManager.save(ContentTypeManager.java:450)
    at org.apache.poi.openxml4j.opc.ZipPackage.saveImpl(ZipPackage.java:554)
    at org.apache.poi.openxml4j.opc.OPCPackage.save(OPCPackage.java:1487)
    at org.apache.poi.ooxml.POIXMLDocument.write(POIXMLDocument.java:227)
    at com.iep.generator.PptCreater.createPpt(PptCreater.java:526)
    at com.iep.generator.PptCreater.main(PptCreater.java:94)
10:46:45.970 [main] DEBUG org.apache.poi.openxml4j.opc.ZipPackage - Save package relationships

注:即使出现该异常,代码仍能正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:50:12