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

时间:2013-08-17 18:55:32

标签: apache-poi xslf

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

我发现XSLFBackground(pptx api)类比其对应的Background类(ppt api)更受限制。
有没有人设法使用apache poi获取有关pptx幻灯片背景的信息?

也有人可以指点我这个主题的一些好资源。我发现apache poi javadoc几乎无法使用,poi网站上的例子只涵盖基本功能。

最诚挚的问候,Sergiu

1 个答案:

答案 0 :(得分:4)

背景元素的内容在Office Open Schema中描述 - 检查里面的zip-link at the bottom和pml-slide.xsd。

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

对于初学者,这里有一个阅读背景图片以及将幻灯片导出到pngs的例子(可能对你的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();        
        }
    }
}