bug描述: ppt模板中包含多张图片,用poi方法替换图片时,替换后所有图片都是同一张图片。
bug原因:ppt模板中的多张图片就是相同。
bug解决: ppt模板中插入不同的图片即可。 核心代码:
/**
* @param inputStream 模版ppt的输入流
* @param replacementMap 需要替换的文字,格式为{ "{{标题}}": "真正的标题" }
* @return 替换后的ppt流
*/
public InputStream replaceTextInPPT(InputStream inputStream, Map<String, Object> replacementMap) throws IOException {
//创建Presentation对象
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
// 创建 SlideShow 对象
SlideShow slideShow = new XMLSlideShow(inputStream);
// 遍历所有幻灯片
for (Object slideObj : slideShow.getSlides()) {
Slide slide = (Slide) slideObj;
// 遍历幻灯片中的所有形状
List<Shape> shapes = slide.getShapes();
List<Shape> delShapes = new ArrayList<>();
for (Shape shape : shapes) {
if (shape instanceof PictureShape) {
String shapeName = shape.getShapeName();
XSLFPictureShape pictureShape = (XSLFPictureShape) shape;
byte[] bytes = null;
// TODO 这是是获取图片的逻辑
if (bytes != null) {
pictureShape.getPictureData().setData(bytes);
} else {
delShapes.add(shape);
}
}
}
for (Shape delShape : delShapes) {
slide.removeShape(delShape);
}
}
// 保存修改到输出流
slideShow.write(outputStream);
return new ByteArrayInputStream(outputStream.toByteArray());
} catch (IOException e) {
log.error("PPTX填充失败", e);
}
}
有问题的PPT模板(这里的图片不能相同,否则提换后也都是同一张):