我试图将图像设置为已存在(具有空白背景)并具有一些组件(文本和图像)的特定幻灯片的背景,但在打开使用 apache poi 创建的 ppt 时出现错误。这是ppt参考:
我的代码基于另一个 stackoverflow 响应,但出现错误
XMLSlideShow slideShow = new XMLSlideShow(new FileInputStream("test.pptx"));
byte[] picData = IOUtils.toByteArray(new FileInputStream("image.jpg"));
XSLFPictureData pcData = slideShow.getSlides().get(0).getSlideShow().addPicture(picData, PictureData.PictureType.JPEG);
CTBackgroundProperties backgroundProperties = slideShow.getSlides().get(0).getXmlObject().getCSld().addNewBg().addNewBgPr();
CTBlipFillProperties blipFillProperties = backgroundProperties.addNewBlipFill();
CTRelativeRect ctRelativeRect = blipFillProperties.addNewStretch().addNewFillRect();
String idx = slideShow.getSlides().get(0).addRelation(null, XSLFRelation.IMAGES, pcData).getRelationship().getId();
CTBlip blib = blipFillProperties.addNewBlip();
blib.setEmbed(idx);
try (FileOutputStream fileOut = new FileOutputStream("test.pptx")) {
slideShow.write(fileOut);
}
谢谢您的回答。
在你的代码中
CTBackgroundProperties backgroundProperties = slideShow.getSlides().get(0).getXmlObject().getCSld().addNewBg().addNewBgPr();
始终向幻灯片添加新背景 (
Bg
)。对于新创建的幻灯片来说这很好。但现有的幻灯片可能已经有背景设置。然后,在该代码行之后,它将有两个背景设置。这是不允许的。
因此,如果需要更改现有幻灯片的背景设置,则应首先取消旧的背景设置,然后再添加新的背景设置。
您的情况:
...
if (slideShow.getSlides().get(0).getXmlObject().getCSld().isSetBg()) {
slideShow.getSlides().get(0).getXmlObject().getCSld().unsetBg();
}
CTBackgroundProperties backgroundProperties = slideShow.getSlides().get(0).getXmlObject().getCSld().addNewBg().addNewBgPr();
...