使用Apache POI删除PPTX幻灯片保存时触发partName错误及排查
Apache POI 5.2.2 删除PPTX幻灯片后保存触发IllegalArgumentException问题
我使用Apache POI 5.2.2处理PPTX文件,执行加载文件、删除指定幻灯片子集、保存的操作。最初的伪代码如下:
XMLSlideShow s = load(blah); s.removeSlide(15); s.removeSlide(14); s.removeSlide(13); s.removeSlide(12); s.removeSlide(10); // 更多删除操作... s.save(some stream);
但部分PPTX文件在执行removeSlide操作后,保存时触发以下错误(删除操作本身无报错):
Caused by: java.lang.IllegalArgumentException: partName at org.apache.poi.openxml4j.opc.OPCPackage.removePart(OPCPackage.java:979) at org.apache.poi.openxml4j.opc.PackagePart.getOutputStream(PackagePart.java:526) at org.apache.poi.xslf.usermodel.XSLFSheet.commit(XSLFSheet.java:415) at org.apache.poi.ooxml.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:467) at org.apache.poi.ooxml.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:472) at org.apache.poi.ooxml.POIXMLDocument.write(POIXMLDocument.java:221)
我推测问题与OPC部件/关系损坏有关,但无法定位具体原因和解决方法。问题表现不一致,比如出错的幻灯片仅包含一个简单文本块,母版带有图片但幻灯片本身无其他额外内容。
更新
后续排查发现实际代码逻辑存在克隆步骤,伪代码如下:
XMLSlideShow input = load(blah); XMLSlideShow s = new XMLSlideShow(input.getPackage()); s.removeSlide(15); s.removeSlide(14); s.removeSlide(13); s.removeSlide(12); s.removeSlide(10); // 更多删除操作... s.save(some stream);
看起来通过传入原OPCPackage构造新的XMLSlideShow进行克隆的过程中,可能遗漏了某些关键内容。如果移除克隆步骤,直接操作原XMLSlideShow对象执行删除并保存,可以避免报错,但会导致包中遗留孤立的幻灯片定义和图片文件(不过PPTX仍可正常打开并显示预期的幻灯片子集)。
请问是否有人遇到过该问题,或能提供可稳定解决此问题的方案?
内容的提问来源于stack exchange,提问作者Captain Caveman
相关产品推荐
相关产品推荐

