简要说明:
jacob.dll 放到 C:\WINDOWS\system32 下
jacob.dll 放到 %JAVA_HOME%\bin 下,这个比较关键,决定你项目启动时候是否报错的问题
jacob.jar 放到应用开发项目的 lib里面
我使用的Jacob版本是jacob_1.9
以下是我在实际开发中写的一个实现类
package cn.com.ivisions.management; import java.io.*; import java.net.URL; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import cn.com.ivisions.dipper2.Dipper; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant; import cn.com.ivisions.management.DocManage; public class COMBridge { private static final Log log = LogFactory.getLog(COMBridge.class); lugb.util.NamedIndexedHashMap constants = Dipper.getConfigInfo().getConstants(); //方正公章服务器地址 private String Founder_Host = constants.get("SEAL_SERVER").toString(); //判断CEB是否盖章文件 public boolean isCertifiedCEB(String fileurl) { try { String test1=getCEBID(fileurl); if(test1==null) { return false; } if(getCEBID(fileurl).equals(getCEBID(fileurl))) { return true; } else { return false; } } catch(Exception e) { return false; } } //得到CEB的UUID public String getCEBID(String fileurl) { try { ActiveXComponent objArchSend = new ActiveXComponent("PrintURLChangeSvr.ChangePrintURL"); Dispatch myCom = (Dispatch) objArchSend.getObject(); String returnString = Dispatch.call(myCom, "ChangeURL",fileurl, "http://"+Founder_Host).getString(); //objArchSend.release(); return returnString; } catch(Exception e) { return ""; } } //生成XML jason public boolean getPrintXml(String strXml,String XmlUrl) { ActiveXComponent objArchSend = new ActiveXComponent("StampPubCom.StampPubFuncCom"); Dispatch myCom = (Dispatch) objArchSend.getObject(); try { Dispatch.call(myCom, "BSTR2File",strXml,XmlUrl).getString(); // System.out.println(Dispatch.call(myCom, "GetErrorMessage").getString()); //objArchSend.release(); return true; } catch(Exception e) { System.out.println(Dispatch.call(myCom, "GetErrorMessage").getString()); e.printStackTrace(); return false; } } //上传公文分数XML到公章服务器 public boolean uploadCountXml(String XmlUrl) { ActiveXComponent objArchSend = new ActiveXComponent("LocalSealStamp.ConductFile"); Dispatch myCom = (Dispatch) objArchSend.getObject(); try { Dispatch.call(myCom, "HTTPUploadFile",XmlUrl, "http://"+Founder_Host+"/stampserver/extend/interfaces/printlic2db.aspx").getString(); // System.out.println(Dispatch.call(myCom, "GetErrorMessage").getString()); //objArchSend.release(); return true; } catch(Exception e) { System.out.println(Dispatch.call(myCom, "GetErrorMessage").getString()); e.printStackTrace(); return false; } } //上传XML到OA服务器 public boolean uploadFileforXml(String XmlUrl,String serverURL) { ActiveXComponent objArchSend = new ActiveXComponent("ASPCom.PostRecv"); Dispatch myCom = (Dispatch) objArchSend.getObject(); try { Dispatch.call(myCom, "HTTPUploadFile",XmlUrl, serverURL).getString(); return true; } catch(Exception e) { System.out.println(Dispatch.call(myCom, "GetErrorMessage").getString()); e.printStackTrace(); return false; } } //文件上传到服务器的方法 public boolean SendFileEx(String strURL,String strRetFileName) { try { // System.runFinalizersOnExit(true); ActiveXComponent objArchSend = new ActiveXComponent("ASPCom.PostRecv"); Dispatch myCom = (Dispatch) objArchSend.getObject(); Variant vResult = Dispatch.call(myCom, "SendFile", new Variant(strURL), new Variant(strRetFileName) ); Variant vResult1 = Dispatch.call(myCom, "GetErrorMessage"); int nRes = vResult.getInt(); String strError = vResult1.getString(); //objArchSend.release(); // if(nRes == SysConfig.RET) return true; if(strError != null && strError.equals("S_OK")) return true; return false; } catch(Exception e) { e.printStackTrace(); return false; } } //JAVA实现的文化下载 Jason public void downloadFile(String urls,String strRetFileName) throws IOException{ URL url=new URL(urls); InputStream in= url.openConnection().getInputStream(); File file=new File(strRetFileName); FileOutputStream out=new FileOutputStream(file,true); //计数器 int counter=0; //开始读 int ch; byte[] buffer=new byte[1024]; while((ch=in.read(buffer))!=-1){ out.write(buffer,0,ch); counter+=ch; } out.flush(); in.close(); out.close(); } //文件下载到本地的方法 public boolean HTTPDownloadFile(String strURL,String strRetFileName) { try { // System.runFinalizersOnExit(true); ActiveXComponent objArchSend = new ActiveXComponent("ASPCom.PostRecv"); Dispatch myCom = (Dispatch) objArchSend.getObject(); Variant vResult = Dispatch.call(myCom, "HTTPDownloadFile", new Variant(strURL), new Variant(strRetFileName) ); Variant vResult1 = Dispatch.call(myCom, "GetErrorMessage"); int nRes = vResult.getInt(); String strError = vResult1.getString(); //objArchSend.release(); // if(nRes == SysConfig.RET) return true; if(strError != null && strError.equals("S_OK")) return true; return false; } catch(Exception e) { e.printStackTrace(); return false; } } //删除本机的各种临时文件 jason public void deleteTempFile(String fileUrl) { ActiveXComponent objArchSend = new ActiveXComponent("StampPubCom.StampPubFuncCom"); Dispatch myCom = (Dispatch) objArchSend.getObject(); try { Dispatch.call(myCom, "DeleteFile",fileUrl).getString(); } catch(Exception e) { System.out.println(Dispatch.call(myCom, "GetErrorMessage").getString()); e.printStackTrace(); } } public boolean sendXmlToFounder(int docId,String serverPath,String serverProPath){ try{ COMBridge com=new COMBridge(); DocManage docManage=new DocManage(); //打印份数 String printNum = constants.get("PRINT_NUM").toString(); //文档后缀名 String sealGwExtend = constants.get("SEAL_GW_EXTEND").toString(); //默认下载路径 String download_dir = constants.get("DOWNLOAD_DIR").toString(); //获得主送和抄送单位 String receiveDept = docManage.getReceiveDepts(docId); String printNums = ""; for(int i=0;i<receiveDept.split(";").length;i++){ printNums += printNum+";"; } if(printNums.length()>0) printNums = printNums.substring(0,printNums.length()-1); //获得公文附件是ceb的附件 String[] attachFile = docManage.getAttachment(docId,sealGwExtend); for(int i=0;i<attachFile.length;i++){ String cebfileName=attachFile[i]; String fileurl=download_dir+cebfileName; String remoteFileUrl=serverPath+"/files/upload/"+cebfileName; //下载ceb文件到本地 com.downloadFile(remoteFileUrl,fileurl); //获取CEBID String cebId=com.getCEBID(fileurl); //拼装方正公章接口的XML String strXml = "<?xml version = \"1.0\" encoding=\"gb2312\"?>"; strXml +="<Doc>"; strXml +="<DocumentID>"+cebId+"</DocumentID>"; strXml +="<Receivers>"+receiveDept+"</Receivers>"; strXml +="<PrnNums>"+printNums+"</PrnNums>"; strXml +="<SendType>1</SendType>"; strXml +="<Count>"+receiveDept.split(";").length+"</Count>"; strXml +="</Doc>"; log.info("strXml==="+strXml); String xmlFileName=docId+"["+i+"]"+".xml"; String xmlUrl=download_dir+xmlFileName; //生成本地的XML boolean flag1=com.getPrintXml(strXml,xmlUrl); String strURL="http://"+Founder_Host+"/stampserver/extend/interfaces/PrintLic2DB.aspx"; //上传本地的XML到方正公章服务器 boolean flag2=com.SendFileEx(strURL, xmlUrl); String strOAURL=serverProPath+"/apabi/upload.jsp?fileName="+xmlFileName; //上传本地的XML到OA服务器 boolean flag3=com.uploadFileforXml(xmlUrl,strOAURL); //删除本机的各种临时文件包括下载的CEB和生成的XML deleteTempFile(fileurl); deleteTempFile(xmlUrl); } return true; }catch(Exception ex){ ex.printStackTrace(); return false; } } }