首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >org.apache.poi.xslf.usermodel发送文本后面的图像

org.apache.poi.xslf.usermodel发送文本后面的图像
EN

Stack Overflow用户
提问于 2020-03-29 07:36:46
回答 1查看 260关注 0票数 0

我正在制作一个应用程序,将创建一个电源点幻灯片放映。我设法在每张幻灯片上都放了一张图片,但它覆盖了文字。如何将文本放在图像前面?

这是我的代码。

代码语言:javascript
复制
public void createNewSlide() throws FileNotFoundException, IOException{
        XMLSlideShow ppt = new XMLSlideShow();

        XSLFSlideMaster master = ppt.getSlideMasters().get(0);
        XSLFSlideLayout layout = master.getLayout(SlideLayout.TITLE_ONLY);

        //propiedades do slide
        ppt.setPageSize(new Dimension(1280,720));
        XSLFSlide slide = ppt.createSlide(layout);

        //primeiro slide, começando com texto
        XSLFTextShape title = slide.getPlaceholder(0);
        title.clearText();
        XSLFTextParagraph paragraph = title.addNewTextParagraph();
        XSLFTextRun textRun = paragraph.addNewTextRun();
        textRun.setText("Simple Text");
        textRun.setFontColor(Color.decode("#00ff99"));
        textRun.setFontSize(60.);
        title.setAnchor(new Rectangle(100,100,500,500));

        //adicionando imagem ao ppt
        byte[] picData = IOUtils.toByteArray(new FileInputStream("espace.jpg"));
        XSLFPictureData pcData = ppt.addPicture(picData, PictureData.PictureType.JPEG);
        XSLFPictureShape pictureShape = slide.createPicture(pcData);
        pictureShape.setAnchor(new Rectangle(0,0,1280,720));



        FileOutputStream out = new FileOutputStream("AprentacaoTeste.pptx");
        ppt.write(out);
        out.close();
        ppt.close();
    }

这些是我的依赖项

代码语言:javascript
复制
<dependencies>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.0.1</version>
        </dependency>
    </dependencies>

我使用netbeans作为IDE

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-29 15:10:08

插入的图片是形状树中的最后一个形状。因此它位于形状树中所有其他形状的前面。它必须是形状树中的第一个形状,才能位于所有其他形状的后面。但是,如果已经添加了形状,则很难改变形状树的顺序。并且在添加其他形状之前,占位符已经存在于布局中。

但是我认为,你要做的就是给幻灯片设置一个背景图片。到目前为止,这也只能使用底层的ooxml-schemas类来实现。但它比改变形状树的顺序简单得多。

示例:

代码语言:javascript
复制
import java.io.FileOutputStream;
import java.io.FileInputStream;

import org.apache.poi.util.IOUtils;
import org.apache.poi.sl.usermodel.PictureData;
import org.apache.poi.xslf.usermodel.*;

import org.openxmlformats.schemas.presentationml.x2006.main.CTBackgroundProperties;
import org.openxmlformats.schemas.drawingml.x2006.main.CTBlipFillProperties;
import org.openxmlformats.schemas.drawingml.x2006.main.CTRelativeRect;
import org.openxmlformats.schemas.drawingml.x2006.main.CTBlip;

import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Color;

public class CreatePPTXPictureBehindText {

 static void setBackgroundPicture(XSLFSlide slide, String picturePath, PictureData.PictureType pictureType) throws Exception {
  byte[] picData = IOUtils.toByteArray(new FileInputStream(picturePath));
  XSLFPictureData pcData = slide.getSlideShow().addPicture(picData, pictureType);
  CTBackgroundProperties backgroundProperties = slide.getXmlObject().getCSld().addNewBg().addNewBgPr();
  CTBlipFillProperties blipFillProperties = backgroundProperties.addNewBlipFill();
  CTRelativeRect ctRelativeRect = blipFillProperties.addNewStretch().addNewFillRect();
  String idx = slide.addRelation(null, XSLFRelation.IMAGES, pcData).getRelationship().getId();
  CTBlip blib = blipFillProperties.addNewBlip();
  blib.setEmbed(idx);
 }

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

  XMLSlideShow ppt = new XMLSlideShow();

  //set page size
  ppt.setPageSize(new Dimension(1280,720));

  //create first slide title layout
  XSLFSlideMaster master = ppt.getSlideMasters().get(0);
  XSLFSlideLayout layout = master.getLayout(SlideLayout.TITLE_ONLY);
  XSLFSlide slide = ppt.createSlide(layout);

  //set title placeholder's text and anchor
  XSLFTextShape title = slide.getPlaceholder(0);
  title.clearText();
  XSLFTextParagraph paragraph = title.addNewTextParagraph();
  XSLFTextRun textRun = paragraph.addNewTextRun();
  textRun.setText("Simple Text");
  textRun.setFontColor(Color.decode("#00ff99"));
  textRun.setFontSize(60.);
  title.setAnchor(new Rectangle(100,100,500,500));

  //set background picture for slide
  setBackgroundPicture(slide, "./espace.jpeg", PictureData.PictureType.JPEG);

  FileOutputStream out = new FileOutputStream("./AprentacaoTeste.pptx");
  ppt.write(out);
  out.close();
  ppt.close();
 }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60908372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档