利用POI技术 处理PPT

package com.yls.poi;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;

import javax.imageio.ImageIO;

import org.apache.poi.hslf.HSLFSlideShow;
import org.apache.poi.hslf.model.HeadersFooters;
import org.apache.poi.hslf.model.Line;
import org.apache.poi.hslf.model.Picture;
import org.apache.poi.hslf.model.Slide;
import org.apache.poi.hslf.model.SlideMaster;
import org.apache.poi.hslf.model.Table;
import org.apache.poi.hslf.model.TableCell;
import org.apache.poi.hslf.model.TextBox;
import org.apache.poi.hslf.usermodel.RichTextRun;
import org.apache.poi.hslf.usermodel.SlideShow;

public class pptUtil {
    
    //操作ppt公用类
    
    /**
     * 创建ppt
     * @param ppt ppt对象
     * @param filename 要保存的ppt文件名
     */
    public void  savaPptFile(SlideShow ppt,String filename){
        FileOutputStream out;
        try {
            out = new FileOutputStream(filename);
            ppt.write(out);
            out.close();

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
    
    /**
     * 设置幻灯片的一些样式
     * @param ppt 对象
     */
    
    public static  void createPPtStyle(SlideShow ppt){
        ppt.setPageSize(new Dimension(1000,800));
        SlideMaster master = ppt.getSlidesMasters()[0];       
        //设置母板背景,支持多种图片格式
        int picIndex;
        try {
            picIndex = ppt.addPicture(new File("d:\\POI\\1.png"), Picture.PNG);
            Picture background = new Picture(picIndex);
            //设置图片位置
            background.setAnchor(new java.awt.Rectangle(0, 0, ppt.getPageSize().width
                                                           , ppt.getPageSize().height));
            master.addShape(background);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
    
    /**
     * 插入表格
     * @param ppt
     */
    public static void createTableForPPt(SlideShow ppt){
        Slide slide = ppt.createSlide();
        
        String[][] datas = {
            {"序号", "姓名","年龄"},
            {"1", "张三","30"},
            {"2", "李四","27"},
        };
        
        //create a table of 3 rows and 3 columns
        Table table = new Table(3, 3);
        
        for (int i = 0; i < datas.length; i++) {
            for (int j = 0; j < datas[i].length; j++) {
                TableCell cell = table.getCell(i, j);
        
                RichTextRun rt = cell.getTextRun().getRichTextRuns()[0];
                rt.setFontName("宋体");
                rt.setFontSize(12);
        
                cell.setVerticalAlignment(TextBox.AnchorMiddle);
                cell.setHorizontalAlignment(TextBox.AlignCenter);
                cell.setText(datas[i][j]);
        
                
                if(i == 0){//首行背景设置为灰色
                     cell.setFillColor(Color.GRAY);
                }                  
            }
        }
        
        Line border = table.createBorder();
        border.setLineColor(Color.black);
        border.setLineWidth(2.0);
        table.setAllBorders(border);
        
        slide.addShape(table);
        table.moveTo(160,260);
    }
    /**
     *
     * @param ppt 对象
     * @param newSlide 当前页
     * @param PictureName 当前页插入的图片地址
     */
    public static void createPic(SlideShow ppt,Slide newSlide,String PictureName){
        
        try {
            int picIndex = ppt.addPicture(new File(PictureName), Picture.PNG);
            
            Picture jpg = new Picture(picIndex);
            
            
            //set image position in the slide
            jpg.setAnchor(new java.awt.Rectangle(0, 0, 280, 260));
            
            newSlide.addShape(jpg);
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        

    }
    /**
     *
     * @param ppt
     * @param newSlide
     * @param gifFileName
     */
    public static void createGIFforPPt(SlideShow ppt,Slide newSlide,String gifFileName){
        
        int picIndex;
        try {
            picIndex = ppt.addPicture(new File(gifFileName), Picture.PNG);
            Picture jpg = new Picture(picIndex);
            //set image position in the slide
            jpg.setAnchor(new java.awt.Rectangle(140, 100, 385,  300));
            
            newSlide.addShape(jpg);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        
    }
    
    
    /**
     *
     * @param ppt 对象
     * @param newSlide 当前页
     * @param PictureName 当前页插入的多张图片地址   
     * 单图  两图   四图  六图  九图                              1-9张图
     */
    public static void createMorePic(SlideShow ppt,Slide newSlide,ArrayList<String> PictureList){
        
        if(PictureList.size()==1){
            //插入单图
            int picIndex;
            try {
                picIndex = ppt.addPicture(new File(PictureList.get(0)), Picture.PNG);
                Picture jpg = new Picture(picIndex);
                //set image position in the slide
                jpg.setAnchor(new java.awt.Rectangle(0, 50, ppt.getPageSize().width,  ppt.getPageSize().height*4/5));
                
                newSlide.addShape(jpg);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            
        }else if(PictureList.size()==2){
            //插入双图
            for(int i=0;i<PictureList.size();i++){
                int picIndex;
                try {
                    picIndex = ppt.addPicture(new File(PictureList.get(i)), Picture.PNG);
                    Picture jpg = new Picture(picIndex);
                
                    //set image position in the slide
                    jpg.setAnchor(new java.awt.Rectangle(0+i*ppt.getPageSize().width/3, 0+i*ppt.getPageSize().height/3, ppt.getPageSize().width*2/3,  ppt.getPageSize().height*2/3));
                    
                    newSlide.addShape(jpg);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                
                
            }
            
        }else if(PictureList.size()==3||PictureList.size()==4){
            //插入 三图或四图  放两排
            for(int i=0;i<PictureList.size();i++){
                int picIndex;
                try {
                    picIndex = ppt.addPicture(new File(PictureList.get(i)), Picture.PNG);
                    Picture jpg = new Picture(picIndex);
                    //设置图片在幻灯片中的位置
                    if(i==0 || i==1){
                        jpg.setAnchor(new java.awt.Rectangle(0+i*ppt.getPageSize().width/2, 0, ppt.getPageSize().width/2,  ppt.getPageSize().height/2));
                    }else if(i==2 || i==3){//换第二行插入
                        jpg.setAnchor(new java.awt.Rectangle((i-2)*ppt.getPageSize().width/2, ppt.getPageSize().height/2, ppt.getPageSize().width/2,  ppt.getPageSize().height/2));
                    }
                    newSlide.addShape(jpg);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                
                
            }
            
            

            
        }else if(PictureList.size()==5 || PictureList.size()==6){
            //插入五图或 六图   放置位置为两行三列
            for(int i=0;i<PictureList.size();i++){
                int picIndex;
                try {
                    picIndex = ppt.addPicture(new File(PictureList.get(i)), Picture.PNG);
                    Picture jpg = new Picture(picIndex);
                    //设置图片在幻灯片中的位置
                    if(i==0||i==1||i==2){
                        jpg.setAnchor(new java.awt.Rectangle(0+i*ppt.getPageSize().width/3, 0, ppt.getPageSize().width/3,  ppt.getPageSize().height/3));
                    }else if(i==3||i==4||i==5){//换第二行插入
                        jpg.setAnchor(new java.awt.Rectangle(0+(i-3)*ppt.getPageSize().width/3, ppt.getPageSize().height/3, ppt.getPageSize().width/3,  ppt.getPageSize().height/3));
                    }
                    
                    newSlide.addShape(jpg);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                
                
            }
            
            
        }else if(PictureList.size()==7||PictureList.size()==8||PictureList.size()==9){
            //插入7图或8图、 9图   放置位置为三行三列
            for(int i=0;i<PictureList.size();i++){
                int picIndex;
                try {
                    picIndex = ppt.addPicture(new File(PictureList.get(i)), Picture.PNG);
                    Picture jpg = new Picture(picIndex);
                    //设置图片在幻灯片中的位置
                    if(i==0||i==1||i==2){
                        jpg.setAnchor(new java.awt.Rectangle(0+i*ppt.getPageSize().width/3, 0, ppt.getPageSize().width/3,  ppt.getPageSize().height/3));
                    }else if(i==3||i==4||i==5){//换第二行插入
                        jpg.setAnchor(new java.awt.Rectangle(0+(i-3)*ppt.getPageSize().width/3, ppt.getPageSize().height/3, ppt.getPageSize().width/3,  ppt.getPageSize().height/3));
                    }else if(i==6||i==7||i==8){
                        jpg.setAnchor(new java.awt.Rectangle(0+(i-6)*ppt.getPageSize().width/3, 2*ppt.getPageSize().height/3, ppt.getPageSize().width/3,  ppt.getPageSize().height/3));
                    }
                    
                    newSlide.addShape(jpg);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                
                
            }
            
            
        }
        
        
    

    }
    /**
     * 把多张jpg图片合成一张
     * @param pic String[] 多个jpg文件名 包含路径
     * @param newPic String 生成的gif文件名 包含路径
     */
    public static synchronized void MorepngToGif(ArrayList<String> pic, String newPic) {
        try {
            AnimatedGifEncoder e = new AnimatedGifEncoder();  //请见<a href="http://http://blog.csdn.net/ycb1689/article/details/8071733">本博客文章
            e.setRepeat(0);
            e.start(newPic);
            BufferedImage src[] = new BufferedImage[pic.size()];
            for (int i = 0; i < src.length; i++) {
                e.setDelay(500); //设置播放的延迟时间
                src[i] = ImageIO.read(new File(pic.get(i))); // 读入需要播放的jpg文件
                e.addFrame(src[i]);  //添加到帧中
            }
            e.finish();
        } catch (Exception e) {
            System.out.println( "jpgToGif Failed:");
            e.printStackTrace();
        }
    }
    
    
    public static void main (String a[]){
        pptUtil  obj = new pptUtil();
        //SlideShow _slide = new SlideShow();
        SlideShow _slide = null;
        try {
            _slide = new SlideShow(new HSLFSlideShow("f://pptmoban.ppt"));
        
            // 添加第一页
            Slide slide0 = _slide.createSlide();

            // 设置第一页的文本标题
            TextBox title = slide0.addTitle();
            title.setText("2014-10-15  日会商");
            // 线形状
    /*        Line line = new Line();
            line.setAnchor(new java.awt.Rectangle(50, 50, 100, 20));
            line.setLineColor(new Color(0, 128, 0));
            line.setLineStyle(Line.LINE_DOUBLE);
            slide0.addShape(line);*/

            // TextBox
            TextBox txt = new TextBox();
            txt.setText("深圳气象局");
            txt.setAnchor(new java.awt.Rectangle(200, 300, 300, 200));

            // 使用 RichTextRun 设置文本格式
            RichTextRun rt = txt.getTextRun().getRichTextRuns()[0];
            rt.setFontSize(32);
            rt.setFontName("Arial");
            rt.setBold(true);
            rt.setItalic(true);
            rt.setUnderlined(true);
            rt.setFontColor(Color.red);
            rt.setAlignment(TextBox.AlignRight);

            slide0.addShape(txt);
            

        
            
            //Slide slide1 = _slide.createSlide(); //创建第2页ppt
            Slide slide2 = _slide.createSlide(); //创建第3页ppt
            /*Slide slide3 = _slide.createSlide(); //创建第4页ppt
            Slide slide4 = _slide.createSlide(); //创建第5页ppt
            Slide slide5 = _slide.createSlide(); //创建第6页ppt
            Slide slide6 = _slide.createSlide(); //创建第7页ppt
            Slide slide7 = _slide.createSlide(); //创建第8页ppt
            Slide slide8 = _slide.createSlide(); //创建第9页ppt
            Slide slide9 = _slide.createSlide(); //创建第10页ppt
*/            //createPic(_slide, slide1, "d:\\POI\\Sunset.jpg");//在这一页ppt里面插入图片
            //createPPtStyle(_slide);//给ppt设置样式
            //createTableForPPt(_slide);//给ppt添加一页并插入表格
            String[] PictureList1 = {"Y:/data/nwpdata/webcache/ecmwf/20141117/ECMWFNEWFore_20141117200000_000_200Temp_25km_hn_ecwmf.png"};
            String[] PictureList2 = {"d:\\POI\\1.png","d:\\POI\\1.png"};
            String[] PictureList3 = {"d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png"};
            String[] PictureList4 = {"d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png"};
            String[] PictureList5 = {"d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png"};
            String[] PictureList6 = {"d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png"};
            String[] PictureList7 = {"d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png"};
            String[] PictureList8 = {"d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png"};
            String[] PictureList9 = {"d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png","d:\\POI\\1.png"};
        
            ArrayList<String> list = new ArrayList<String>();
            list.add("d:\\POI\\1.png");
            //list.add("d:\\POI\\1.png");
            //list.add("Y:/data/nwpdata/webcache/ecmwf/20141117/ECMWFNEWFore_20141117200000_000_200Temp_25km_hn_ecwmf.png");
            //createMorePic(_slide, slide1, list); //给ppt的第2张幻灯片 添加一张图片
            createMorePic(_slide, slide2, list); //给ppt的第3张幻灯片 添加一张图片
//            createMorePic(_slide, slide3, PictureList3);
//            createMorePic(_slide, slide4, PictureList4);
//            createMorePic(_slide, slide5, PictureList5);
//            createMorePic(_slide, slide6, PictureList6);
//            createMorePic(_slide, slide7, PictureList7);
//            createMorePic(_slide, slide8, PictureList8);
//            createMorePic(_slide, slide9, PictureList9);
            
            // 设置标题,底部信息
            HeadersFooters hdd = _slide.getSlideHeadersFooters();
            hdd.setSlideNumberVisible(true);
            hdd.setFootersText("深圳竹子林");//页眉  / 页脚
            obj.savaPptFile(_slide, "D:\\POI\\ppt测试2.ppt");//生成ppt
        
        
        
        
        
        
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    
        
    }

}



解析PPY里面的图片数据

package com.yls.poi;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.hslf.HSLFSlideShow;
import org.apache.poi.hslf.model.Picture;
import org.apache.poi.hslf.usermodel.PictureData;
import org.apache.poi.hslf.usermodel.SlideShow;

public class ParsingPPT {
    //解析ppt  将里面的图片可以解析出来
    public static void main(String[] args) {
        String path = "d:\\POI\\";    
       // 加载PPT     19.        
         HSLFSlideShow _hslf = null;
        try {
            _hslf = new HSLFSlideShow("d:\\POI\\slideshow.ppt");
        
        
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }    
         SlideShow _slideShow = new SlideShow(_hslf);    
         // 获取PPT文件中的图片数据     23.        
         PictureData[] _pictures = _slideShow.getPictureData();    
         // 循环读取图片数据     26.        
         for (int i = 0; i < _pictures.length; i++) {    
             StringBuilder fileName = new StringBuilder(path);    
             PictureData pic_data = _pictures[i];    
             fileName.append(i);    
             // 设置格式     31.          
             switch (pic_data.getType()) {   
             case Picture.JPEG:   
                 fileName.append(".jpg");   
                 break;   
             case Picture.PNG:     
                 fileName.append(".png");   
                 break;    
          default:   
                     fileName.append(".data");    
             }    
        // 输出文件     42.           
             FileOutputStream fileOut;
            try {
                fileOut = new FileOutputStream(new File(fileName.toString()));
                 fileOut.write(pic_data.getData());    
                 fileOut.close();  
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }   
            
         }    
    }     


}










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章