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

原文链接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);  
    //  }  
     }  
    }  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值