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



我正试图使用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"));
}

我认为这与不正确导入现有SlideLayout有关。是否有人有将现有幻灯片(带有自定义布局(导入/复制到新演示文稿的经验?

如果能分享我的想法/例子/提示,我将不胜感激。

谢谢!

Paul

问题是图像是单独存储的,需要添加为关系并使用相应的relId进行引用。

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

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