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

标签 java 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));
}

最佳答案

您使用代码所做的不是设置背景图片,而是在名为“空白”的始终相同的幻灯片布局上设置图片形状。幻灯片母版仅提供一种名为“Blank”的幻灯片布局,因此 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 所做的相同。

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

关于java - 如何使用JAVA Apache POI为powerpoint的每张幻灯片的背景设置不同的图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55868740/

相关文章:

java - 为什么我的 FPS 下降?

java - 解析 hh :mmaa format 中的简单时间

background - PyQt - 透明背景

android - 使用渐变创建九 (9) 个补丁 png 文件

java - Apache POI XWPF 添加形状到标题

java - 使用 swagger 从 .json 文件生成 java 中的 Rest api

java - 如何在 java.lang.Long 值上使用通配符 (%) 搜索

Bash:如何从 env var 运行命令并在进程名称中显示其值

eclipse - 由于只读属性,在 tomcat 安装基础中分配临时目录导致错误

Java Apache Poi,如何同时设置背景颜色和边框