使用Jacob批量转换word为txt、pdf、xps、html、xml等文档

来源:互联网 发布:我的世界联机出现java 编辑:程序博客网 时间:2024/06/06 14:22

原文链接http://blog.csdn.net/maxuyang1987/article/details/17097573


Jacob全称位java com bridge,通过该插件,可以使用Java语言编写程序,调用COM、ActiveX组件来操作Windows本地程序。

参考一位网友的例子,我写了一个程序,用来将word批量转换为txt等格式的文档。

该程序核心部分,仅仅是调用了Jacob的几个类,实现了调用Word打开指定的word文档,并在指定的目的路径中将其另存为指定的文档格式,简而言之,就是“Open”,“save As”。

Jacob能够实现的远不止这点,操作word的Java插件有不少,功能强大的Jacob可以为首。

因为程序是调用本地Office进行的打开、另存为操作,所以需要本地安装有word,并且,不同的office版本操作的结果自然是不同的。

我使用的是word2010,在word2010下可以打开97-2003doc文档和2007-2010docx文档,保存的格式也有docx、pdf,而在word2003版本下,该功能实习不了。如果有兴趣测试的话,在word2003的环境下,可以把相关的代码注释掉。

下边附上源代码:

 /**      *@author eyuan      */      package per.eyuan.word2txt.core;            import com.jacob.*;      import com.jacob.com.*;      import com.jacob.activeX.*;      import java.io.*;      import java.util.Scanner;            public class Core {       /**       * 实现转换的函数       * @param sourceFilesPath       * @param destinationFilesPath       * @param destinationFilesType       * @return void       * @see import com.jacob.activeX.*;       */       public boolean change(String sourceFilesPath,String destinationFilesPath,int destinationFilesType){        //使用word文件所在的目录(源路径)建立目录文件        File sourcePathFile=new File(sourceFilesPath);        //取得word文件(源文件列表)        File sourceFilesList[]=sourcePathFile.listFiles();        System.out.println("共有"+sourceFilesList.length+"个文件(文件夹)");        //指定要转换的文件所在的目录下,如果有子目录,        //则进入子目录,继续查找word文档并将其转换,        //直到将指定目录下的所有word文档转换完。        //子目录名        String sourceChildPath=new String("");        //保持原来的层次关系,将子目录下的文件存放在新建的子目录中        String destiNationChildPath=new String("");        //检索文件,过滤掉非word文件,通过扩展名过滤        for(int i=0;i<sourceFilesList.length;i++){         //排除掉子文件夹         if(sourceFilesList[i].isFile()){          System.out.println("第"+(i+1)+"个文件:");          //取得文件全名(包含扩展名)          String fileName=sourceFilesList[i].getName();          String fileType=new String("");              //取得文件扩展名          fileType=fileName.substring((fileName.length()-4), fileName.length());          //word2007-2010扩展名为docx          //判断是否为word2007-2010文档,及是否以docx为后缀名          if(fileType.equals("docx")){           System.out.println("正在转换。。。");           //输出word文档所在路劲           System.out.println("目录:"+sourceFilesPath);           //输出word文档名           System.out.println("文件名:"+fileName);           //System.out.println(fileName.substring(0, (fileName.length()-5)));           //核心函数           //启动word           ActiveXComponent app=new ActiveXComponent("Word.Application");           //要转换的文档的全路径(所在文件夹+文件全名)           String docPath=sourceFilesPath+"\\"+fileName;           //转换后的文档的全路径(所在文件夹+文件名)           String othersPath=destinationFilesPath+"\\"+fileName.substring(0,(fileName.length()-5));           //           String inFile=docPath;           String outFile=othersPath;           //           boolean flag=false;           //核心代码           try{            //设置word可见性            app.setProperty("Visible", new Variant(false));            //            Dispatch docs=app.getProperty("Documents").toDispatch();            //打开word文档               Dispatch doc=Dispatch.invoke(docs, "Open", Dispatch.Method, new Object[]{inFile,new Variant(false),new Variant(true)}, new int[1]).toDispatch();            //0:Microsoft Word 97 - 2003 文档 (.doc)            //1:Microsoft Word 97 - 2003 模板 (.dot)            //2:文本文档 (.txt)            //3:文本文档 (.txt)            //4:文本文档 (.txt)            //5:文本文档 (.txt)            //6:RTF 格式 (.rtf)            //7:文本文档 (.txt)            //8:HTML 文档 (.htm)(带文件夹)            //9:MHTML 文档 (.mht)(单文件)            //10:MHTML 文档 (.mht)(单文件)            //11:XML 文档 (.xml)            //12:Microsoft Word 文档 (.docx)            //13:Microsoft Word 启用宏的文档 (.docm)            //14:Microsoft Word 模板 (.dotx)            //15:Microsoft Word 启用宏的模板 (.dotm)            //16:Microsoft Word 文档 (.docx)            //17:PDF 文件 (.pdf)            //18:XPS 文档 (.xps)            //19:XML 文档 (.xml)            //20:XML 文档 (.xml)            //21:XML 文档 (.xml)            //22:XML 文档 (.xml)            //23:OpenDocument 文本 (.odt)            //24:WTF 文件 (.wtf)            //另存为指定格式的文档            Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[]{outFile,new Variant(destinationFilesType)}, new int[1]);            //            Variant file=new Variant(false);            //关闭文档            Dispatch.call(doc, "Close",file);            //            flag=true;           }catch(Exception e){            e.printStackTrace();            System.out.println("文档转换失败");           }finally{            app.invoke("Quit",new Variant[]{});           }           System.out.println("转换完毕");                 }          //word97-2003扩展名为doc          //判断是否为word2003-2007文档,及是否以doc为后缀名          else if(fileType.equals(".doc")){           System.out.println("正在转换。。。");           //输出word文档所在路劲           System.out.println("目录:"+sourceFilesPath);           //输出word文档名           System.out.println("文件名:"+fileName);           //System.out.println(fileName.substring(0, (fileName.length()-4)));           //核心函数           //启动word           ActiveXComponent app=new ActiveXComponent("Word.Application");           //要转换的文档的全路径(所在文件夹+文件全名)           String docPath=sourceFilesPath+"\\"+fileName;           //转换后的文档的全路径(所在文件夹+文件名)           String othersPath=destinationFilesPath+"\\"+fileName.substring(0,(fileName.length()-4));           //           String inFile=docPath;           String outFile=othersPath;           //           boolean flag=false;           //核心代码           try{            //设置word可见性            app.setProperty("Visible", new Variant(false));            //            Dispatch docs=app.getProperty("Documents").toDispatch();            //打开word文档               Dispatch doc=Dispatch.invoke(docs, "Open", Dispatch.Method, new Object[]{inFile,new Variant(false),new Variant(true)}, new int[1]).toDispatch();            //另存为指定格式的文档            Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[]{outFile,new Variant(destinationFilesType)}, new int[1]);            //            Variant file=new Variant(false);            //关闭文档            Dispatch.call(doc, "Close",file);            //            flag=true;           }catch(Exception e){            e.printStackTrace();            System.out.println("文档转换失败");           }finally{            app.invoke("Quit",new Variant[]{});           }           System.out.println("转换完毕");                 }          //文档的扩展名不是doc或docx          else{           System.out.println("非word文档");          }         }         //如果是子文件夹,则递归遍历,将所有的word文档转换         else{          //          sourceChildPath=sourceFilesPath;          //该文件是目录          sourceChildPath=sourceChildPath+"\\"+sourceFilesList[i].getName()+"\\";          System.out.println("源文件所在路径:"+sourceChildPath);          //修改目标文件夹,保持原来的层级关系          destiNationChildPath=destinationFilesPath;          destiNationChildPath=destinationFilesPath+"\\"+sourceFilesList[i].getName()+"\\";          System.out.println("转换后文件所在路径"+destiNationChildPath);          //          mkdir(destiNationChildPath);          //递归遍历所有目录,查找word文档,并将其转换          change(sourceChildPath, destiNationChildPath,destinationFilesType);         }        }        System.out.println("所有文档转换完毕");        return true;       }       /**        * 用于创建文件夹的方法        * @param mkdirName        */       public void mkdir(String mkdirName){        try{         //使用指定的路径创建文件对象         File dirFile = new File(mkdirName);          //         boolean bFile = dirFile.exists();         //已经存在文件夹,操作???提醒是否要替换         if( bFile == true ) {           System.out.println("已经存在文件夹"+mkdirName);          }         //不存在该文件夹,则新建该目录         else{          System.out.println("新建文件夹"+mkdirName);           bFile = dirFile.mkdir();           if( bFile == true ){           System.out.println("文件夹创建成功");           }else{           System.out.println(" 文件夹创建失败,清确认磁盘没有写保护并且空件足够");            System.exit(1);           }         }        }catch(Exception err){         System.err.println("ELS - Chart : 文件夹创建发生异常");          err.printStackTrace();         }finally{                 }       }       /**       * 判断某个文件夹是否存在       * @param path       */       /**       * 将形如D:\word的路径转换为D:\\word       */       public String changePath(String path){        String newPath="";        StringBuffer sb=new StringBuffer();        for(int i=0;i<path.length();i++){         sb.append(path.charAt(i));         if(path.charAt(i)=='\\')          sb.append('\\');        }        newPath=sb.toString();        System.out.println(newPath);        return newPath;       }       public boolean isPathExist(String path){        boolean isPathExist=false;        try{         File pathFile = new File(path);         if(pathFile.exists())          isPathExist= true;         else          isPathExist= false;        }catch(Exception err){         err.printStackTrace();         }        return isPathExist;       }       /**       * 主函数       */       public static void main(String[] args){        Core c=new Core();      //  c.changePath("D:\\word");        Scanner sc=new Scanner(System.in);        //源文档所在路径        String sourceFilesPath="";       //  String inputSourcePath="";      //  boolean sourcePathFlag=true;      //  System.out.println("请输入要转换文档所在的文件夹");      //  while(sourcePathFlag){      //   inputSourcePath=sc.next();      //   if(!isPathExist(inputSourcePath))      //    System.out.println("源路径不存在,请输入正确的路径");      //   else      //    sourcePathFlag=false;      //  }      //  sourceFilesPath=inputSourcePath;        sourceFilesPath="D:\\word";        //目标文档要存放的目录        String destinationFilesPath="";      //  String inputdestinationPath="";      //  boolean destinationPathFlag=true;      //  System.out.println("请输入转换后文档要存放的文件夹");      //  while(destinationPathFlag){      //   inputdestinationPath=sc.next();      //   //目标文件不存在时,是否要提示用户创建文件      //   if(!isPathExist(inputdestinationPath))      //    System.out.println("目标路径不存在,请输入正确的路径");      //   else      //    destinationPathFlag=false;      //  }      //  destinationFilesPath=inputdestinationPath;          destinationFilesPath="D:\\txt";        //选择要转换的类型        int destinationFilesType=0;        int inputNumber=0;        boolean numFlag=true;        System.out.println("您要将word文档转换为哪种文档格式?");        System.out.println("0:doc \t 2:txt \t 6:rtf \t 8:html \t 9:mht \t 11:xml \t 12:docx \t 17:pdf \t 18:xps");        while(numFlag){         inputNumber=sc.nextInt();         if(inputNumber!=2&&inputNumber!=6&&inputNumber!=8&&inputNumber!=9&&inputNumber!=11&&inputNumber!=12&&inputNumber!=17){          System.out.println("您的输入有误,请输入要转换的文档类型前的数字");         }else          numFlag=false;        }          destinationFilesType=inputNumber;        //实行转换        c.change(sourceFilesPath, destinationFilesPath,destinationFilesType);        //测试各种类型转换      //  for(int i=0;i<25;i++){      //   destinationFilesType=i;      //   System.out.println("文件类型"+destinationFilesType);        //   System.out.println("存放目录:"+destinationFilesPath+"\\"+i);      //   mkdir(destinationFilesPath+"\\"+i);      //   change(sourceFilesPath, destinationFilesPath+"\\"+i,destinationFilesType);      //  }       }      }  


原创粉丝点击