Как установить различное изображение для фона каждого слайда PowerPoint, используя JAVA Apache POI? - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь создать powerpoint и установить другое изображение в качестве фона для каждого слайда моей powerpoint.К сожалению, даже если мне удастся изменить фон моего powerpoint с помощью изображения, мой фон всегда будет последним изображением цикла.

В коде каждое изображение имеет имя 'image (' 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 голосов
/ 27 апреля 2019

То, что вы делаете с вашим кодом, это не установка фоновых изображений, а установка форм изображения на всегда одном и том же макете слайда с именем «Пустой». Мастер слайдов предоставляет только один макет слайда с именем «Пустой», поэтому 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();
 }
}

Это то же самое, что делает PowerPoint GUI, когда используется Format Background.

Каждый отдельный макет слайда также имеет свойства фона. Таким образом, свойства фона также могут быть установлены на разных макетах слайдов. Различные макеты слайдов могут быть по одному из всех возможных SlideLayout на мастер слайдов. Если все сделано, то этот фон автоматически используется на всех слайдах, которые используют этот макет слайда.

...