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

如何使用apache poi从pptx幻灯片中获取背景数据

曾实
2023-03-14

我试图建立一个相当粗糙的工具,将ppt/pptx文件转换为超文本标记语言格式。
我发现,不幸的是,apache poi没有为处理Power point文件提供统一的编程模型,必须编写代码来解析每种格式。
我觉得pptx文件支持比ppt支持有限得多。我面临的一个问题是获取有关pptx幻灯片背景(颜色、图案、背景图像)的信息。

我发现XSLFbackground(pptx api)类比其相应的背景类(ppt api)要有限得多。
有人设法使用apache poi获取有关pptx幻灯片背景的信息吗?

还有,有人能给我指出一些关于这个主题的好资源吗?我发现apache poi javadoc几乎无法使用,poi网站上的示例只涵盖了基本功能。

最好的问候,Sergiu

共有1个答案

朱兴学
2023-03-14

Office Open Schema中描述了背景元素的内容——检查底部的zip链接和内部的pml-slide.xsd。

有了手中的模式,您将了解usermodel接口下面的XML bean。

对于初学者来说,这里有一个读取背景图像和将幻灯片导出为png的例子(可能对您的html导出有用?):

import java.awt.*;
import java.awt.geom.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;
import org.apache.poi.xslf.usermodel.*;
import org.openxmlformats.schemas.presentationml.x2006.main.CTBackground;

public class PptxBackground {
    public static void main(String[] args) throws Exception {
        // sorry for the content, but it was one of the first non-commercial google matches ... 
        URL url = new URL("http://newkilpatrickblog.typepad.com/files/sunday_june_03_2012_trinity_and_majesty_communion.pptx");
        InputStream is = url.openStream();
        XMLSlideShow ss = new XMLSlideShow(is);
        is.close();

        XSLFSlide sld = ss.getSlides()[0];
        XSLFBackground bg = sld.getBackground();
        CTBackground xmlBg = (CTBackground)bg.getXmlObject();
        String relId = xmlBg.getBgPr().getBlipFill().getBlip().getEmbed();

        XSLFPictureData pic = (XSLFPictureData)sld.getRelationById(relId);
        String filename = pic.getFileName();
        byte fileBytes[] = pic.getData();


        /***** or convert the slides to images ****/

        double zoom = 2; // magnify it by 2
        AffineTransform at = new AffineTransform();
        at.setToScale(zoom, zoom);

        Dimension pgsize = ss.getPageSize();
        XSLFSlide slides[] = ss.getSlides();
        for (int i = 0; i < slides.length; i++) {
            BufferedImage img = new BufferedImage((int)Math.ceil(pgsize.width*zoom), (int)Math.ceil(pgsize.height*zoom), BufferedImage.TYPE_INT_RGB);
            Graphics2D graphics = img.createGraphics();
            graphics.setTransform(at);          

            graphics.setPaint(Color.white);
            graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width, pgsize.height));
            slides[i].draw(graphics);
            FileOutputStream out = new FileOutputStream("slide-"  + (i+1) + ".png");
            javax.imageio.ImageIO.write(img, "png", out);
            out.close();        
        }
    }
}
 类似资料:
  • 问题内容: 到目前为止,我只有一个有效的代码可以从ppt幻灯片笔记中检索文本 但是,如何从pptx幻灯片笔记中检索文本? 问题答案: 经过不断的反复试验,找到了解决方案。

  • 到目前为止,我只有一个从ppt幻灯片笔记中检索文本的工作代码 但如何从pptx幻灯片笔记中检索文本呢?

  • 我知道如何使用apache poi从ppt文件中提取文本,如下所示 但它提取了所有页脚,幻灯片编号,我不想要 那么如何提取除页脚和幻灯片编号以外的文本 预先感谢

  • 我想使用Apache POIJava库将pptx幻灯片拆分为几个幻灯片,每个幻灯片只包含一张幻灯片。 创建一个新的XMLSlideSheet并添加幻灯片,如在几个地方(例如 https://www.tutorialspoint.com/apache_poi_ppt/apache_poi_ppt_merging.htm)所述,对我来说不起作用,因为某些布局没有正确导入:字体被更改,文本的位置被更改等

  • sp_getslide($slide,$limit=5,$order = "listorder ASC") 功能: 根据幻灯片标识获取所有幻灯片 参数: $slide:幻灯片标识,后台可以设置 $limit:最多显示几张幻灯片 $order:按什么字段(slide表的字段)排序 返回 数组,符合条件的幻灯片列表 示例: $slides=sp_getslide('top_slide');

  • 我想拿一张PowerPoint幻灯片(“源”),并将其插入到另一张已经包含一些内容的PowerPoint幻灯片(“目标”)中,位于源PowerPoint幻灯片中的特定位置。 我已经尝试了几种方法来研究这样做的代码,但是我不断得到将幻灯片合并到PowerPoint演示文稿中的结果,这不是我想要的。我想拿一张现有的幻灯片并将其插入到另一张幻灯片中,就像在现有幻灯片中插入图片一样。 我有另一位同事编写的