001    /*
002     * JBoss DNA (http://www.jboss.org/dna)
003     * See the COPYRIGHT.txt file distributed with this work for information
004     * regarding copyright ownership.  Some portions may be licensed
005     * to Red Hat, Inc. under one or more contributor license agreements.
006    * See the AUTHORS.txt file in the distribution for a full listing of 
007    * individual contributors.
008     *
009     * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
010     * is licensed to you under the terms of the GNU Lesser General Public License as
011     * published by the Free Software Foundation; either version 2.1 of
012     * the License, or (at your option) any later version.
013     *
014     * JBoss DNA is distributed in the hope that it will be useful,
015     * but WITHOUT ANY WARRANTY; without even the implied warranty of
016     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
017     * Lesser General Public License for more details.
018     *
019     * You should have received a copy of the GNU Lesser General Public
020     * License along with this software; if not, write to the Free
021     * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
022     * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
023     */
024    package org.jboss.dna.sequencer.msoffice.powerpoint;
025    
026    import java.util.List;
027    import java.io.*;
028    import java.awt.image.BufferedImage;
029    import java.awt.*;
030    import java.awt.geom.Rectangle2D;
031    import java.util.ArrayList;
032    import org.apache.poi.hslf.usermodel.SlideShow;
033    import org.apache.poi.hslf.model.Slide;
034    import org.apache.poi.hslf.model.TextRun;
035    
036    /**
037     * Utility for extracting metadata from PowerPoint files
038     * 
039     * @author Michael Trezzi
040     */
041    public class PowerPointMetadataReader {
042    
043        public static List<SlideMetadata> instance( InputStream stream ) throws IOException {
044            SlideShow slideshow = new SlideShow(stream);
045            Slide[] slides = slideshow.getSlides();
046    
047            List<SlideMetadata> slidesMetadata = new ArrayList<SlideMetadata>();
048    
049            for (Slide slide : slides) {
050                SlideMetadata slideMetadata = new SlideMetadata();
051                // process title
052                slideMetadata.setTitle(slide.getTitle());
053    
054                // process notes
055                for (TextRun textRun : slide.getNotesSheet().getTextRuns()) {
056                    if (slideMetadata.getNotes() == null) {
057                        slideMetadata.setNotes("");
058                    }
059                    slideMetadata.setNotes(slideMetadata.getNotes() + textRun.getText());
060                }
061                // process text
062                for (TextRun textRun : slide.getTextRuns()) {
063                    if (!textRun.getText().equals(slideMetadata.getTitle()) && textRun.getText() != null) {
064                        if (slideMetadata.getText() == null) {
065                            slideMetadata.setText("");
066                        }
067                        slideMetadata.setText(slideMetadata.getText() + textRun.getText());
068                    }
069                }
070    
071                // process thumbnail
072                Dimension pgsize = slideshow.getPageSize();
073    
074                BufferedImage img = new BufferedImage(pgsize.width, pgsize.height, BufferedImage.TYPE_INT_RGB);
075                Graphics2D graphics = img.createGraphics();
076                // clear the drawing area
077                graphics.setPaint(Color.white);
078                graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width, pgsize.height));
079    
080                // render
081                slide.draw(graphics);
082    
083                ByteArrayOutputStream out = new ByteArrayOutputStream();
084                javax.imageio.ImageIO.write(img, "png", out);
085                slideMetadata.setThumbnail(out.toByteArray());
086    
087                slidesMetadata.add(slideMetadata);
088    
089            }
090    
091            return slidesMetadata;
092        }
093    
094    }