【问题标题】:org.apache.poi.xslf.usermodel send image behind the textorg.apache.poi.xslf.usermodel 发送图片后面的文字
【发布时间】:2020-03-28 23:36:45
【问题描述】:

我正在制作一个应用程序,它将创建一个幻灯片放映。 我设法在每张幻灯片上放一张图片,但它覆盖了书面文字。 怎么把文字放在图片前面?

这是我的代码。


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();
    }

这些是我的依赖项

<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

【问题讨论】:

    标签: java image netbeans apache-poi powerpoint


    【解决方案1】:

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

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

    例子:

    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();
     }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 2022-01-20
      • 1970-01-01
      • 2022-10-18
      • 1970-01-01
      • 2021-01-07
      • 1970-01-01
      相关资源
      最近更新 更多