天天看點

PPT轉圖檔(更新)

update:2008-05-05,poi已經可以處理這個需求:

package net.rubyeye.test;

import java.io.fileoutputstream;

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 ppttoimageconverter {

    public static void main(string[] args) throws exception {

        slideshow ppt = new slideshow(new hslfslideshow("d:/test.ppt"));

        // extract all pictures contained in the presentation

        picturedata[] pdata = ppt.getpicturedata();

        for (int i = 0; i < pdata.length; i++) {

            picturedata pict = pdata[i];

            // picture data

            byte[] data = pict.getdata();

            int type = pict.gettype();

            string ext;

            switch (type) {

            case picture.jpeg:

                ext = ".jpg";

                break;

            case picture.png:

                ext = ".png";

            case picture.wmf:

                ext = ".wmf";

            case picture.emf:

                ext = ".emf";

            case picture.pict:

                ext = ".pict";

            default:

                continue;

            }

            fileoutputstream out = new fileoutputstream("d:/test/pict_" + i + ext);

            out.write(data);

            out.close();

        }

    }

}

   原文:

   小結下最近做的東西吧。因為是做一個素材管理的東西,是以需要處理各種各樣的素材,音頻、視訊、圖檔、pdf、ppt等等。遇到一個需求就是将ppt轉成圖檔組,google一下,在java裡是可以jcom之類的開源庫實作,本質上都是通過jni調用office的com接口來實作。我們就需要這麼一個小功能,拖這麼大個開源庫進來實在沒有必要。最後決定自己寫個動态連結庫,通過jni來調用。

    先寫工具類,

public class pptutils {

    public pptutils() {

    public static native void convertppt2img(string pptfilename, string tmpdir);

    public static void loadlibrary() {//加載動态庫

        string dllfilename = "pptdll";

        try {

            string osname = system.getproperty("os.name");

            if (osname.contains("windows")) {

                dllfilename += ".dll";

            } else {

                dllfilename += ".so";

            //加載動态連結庫

            system.load(dllfilename);

        catch (exception e) {

         //   log.error("can not load " + dllfilename + ", " + e.getmessage());

            e.printstacktrace();

     }

    編譯一下,執行javah pptutils生成頭檔案pptutils.h。接下來用vc寫個動态連結庫,記的将msppt.olb(在office安裝目錄下)加入工程,建立一個ppt2img.cpp:

#include "stdafx.h"

#include "pptutils.h"

#include "msppt.h"

jniexport void jnicall java_com_starnet_dmb_util_pptutils_convertppt2img(jnienv *env,

      jclass clazz, jstring pptfilename, jstring tmpdir){

   //初始化com

    if (coinitialize( null ) == e_invalidarg)

    {

       afxmessagebox(_t("初始化com失敗!"));

       return;

    }  

    _application   app;

    presentations   prsts;

    _presentation   prst;

    //jstring轉成char *

   const char *ppt;

   ppt = env->getstringutfchars(pptfilename,0);

   const char *tmp;

   tmp=env->getstringutfchars(tmpdir,0);

   if(!app.createdispatch(_t("powerpoint.application"))){

      afxmessagebox(_t("初始化powerpoint失敗!"));

   }

   prsts   =   app.getpresentations();

   prst   =   prsts.open(_t(ppt),false,false,false);

   prst.saveas(_t(tmp),17,false);

   app.releasedispatch();

   app.quit();

   env->releasestringutfchars(pptfilename,ppt);

   env->releasestringutfchars(tmpdir,tmp);

   couninitialize();