利用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();
            }   
            
         }    
    }     


}










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