Java 使用docx4j将现有幻灯片插入新的pptx演示文稿

Java 使用docx4j将现有幻灯片插入新的pptx演示文稿,java,powerpoint,docx4j,Java,Powerpoint,Docx4j,我正在尝试使用docx4j将pptx演示文稿拆分为一组单幻灯片演示文稿。因此,我尝试插入一张从现有演示文稿中提取的现有幻灯片,并将其插入新创建的演示文稿中 到目前为止,我有以下代码可以运行并创建拆分的pptx文件。但是,输出文件已损坏,并且缺少图像 // load existing presentation from where slide will be extracted PresentationMLPackage presentationMLPackage = PresentationM

我正在尝试使用docx4j将pptx演示文稿拆分为一组单幻灯片演示文稿。因此,我尝试插入一张从现有演示文稿中提取的现有幻灯片,并将其插入新创建的演示文稿中

到目前为止,我有以下代码可以运行并创建拆分的pptx文件。但是,输出文件已损坏,并且缺少图像

// load existing presentation from where slide will be extracted 
PresentationMLPackage presentationMLPackage = PresentationMLPackage.load(new FileInputStream("data/input/" + inFileName + ".pptx"));        
MainPresentationPart mpp = presentationMLPackage.getMainPresentationPart();

for(int i=0; i<mpp.getSlideCount(); i++) {

    // extract slide
    SlidePart sp = mpp.getSlide(i);
    Sld spContent = sp.getContents();

    // extract layout
    String sourceLayoutXml = sp.getSlideLayoutPart().getXML();
    String sourceMasterXml = sp.getSlideLayoutPart().getSlideMasterPart().getXML();

    // create new ppt
    PresentationMLPackage newPpt = PresentationMLPackage.createPackage(); // TODO: other than landscape, 16x9?

    MainPresentationPart mppNewPpt = (MainPresentationPart)newPpt.getParts().getParts().get(
                new PartName("/ppt/presentation.xml"));
    SlideLayoutPart layoutPart = (SlideLayoutPart)newPpt.getParts().getParts().get(
                new PartName("/ppt/slideLayouts/slideLayout1.xml"));

    layoutPart.setContents(
                (SldLayout)XmlUtils.unmarshalString(sourceLayoutXml, Context.jcPML));

    SlideMasterPart masterPart = layoutPart.getSlideMasterPart();
    masterPart.setContents(
                    (SldMaster)XmlUtils.unmarshalString(sourceMasterXml, Context.jcPML));

    // create new blank slide
    SlidePart slidePart = new SlidePart();

    // set content from extracted slide
    slidePart.setContents(spContent);

    // add slide to presentation
    mppNewPpt.addSlide(0, slidePart);

    // set slide layout part for new slide
    slidePart.addTargetPart(layoutPart);

    // save new ppt
    newPpt.save(new FileOutputStream(outDir + "/" + inFileName + "_slide_" + i + ".pptx"));
}
//从提取幻灯片的位置加载现有演示文稿
PresentationMLPackage PresentationMLPackage=PresentationMLPackage.load(新文件输入流(“data/input/”+inFileName+“.pptx”));
MainPresentationPart mpp=PresentationLPackage.getMainPresentationPart();

对于(int i=0;i而言,问题在于图像是单独存储的,需要作为关系添加,并使用相应的relId引用

“穷人”的方法是克隆现有的pptx(OpcPackage clone()),然后删除您不想要的幻灯片。这样做,输出的pptx文件可能仍然包含您不需要的对象(您需要尝试并查看)

否则,您可以使用我们的商业MergePptx组件(Docx4j Enterprise的一部分)