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();