如何使用java api合并两个包含图表和表的pptx文件?

时间:2017-02-02 16:06:10

标签: java apache-poi docx4j

我试过通过java API(Apache POI)合并两个pptx文件 它适用于只有文本内容的PPTX。

我需要帮助合并两个PPTX文件而不会丢失图表,表格,图像,主题等。是否有任何开源Java API-s?

2 个答案:

答案 0 :(得分:0)

披露:我为Plutext工作

Plutext的Docx4j企业版可以合并复杂的演示文稿。您可以决定输出是否具有第一个pptx的外观,或者保留输入的单个外观。简单的用法是这样的:

    String[] deck = {"deck1.pptx", "deck2.pptx"};               

    PresentationBuilder builder = new PresentationBuilder();            
    builder.setThemeTreatment(ThemeTreatment.RESPECT); // preserve appearance of each deck?

    for (int i=0 ; i< deck.length; i++) {

        // Create a SlideRange representing the slides in this pptx
        SlideRange sr = new SlideRange(
                (PresentationMLPackage)OpcPackage.load(
                                        new File(DIR_IN + deck[i])));

        // Add the slide range to the output
        builder.addSlideRange(sr);

    }

    builder.getResult().save(
            new File("OUT_MergeWholePresentations.pptx"));

Docx4j Enterprise Ed是一种商业产品。我不知道开源解决方案可以通过高级API提供您想要的解决方案。与POI一样,您可以使用开源docx4j / pptx4j的低级API实现您自己想要的功能,但要做到这一点,您需要对pptx文件格式和pptx4j有一个正确的理解。 (docx4j / pptx4j使用JAXB; POI使用XML Bean)

答案 1 :(得分:0)

Apache POI建议以下内容:

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;

public class MergingMultiplePresentations {

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

        //creating empty presentation
        XMLSlideShow ppt = new XMLSlideShow();

        //taking the two presentations that are to be merged
        String file1 = "presentation1.ppt";
        String file2 = "presentation2.ppt";
        String[] inputs = {file1, file2};

        for (String arg : inputs) {

            InputStream inputstream = MergingMultiplePresentations.class.getClassLoader().getResourceAsStream(arg);
            XMLSlideShow src = new XMLSlideShow(inputstream);

            for (XSLFSlide srcSlide : src.getSlides()) {
                //merging the contents
                ppt.createSlide().importContent(srcSlide);
            }
        }

        String file3 = "combinedpresentation.ppt";

        //creating the file object
        FileOutputStream out = new FileOutputStream(file3);

        // saving the changes to a file
        ppt.write(out);
        System.out.println("Merging done successfully");
        out.close();
    }
}

在合并过程中某些内容可能会丢失。同样,在某些情况下,它的行为也确实很容易出错。它可能会因org.apache.xmlbeans.impl.values.XmlValueOutOfRangeException而失败,然后,如果您使用Microsoft PPT从资源管理器中打开ppt文件,则在合并之前,请对其进行任何更改,保存文件,然后进行合并,效果很好。