最近在公司做一个环境检测方面的工作,其中检测的一项内容是MsOffice由PPT转换成Image的功能,下面我详细说下怎样来实现。
既然要在Eclipse使用该功能,就需要有相应的jar包和dll文件,我们这里用到的jar包便是jacob.jar,用到的dll文件是jacob-1.18-x64.dll(如果你的电脑是32位的话,用到的dll文件是jacob-1.18-x86.dll),那么,我们怎么下载这个jar包和dll文件呢?下面分六步来给大家详细介绍一下。(注意:msoffice功能只能用在Windows系统,Linux系统无法使用)
第一步:打开必应浏览器,网址:cn.bing.com,然后在搜索框中输入jacob.jar,如下图所示。
第二步:点击上图的搜索按钮开始搜索,会进入到如下图所示的界面,我们点击第一个链接进去,如下图所示。
第三步:点击上图的链接之后,我们会进入到如下图所示的界面,我们点击那个很大的绿色按钮"Download"。
第四步:点击上图的"Download"按钮之后,我们会进入到如下图所示的界面,3秒钟后会弹出一个下载对话框,我们点击"另存为"或"保存"就可以下载这个压缩包了。
第五步:解压下载的压缩包,如下图所示。
第六步:我们进入jacob-1.18文件夹,如下图所示,jacob.jar就是我们要用到的开发包。jacob-1.18-x64.dll便是我们要用到的dll。
提示:如果大家对jacob不太熟悉,可以先进入docs文件夹,然后再进入api文件夹,在api文件夹下有一个index.html,打开它,可以看到jacob的功能介绍。
index.html页面如下图所示。
下载完了jar包和dll文件之后,我们便来说一下该如何运用它来将PPT文件转换成image图片。
第一步:新建一个类,我这里新建的类是TestMsOffice.java,导入我们下载好的jacob.jar,如下图所示。
第二步:在我们的JRE中的bin目录下,放我们刚才下载好的dll文件,如下图所示。
第三步:代码,我们现在D盘根目录下放一个123.pptx文件,在D盘根目录下新建一个test文件夹。
import java.io.FileFilter;
import com.jacob.com.Dispatch;;
ActiveXComponent active=null;
Dispatch ppt=null;
try{
active=new ActiveXComponent("PowerPoint.Application");//创建一个PPT对象
Dispatch ppts=active.getProperty("Presentations").toDispatch();//获取文档属性
//调用Documents对象中Open方法打开文档,并返回打开的文档对象Document
//第4,5,6的参数分别表示:ReadOnly,Untititled指定文件是否有标题,WithWindow指定文件是否可见
ppt=Dispatch.call(ppts, "Open", "D://123.pptx",true,true,false).toDispatch();
//调用office另存为方法
Dispatch.call(ppt, "SaveAs","D://test",17);
reNameFiles("D://test");
}catch(Exception e){
e.printStackTrace();
}
}
/**
* 将默认生成的幻灯片1.jpg修改成1.jpg
* @param fileDir
*/
private static void reNameFiles(String fileDir){
File file=new File(fileDir);
if(!file.isDirectory()){
return;
}
final String parentDir=fileDir;
final int length=String.valueOf(file.listFiles().length).length();
if(length==0){
return;
}
file.listFiles(new FileFilter(){
public boolean accept(File file) {
String fileName=file.getName().replace("幻灯片","");
String name=fileName.substring(0, fileName.indexOf("."));
for(int i=0;i<length-name.length();i++){
fileName="0"+fileName;
}
File newFile=new File(normalizePath(parentDir+File.separator+fileName));
if(newFile.exists()){
newFile.delete();
}
file.renameTo(newFile);
return true;
}
});
}
/**
* 将文件路径格式化,去掉其中多余的/和\,去掉可能造成文件信息泄露的../
* @param path
* @return
*/
private static String normalizePath(String path) {
path = path.replace('\\', '/');
path = replaceEx(path, "../", "/");
path = replaceEx(path, "./", "/");
if (path.endsWith("..")) {
path = path.substring(0, path.length() - 2);
}
path = path.replaceAll("/+", "/");
return path;
}
/**
* 将一个字符串中的指定片段全部替换,替换过程中不进行正则处理
* 使用String类的replaceAll时要求片段以正则表达式形式给出,有时较为不便,可以采用本方法
*
* @param str
* @param subStr
* @param reStr
* @return
*/
public static String replaceEx(String str, String subStr, String reStr) {
if ((str == null) || (str.length() == 0) || (reStr == null)) {
return str;
}
if ((subStr == null) || (subStr.length() == 0) || (subStr.length() > str.length())) {
return str;
}
StringBuilder sb = null;
int lastIndex = 0;
while (true) {
int index = str.indexOf(subStr, lastIndex);
if (index < 0) {
break;
}
if (sb == null) {
sb = new StringBuilder();
}
sb.append(str.substring(lastIndex, index));
sb.append(reStr);
}
if (lastIndex == 0) {
return str;
}
sb.append(str.substring(lastIndex));
return sb.toString();
}
}