如何使用JAVA Apache POI为PowerPoint的每张幻灯片的背景设置不同的图像?

时间:2019-04-26 13:31:27

标签: java apache background apache-poi powerpoint

我试图创建一个幻灯片,并为幻灯片的每张幻灯片设置不同的图像作为背景。不幸的是,即使我成功通过图像更改了Powerpoint的背景,我的背景也始终是循环的最后一个图像。

在代码中,每个图像的名称都为'image('i')',其中i为图像编号,我希望第一个图像作为第一张幻灯片的背景,第二个图像为第二张幻灯片的背景,等等...

如果有人可以帮助我,请。 谢谢

//Find number of slides to create
int nbSlide = new File(directoryScreen).listFiles().length;
//creating a new empty slide show
XMLSlideShow ppt = new XMLSlideShow();
XSLFSlideMaster slideMaster = ppt.getSlideMasters().get(0);
List<XSLFSlideLayout> slides = new ArrayList<XSLFSlideLayout>();
for(int i=1; i<=nbSlide; i++) 
   XSLFPictureData pd = ppt.addPicture(new 
   File(directoryScreen+"\\image"+i+".png"), PictureType.PNG);
   XSLFSlideLayout slidelayout = slideMaster.getLayout(SlideLayout.BLANK);
   XSLFPictureShape ps = slidelayout.createPicture(pd);
   ps.setAnchor(new Rectangle2D.Double(0, 0, 960, 540));
   slides.add(slidelayout);
}
for(int i=0; i<nbSlide; i++) {
   XSLFSlide sl = ppt.createSlide(slides.get(i));
}

1 个答案:

答案 0 :(得分:0)

您对代码所做的操作不是在设置背景图片,而是在始终名为“空白”的同一幻灯片布局上设置图片形状。幻灯片母版仅提供一个名为“空白”的幻灯片版式,因此slideMaster.getLayout(SlideLayout.BLANK)始终获得相同的一个幻灯片版式。

当确实需要为幻灯片设置背景图片时,必须使用幻灯片的背景属性来完成。

示例:

import java.io.FileOutputStream;
import java.io.FileInputStream;

import org.apache.poi.xslf.usermodel.*;
import org.apache.poi.sl.usermodel.*;

import org.openxmlformats.schemas.presentationml.x2006.main.*;
import org.openxmlformats.schemas.drawingml.x2006.main.*;

import java.awt.Dimension;

public class CreatePPTXSheetsDifferentBackgroundPictures {

 public static void main(String[] args) throws Exception {

  XMLSlideShow slideShow = new XMLSlideShow();
  XSLFPictureData[] pictureDatas = new XSLFPictureData[]{
   slideShow.addPicture(new FileInputStream("Hydrangeas.jpg"), PictureData.PictureType.JPEG),
   slideShow.addPicture(new FileInputStream("Desert.jpg"), PictureData.PictureType.JPEG),
   slideShow.addPicture(new FileInputStream("Chrysanthemum.jpg"), PictureData.PictureType.JPEG)
  };

  // s slides, each having one different background picture out of pictureDatas array
  for (int s = 0; s < pictureDatas.length; s++ ) {
   XSLFSlide slide = slideShow.createSlide();
   CTBackgroundProperties backgroundProperties = slide.getXmlObject().getCSld().addNewBg().addNewBgPr();
   CTBlipFillProperties blipFillProperties = backgroundProperties.addNewBlipFill();
   CTRelativeRect ctRelativeRect = blipFillProperties.addNewStretch().addNewFillRect();
   String idx = slide.addRelation(null, XSLFRelation.IMAGES, pictureDatas[s]).getRelationship().getId();
   CTBlip blib = blipFillProperties.addNewBlip();
   blib.setEmbed(idx);
  }

  FileOutputStream out = new FileOutputStream("CreatePPTXSheetsDifferentBackgroundPictures.pptx");
  slideShow.write(out);
  out.close();
 }
}

这与使用PowerPointFormat Background的GUI所做的相同。

每个不同的幻灯片布局还具有背景属性。因此,还可以在不同的幻灯片布局上设置背景属性。每个幻灯片母版可以在所有SlideLayout中使用不同的幻灯片布局。如果完成,则将在使用该幻灯片布局的所有幻灯片上自动使用该背景。