当前位置: 首页 > 知识库问答 >
问题:

阿帕奇 POI - 合并 pptx 时出错

温镜
2023-03-14

我有一个场景,我需要从pptx (source.pptx)中复制一些幻灯片,并根据幻灯片中的演示笔记将其下载为单独的pptx文件(output.pptx)。我正在使用apache poi来实现它。这是我的代码。

String filename = filepath+"\\source.pptx";
    try {
        XMLSlideShow ppt = new XMLSlideShow(new FileInputStream(filename));
        XMLSlideShow outputppt = new XMLSlideShow();
        XSLFSlide[] slides = ppt.getSlides();

        for (int i = 0; i < slides.length; i++) {
            try {
                XSLFNotes mynotes = slides[i].getNotes();
                for (XSLFShape shape : mynotes) {
                    if (shape instanceof XSLFTextShape) {
                        XSLFTextShape txShape = (XSLFTextShape) shape;
                        for (XSLFTextParagraph xslfParagraph : txShape.getTextParagraphs()) {
                            if (xslfParagraph.getText().equals("NOTES1") || xslfParagraph.getText().equals("NOTES2")) {
                                outputppt.createSlide().importContent(slides[i]);
                            }

                        }
                    }
                }
            } catch (Exception e) {

            }

        }
        FileOutputStream out = new FileOutputStream("output.pptx");
        outputppt.write(out);
        out.close();
    } catch (Exception e) {
        e.printStackTrace();
    }

当我打开创建的output.pptx时,我收到以下错误:“PowerPoint发现output.pptx中的内容有问题,PowerPoint可以尝试修复演示文稿。如果您信任此演示文稿的来源,请单击修复。”

单击“修复”后:“PowerPoint删除了merged.pptx中不可读的内容[已修复]。您应该检查此演示文稿,以确定是否有任何内容被意外更改或删除”,我可以看到带有“单击以添加标题”和“单击以添加副标题”的空白幻灯片

有什么建议可以解决这个问题吗?

共有2个答案

厉坚
2023-03-14

在一些文本框为空的情况下,我也遇到了同样的错误。通过在创建幻灯片时总是在所有占位符中设置空文本解决了这个问题。

XSLFSlide slide = presentation.createSlide(slideMaster.getLayout(layout));
// remove any placeholder texts
for (XSLFTextShape ph : slide.getPlaceholders()) {
  ph.clearText();
  ph.setText("");
}
海宁
2023-03-14

此代码适用于我复制幻灯片内容,布局和注释。如果您想遵循原始问题,只需根据需要修改代码即可。我假设你很简单, 必须:

> < li >不从源幻灯片导入幻灯片内容 < li>

将注释内容复制到幻灯片中

    // get the layout from the source slide
    XSLFSlideLayout layout = srcSlide.getSlideLayout();
    XSLFSlide newslide = ppt
        .createSlide(defaultMaster.getLayout(layout.getType()))
        .importContent(srcSlide);
    XSLFNotes srcNotes = srcSlide.getNotes();
    XSLFNotes newNotes = ppt.getNotesSlide(newslide);
    newNotes.importContent(srcNotes);
 类似资料:
  • Powerpoint幻灯片具有可通过VBA访问和修改的内部名称。参见例如Powerpoint:手动设置幻灯片名称 我想通过apache poi访问该名称。我尝试了: 但只有当幻灯片名称只有默认名称时,才以这种方式获取空字符串。 在阿帕奇POI中获取(甚至设置)pptx文件的幻灯片名称的正确方法是什么?

  • Apache Kafka:分布式消息传递系统 Apache Storm:实时消息处理 我们如何在实时数据管道中使用这两种技术来处理事件数据? 在实时数据管道方面,我觉得两者做的工作是一样的。如何在数据管道上同时使用这两种技术?

  • 我正在使用Flink从Apache Pulsar读取数据。我在pulsar中有一个分区主题,有8个分区。在本主题中,我生成了1000条消息,分布在8个分区中。我的笔记本电脑中有8个内核,因此我有8个子任务(默认情况下,并行度=#个内核)。在执行Eclipse中的代码后,我打开了Flink UI,发现一些子任务没有收到任何记录(空闲)。我希望所有8个子任务都能得到利用(我希望每个子任务都映射到我的主

  • 我们需要的是直接的API来设置和使用集群消息队列。我们最初的计划是使用Camel在集群JMS或ActiveMQ队列上进行消费/生产。Kafka如何使这项任务变得更容易?在任何一种情况下,应用程序本身都将在WebLogic服务器上运行。 消息传递将是点对点类型,其中有多个相同服务的实例在运行,但根据负载平衡策略,只有一个实例应该处理消息并发出结果。消息队列也是群集的,因此服务实例或队列实例的失败都不

  • 我创建了此代码以使用Apache POI读取excel文件的内容。我使用eclipse作为编辑器,但当我运行代码时,我的粗体行出现问题。有什么问题?excel的内容如下:

  • 目前我正在研究Apache spark和Apache ignite框架。 这篇文章介绍了它们之间的一些原则差异,但我意识到我仍然不理解它们的目的。 我的意思是,哪一个问题更容易产生火花而不是点燃,反之亦然?