依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.5</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.23.1</version>
</dependency>
代码实现
import org.apache.commons.io.IOUtils;
import org.apache.poi.sl.usermodel.PictureData;
import org.apache.poi.xslf.usermodel.*;
import java.awt.geom.Rectangle2D;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
/**
* 替换ppt模版中的图片,这里的ppt仅对于后缀为.pptx
* 此过程是将ppt模版中的所有图片替换为指定图片
* 操作是先删除原图片,再在原位置新增图片
*/
public class ReplacePPTImg {
public static void main(String[] args) {
//ppt模版存放的位置,这里的ppt仅对于后缀为.pptx
String filePath = "E:\\file\\测试模版.pptx";
File pptFile = new File(filePath);
//判断文件是否存在
if (!pptFile.exists()) {
return;
}
//读取ppt模版
try (FileInputStream fis = new FileInputStream(pptFile);
XMLSlideShow ppt = new XMLSlideShow(fis)) {
//获取ppt的张数
int pptSize = ppt.getSlides().size();
//循环遍历模版中的幻灯片
for (int i = 0; i < pptSize; i++) {
//获取幻灯片
XSLFSlide xslfSlide = ppt.getSlides().get(i);
//获取幻灯片中部分数
int shapeSize = xslfSlide.getShapes().size();
//循环遍历每张ppt中的各个部分
for (int j = 0; j < shapeSize; j++) {
//获取ppt中的部分
XSLFShape xslfShape = xslfSlide.getShapes().get(j);
//幻灯片内容的类型为图片类型
if (xslfShape instanceof XSLFPictureShape) {
//获取原ppt中图片的位置、大小
Rectangle2D rectangle2D = xslfShape.getAnchor();
//移除原图片
xslfSlide.removeShape(xslfShape);
//获取替换图片的二进制,两个方法都可以获取图片的二进制
byte[] picBytes = fileArrayOne();
// byte[] picBytes = fileArrayTwo();
//新增图片
XSLFPictureData pictureData = ppt.addPicture(picBytes, PictureData.PictureType.JPEG);
//创建图片
xslfShape = xslfSlide.createPicture(pictureData);
//设置图片位置
((XSLFPictureShape) xslfShape).setAnchor(rectangle2D);
}
}
}
//ppt的保存位置
String outPath = "E:\\file\\测试.pptx";
//输出ppt
FileOutputStream fos = new FileOutputStream(outPath);
ppt.write(fos);
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 得到图片的二进制
* 因为是在main方法中引用的此方法,所以要加static,具体情况具体分析
* @return
*/
public static byte[] fileArrayOne() {
//文件存放位置
String filePath = "E:\\file\\花花.jpg";
File file = new File(filePath);
byte[] fileArray = null;
try (FileInputStream fis = new FileInputStream(file)) {
fileArray = IOUtils.toByteArray(fis);
} catch (Exception e) {
e.printStackTrace();
}
return fileArray;
}
/**
* 得到图片的二进制
* 因为是在main方法中引用的此方法,所以要加static,具体情况具体分析
* @return
*/
public static byte[] fileArrayTwo() {
//文件存放位置
String filePath = "E:\\file\\花花.jpg";
File file = new File(filePath);
byte[] fileArray = null;
try (FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
byte[] bytes = new byte[1024];
int read;
while ((read = fis.read(bytes)) != -1) {
baos.write(bytes, 0, read);
}
//得到的文件二进制
fileArray = baos.toByteArray();
} catch (Exception e) {
e.printStackTrace();
}
return fileArray;
}
}