求 office  痕迹 保留 签名 资料?(来者有分)

解决方案 »

  1.   

    office 啊
    www.xjtushare.com找找
      

  2.   

    呵呵,电子签章嘛,我也在搞,多交流!
    [email protected]
      

  3.   

    ActiveX WebOffice Version 1.0.0.2
    开发目的
    针对公司项目[辽河油田工程设计网上签署认证系统]的需要:需要将Office集成到浏览器以实现B/S模式下在线编辑Word等Office桌面办公软件的复合文档并加以操控[即:所见即所得].特提出满足功能如下:
    1. 在浏览器中针对Word等处理动作[在线打开,编辑,保存]
    2. 复合文档数据存储在企业数据库中
    3. 支持图件组态操作
    4. 修改留痕及版本控制
    技术总结
    1. ActiveDocument复合文档技术
    2. OfficeVBA
    3. OLE容器
    4. COM组件
    5. Code Sign
    6. 自动初始化安全组件种类
    7. 与企业级关系数据库交互接口说明[方法OpenDoc] void OpenDoc(void);
    描述:打开文档[文档为属性FileName指定的URL]
    [方法SaveDoc] void SaveDoc(void);
    描述:保存文档[文档为属性DesignFile指定的URL]
    [方法SetData] void SetData(void);
    描述:初始化数据[依据规则填充Word数据]
    [方法LoadUnit] void LoadUnit(void);
    描述:加载图元[图元路径在属性UnitName中指定,URL格式]
    [方法ShowDlg] void ShowDlg(SHORT iIndex);
    描述:显示Word的186个对话框[参数iIndex为对话框索引号]
    [方法SetField] void SetField(BSTR strFieldName, BSTR strFieldValue);
    描述:按照RFC1867文档规定,设置非二进制流格式数据[参数strFieldName为表单域名,strFieldValue为表单域值]
    [方法SetProtect] void SetProtect(SHORT iIndex, SHORT iProtect, LPCTSTR strPassword);
    描述:文档加锁[参数iIndex为节索引号,iProtect为是否加锁,strPassword为加锁(解锁)口令]
    [方法SetSign] void SetSign(BSTR strRule, BSTR strSign);
    描述:设置签名[strRule为签名位置[规则形如: #,1,1,2,#意为Word中第一表格1行2列],strSign为签名内容]
    [方法SetSignEx] void SetSignEx(BSTR strRule, BSTR strSign);
    描述:设置签名[strRule为签名位置[规则形如: #,1,1,2,#意为Word中第一表格1行2列],strSign为签名内容],并且收集表单数据提交Word文档[方法SetReadOnly] void SetReadOnly(BSTR strTrue);
    描述:设置Word是否只读[参数strTrue内容为布尔宏:True,False]
    [方法PrintPreview] void PrintPreview(void);
    描述:打印预览
    [方法SetTrack] void SetTrack(LPCTSTR strTrack);
    描述:显示隐藏留痕
    [方法SetTrackUser] void SetTrackUser(LPCTSTR strTrackUser);
    描述:设置应用文档用户
    [方法GetTableRow] SHORT GetTableRow(SHORT iTableIndex);
    描述:返回指定表格行数[参数为当前文档的表格索引号]
    [方法SetHead] void SetHead(LPCTSTR strHead);
    描述:设置页眉[参数为页眉内容][属性 FileName] BSTR FileName;
    描述:打开文件方法调用所需的URL[同时支持虚拟路径与物理路径]
    [属性 ReturnData] BSTR ReturnData;
    描述:依据规则返回格式化数据
    [属性 Rule] BSTR Rule;
    描述:规则
    [属性 InitData] BSTR InitData;
    描述:依据规则要初始化的数据
    [属性 DesignFile] BSTR DesignFile;
    描述:保存文件方法调用所需的URL[同时支持虚拟路径与物理路径]
    [属性 UnitName] BSTR UnitName;
    描述:图元路径URL[同时支持虚拟路径与物理路径]
    [属性 ServerName] BSTR ServerName;
    描述:Web Server的主机名称或者IP
    [属性 ServerPort] BSTR ServerPort;
    描述:Web Server提供服务的端口
    [属性 PageType] BSTR PageType;
    描述:Word的板式[横向,纵向]
    [属性 DocStatus] BSTR DocStatus;
    描述:控制文档是否可编辑注意事项
    1. 在引用前必须注册该WebOffice.ocx控件[如果从浏览器访问,会自动下载WebOffice.cab包注册:提示用户(证书警告)]
    手工注册可以用RegSvr32.exe WebOffice.ocx来注册
    或者采用控件提供的注册程序: RegOCX.exe来注册
    2. 该ActiveX在Win2000+Office2000环境下测试成功.开发环境为Visual Studio .NET
    3. 运行库支持:
    ASYCFILT.DLL, MFC70.DLL, MSVCR70.DLL, MSVCRT.DLL, OLEAUT32.DLL, OLEPRO32.DLL, STDOLE2.TLB, COMCAT.DLL
    说明:如果为WinNT系列用OLEAUT32.DLL,如果为Win9X系列用OLEPRO.DLL目前已经脱离运行库支持就可以运行了.
    4. 无网络环境时可以更改Hosts文件的IP映射来模拟网络或者添加
    Loopback协议
    5. 测试跟踪
    可以选用Visual Studio自带工具TSTCON32.EXE[测试], OLEVIEW.EXE[跟踪]来测试ActiveX的运行状态
    应用示例
    1. IE浏览器中应用ActiveX
    WebOffice.htm[客户端调用ActiveX示例]
    <table width='100%' border='0' cellpadding='0' cellspacing='0'>
      <tr>
        <td width="100%">
    <object id=DWebOffice style="left: 0px; width: 100%; top: 0px; height: 450px" classid="clsid:05430EC0-69CA-437A-B1F9-4B78B8647BEA" viewastext codebase="http://DigitalTitan:9003/ActiveX/WebOffice.cab#version=1,0,0,2">
    <!--<object id=DWebOffice style="left: 0px; width: 100%; top: 0px; height: 450px" classid="clsid:05430EC0-69CA-437A-B1F9-4B78B8647BEA" viewastext>-->
    <param name="_Version" value="65536">
    <param name="_ExtentX" value="6959">
    <param name="_ExtentY" value="2699">
    <param name="_StockProps" value="0">
    <param name="FileName" value="Http://DigitalTitan:9003/Attachment/Project_Design001.doc">
    <param name="Rule" value="#,2,1,2,#,2,2,2,#">
    <!--<param name="ReturnData" value="">-->
    <param name="InitData" value="#基础数据1#基础数据2#">
    <param name="VersionTrack" value="VersionTrack">
    <param name="DocStatus" value="DocStatus">
    <param name="DesignFile" value="">
    </object>
        </td>
      </tr>
      <tr>
        <td>
    <script>
    function SelectDot(self)
    {
    for(iIndex=0;iIndex<self.length;iIndex++)
    {
    if(self.options[iIndex].selected)
    {
    return self.options[iIndex].value;
    }
    }
    }
    </script>
    <select onchange="DWebOffice.FileName=SelectDot(this);">
    <option value="Http://DigitalTitan:9003/Attachment/DesignSave.doc">Http文件下载演示</option>
    </select>
    <input type="button" value="打开模板" onclick="DWebOffice.OpenDoc();">
    <input type="button" value="保存文档" onclick="DWebOffice.SaveDoc();">
    <input type="button" value="签名保存" onclick="DWebOffice.SetSignEx('#,1,1,2,#','同意');">
    <input type="button" value="初始数据" onclick="DWebOffice.SetData();">
    <input type="button" value="获取数据" onclick="window.confirm(DWebOffice.ReturnData);">
    <input type="button" value="设计签名" onclick="DWebOffice.SetSign('#,1,1,2,#','同意');">
    <input type="button" value="审核签名" onclick="DWebOffice.SetSign('#,1,2,2,#','同意');">
    <input type="button" value="领导意见" onclick="DWebOffice.SetSign('#,1,3,2,#','赞成');">
    <input type="button" value="主管部门" onclick="DWebOffice.SetSign('#,1,4,2,#','同意');">
    <input type="button" value="主管领导" onclick="DWebOffice.SetSign('#,1,5,2,#','同意');">
    <input type="button" value="公司意见" onclick="DWebOffice.SetSign('#,1,6,2,#','赞成');">
    <input type="button" value="只读设置" onclick="DWebOffice.SetReadOnly('True');">
    <input type="button" value="激活设置" onclick="DWebOffice.SetReadOnly('False');">
    <input type="button" value="打印预览" onclick="DWebOffice.PrintPreview();">
    <input type="button" value="显示留痕" onclick="DWebOffice.SetTrack('True');">
    <input type="button" value="隐藏留痕" onclick="DWebOffice.SetTrack('False');">
    <input type="button" value="设置用户" onclick="var strTrackUser;strTrackUser=window.prompt('输入用户名称','鲁西西');if(strTrackUser==null){DWebOffice.SetTrackUser('皮皮鲁');}else{DWebOffice.SetTrackUser(strTrackUser);}">
        </td>
      </tr>
      <tr>
        <td>
        </td>
      </tr>
      <tr>
        <td>
    <script>
    function SelectUnit(self)
    {
    for(iIndex=0;iIndex<self.length;iIndex++)
    {
    if(self.options[iIndex].selected)
    {
    return "Http://10.70.38.109:9003/Unit/"+self.options[iIndex].text;
    }
    }
    }
    </script>
      

  4.   

    <select onchange="DWebOffice.UnitName=SelectUnit(this);">
    <option value="">1寸半油管(短).bmp</option>
    <option value="">1寸半油管.bmp</option>
    <option value="">K型封隔器.bmp</option>
    <option value="">temp1.jpg</option>
    <option value="">temp2.jpg</option>
    <option value="">temp3.jpg</option>
    <option value="">X型封隔器.bmp</option>
    <option value="">Y型封隔器.bmp</option>
    <option value="">Z型封隔器.bmp</option>
    <option value="">丝堵.bmp</option>
    <option value="">丢手接头.bmp</option>
    <option value="">人工井底.bmp</option>
    <option value="">伸缩管.bmp</option>
    <option value="">侧孔式气举阀.bmp</option>
    <option value="">偏心配产器.bmp</option>
    <option value="">偏心配水器.bmp</option>
    <option value="">公丢手接头.bmp</option>
    <option value="">内挂式气举阀.bmp</option>
    <option value="">冲洗器.bmp</option>
    <option value="">减振器.bmp</option>
    <option value="">分水接头.bmp</option>
    <option value="">反洗滑套.bmp</option>
    <option value="">可捞式气举阀.bmp</option>
    <option value="">喇叭口.bmp</option>
    <option value="">喷嘴式压裂喷砂器.bmp</option>
    <option value="">回音标.bmp</option>
    <option value="">固定球座.bmp</option>
    <option value="">固定配水器.bmp</option>
    <option value="">堵塞器.bmp</option>
    <option value="">堵塞器滑套.bmp</option>
    <option value="">套管.bmp</option>
    <option value="">套管刮削器.bmp</option>
    <option value="">套管通径规.bmp</option>
    <option value="">套管鞋.bmp</option>
    <option value="">安全接头.bmp</option>
    <option value="">定位接头.bmp</option>
    <option value="">密封块.bmp</option>
    <option value="">导向丝堵.bmp</option>
    <option value="">射孔套管.bmp</option>
    <option value="">射流泵.bmp</option>
    <option value="">常关滑套.bmp</option>
    <option value="">常开滑套.bmp</option>
    <option value="">开关滑套.bmp</option>
    <option value="">弹簧扶正器.bmp</option>
    <option value="">扶正器.bmp</option>
    <option value="">抽油杆.bmp</option>
    <option value="">提放管柱式支撑卡瓦(作部件用1).bmp</option>
    <option value="">提放管柱式支撑卡瓦(作部件用2).bmp</option>
    <option value="">提放管柱式支撑卡瓦.bmp</option>
    <option value="">撞击接头.bmp</option>
    <option value="">旁通式气举阀.bmp</option>
    <option value="">普通管柱.jpg</option>
    <option value="">柱塞器.bmp</option>
    <option value="">标注.bmp</option>
    <option value="">标注线.bmp</option>
    <option value="">桥式配产器.bmp</option>
    <option value="">桥式配水器.bmp</option>
    <option value="">水力泵.bmp</option>
    <option value="">水泥塞.bmp</option>
    <option value="">油层(大).bmp</option>
    <option value="">油层(小).bmp</option>
    <option value="">油管(小).bmp</option>
    <option value="">油管(短).bmp</option>
    <option value="">油管.bmp</option>
    <option value="">泄油器.bmp</option>
    <option value="">泵.bmp</option>
    <option value="">活动接头.bmp</option>
    <option value="">活动球座.bmp</option>
    <option value="">液压支撑卡瓦.bmp</option>
    <option value="">滑套配产器.bmp</option>
    <option value="">滤砂筛管.bmp</option>
    <option value="">爆破滑套.bmp</option>
    <option value="">特殊管柱.bmp</option>
    <option value="">特殊管柱.jpg</option>
    <option value="">玻璃滑套.bmp</option>
    <option value="">电潜泵.bmp</option>
    <option value="">电缆.bmp</option>
    <option value="">电缆爆炸座封工具.bmp</option>
    <option value="">磁保护器.bmp</option>
    <option value="">空心桥塞悬挂器.bmp</option>
    <option value="">空心配水器.bmp</option>
    <option value="">筛管.bmp</option>
    <option value="">缓冲式压裂喷砂器.bmp</option>
    <option value="">脱接器.bmp</option>
    <option value="">解封座封打捞筒.bmp</option>
    <option value="">轨道滑套.bmp</option>
    <option value="">连接头.bmp</option>
    <option value="">金属绕丝管.bmp</option>
    <option value="">锚(作封隔器部件用).bmp</option>
    <option value="">锚.bmp</option>
    <option value="">阀式压裂喷砂器.bmp</option>
    <option value="">防顶卡瓦.bmp</option>
    <option value="">隔热油管.bmp</option>
    </select>
    <input type="button" value="加载图元" onclick="DWebOffice.LoadUnit();">
    <input type="button" value="图元路径" onclick="window.confirm(DWebOffice.UnitName);">
    <input type="button" value="显示对话" onclick="var iResult=window.prompt('请输入1-186的索引值:','80');DWebOffice.ShowDlg(1*iResult);">
    <input type="button" value="设置元素" onclick="DWebOffice.SetField('Field_User','DigitalTitan');">
    <input type="button" value="保护段落" onclick="try{DWebOffice.SetProtect(1,1,'password');}catch(e){}">
    <input type="button" value="表格行数" onclick="var iTableRows=0;var iTableIndex=0;iTableIndex=window.prompt('请输入表格索引号','2');try{iTableRows=DWebOffice.GetTableRow(iTableIndex);}catch(e){}window.confirm(iTableRows);">
    <input type="button" value="运行命令" onclick="var iSerial=17;iSerial=window.prompt('请输入命令索引号1-37','17');try{DWebOffice.RunCommand(iSerial);}catch(e){}">
    <input type="button" value="设置页眉" onclick="DWebOffice.SetHead('页眉啊页眉');">
        </td>
      </tr>
    </table>
    NewResult.jsp[Servlet端处理数据流示例]
    <%@ page contentType="text/html; charset=gb2312"%>
    <%@ include file="/DataIni/DataOpen.jsp"%>
    <%@ include file="/ScriptLib/Init.jsp"%>
    <%
    InputStream InData=null;
    int iSize,iLength;
    iLength=request.getContentLength();
    byte[] Buffer=new byte[iLength];
    byte[] Byte_File;
    if(iLength>0)
    {
    InData=request.getInputStream();
    String ContentType=request.getContentType();
    iSize=InData.read(Buffer);
    if(iSize!=-1)
    {
    //数据处理开始
    String FileData=new String(Buffer,"ISO8859-1");
    //
    //正则字串:"name=\"";
    //正则字串:"filename=\"";

    String strSplit=ContentType.substring(ContentType.lastIndexOf("=")+1,ContentType.length());
    String strSub[]=FileData.split(strSplit);
      

  5.   

    String strElement;
    int iBegin,iEnd;
    iBegin=0;iEnd=0;
    String FieldName,FieldValue;
    int bTrue;
    bTrue=0;
    int iPos;
    iPos=0;
    int iLocation;
    iLocation=0;
    for(int iIndex=0;iIndex<strSub.length;iIndex++)
    {
    strElement=strSub[iIndex];
    iBegin=strElement.indexOf("name=\"",0);
    if(iBegin!=-1)
    {
    iEnd=strElement.indexOf("\"",iBegin+6);
    FieldName=strElement.substring(iBegin+6,iEnd);
    iBegin=strElement.indexOf("filename=\"",0);
    if(iBegin!=-1)
    {
    bTrue=1;
    }
    //
    iEnd=strElement.indexOf("\r\n\r\n",0);
    if(bTrue==1)
    {
    iLocation=0;
    iPos=FileData.indexOf("filename=\"",iPos);
    iPos=FileData.indexOf("\r\n",iPos)+2;
    iLocation=FileData.indexOf(strSplit,iPos)-2;
    FieldValue=FileData.substring(iPos,iLocation);
    //FieldValue=FieldValue.replace('\255','\0');
    FieldValue=FieldValue.replaceAll("DigitalTitan","\0");
    Byte_File=FieldValue.getBytes("ISO8859-1");
    /*
    byte[] Byte_File_=FieldValue.getBytes();
    Byte_File=new byte[Byte_File_.length];
    for(int kIndex=0;kIndex<Byte_File_.length;kIndex++)
    {
    Byte_File[kIndex]=Buffer[iPos+0+kIndex];
    }
    */
    session.putValue(FieldName,Byte_File);
    }
    else
    {
    FieldValue=strElement.substring(iEnd+4);
    session.putValue(FieldName,FieldValue.substring(0,FieldValue.indexOf("\r\n")));
    }
    bTrue=0;
    }
    }
    //数据处理结束
    String Author,History;
    /*
    if((String)session.getValue("UserId")==null)
    {Author="Anonymous";}
    else
    {Author=(String)session.getValue("UserId");}
    */
    Author="Anonymous";
    java.util.Date m_Date=new java.util.Date(System.currentTimeMillis());
    History=m_Date.toString();

    boolean bDefault;
    int iC;
    oracle.sql.BLOB m_Blob;
    bDefault=odbcConn.getAutoCommit();
    odbcConn.setAutoCommit(false);
    odbcStmt.executeUpdate("insert into Project_Design(ID,Category,Subject,Body,Author,History) values(IDSERIAL.nextval,'"+(String)session.getValue("Category")+"','"+(String)session.getValue("Subject")+"',EMPTY_BLOB(),'"+Author+"','"+History+"')");
    odbcQuery="select * from Project_Design order by ID asc";
    odbcRs=odbcStmt___.executeQuery(odbcQuery);
    odbcRs.last();
    String iID=String.valueOf((int)odbcRs.getInt("ID"));
    odbcQuery="select Body from Project_Design where ID="+iID+" for Update";
    odbcRs=odbcStmt___.executeQuery(odbcQuery);
    if(odbcRs.next())
    {
    m_Blob=(oracle.sql.BLOB)odbcRs.getBlob("Body");
    BufferedOutputStream pOut=new BufferedOutputStream(m_Blob.getBinaryOutputStream());
    ByteArrayInputStream pIn=new ByteArrayInputStream((byte[])session.getValue("FieldName"));
    while((iC=pIn.read())!=-1)
    {pOut.write(iC);}
    pIn.close();
    pOut.close();
    }
    odbcConn.commit();
    odbcConn.setAutoCommit(bDefault);
    /*
    odbcQuery="select * from Project_BaseInfo where well_no='"+(String)session.getValue("WellNo")+"'";
    String bStatus;
    bStatus="false";
    odbcRs=odbcStmt.executeQuery(odbcQuery);
    if(odbcRs.next())
    {
    bStatus="true";
    }
    odbcRs.close();
    if(bStatus=="true")
    {
    String Base_Data[]=(String)session.getValue("WellNo").split(",");
    for(int oIndex=0;oIndex<Base_Data.length;oIndex++)
    {
    System.out.println(Base_Data[oIndex]);
    }
    //odbcStmt.executeUpdate("insert into Project_BaseInfo(ID,WHERE_POSITION,CREATE_POSITION,WELL_TYPE,WELL_LENGTH,WELL_DEPH_BY_DIG,WELL_DEPTH_BY_HAND,DATE_DIG,DATA_WELL,MAX_SIZE,WELL_NO) values(IDSERIAL.nextval,'"+(String)session.getValue("WellNo")+"')");
    }
    */
    System.out.println("->->->->->->->");
    //response.sendRedirect("/System/Project_Design/List.jsp");
    }
    }
    %>
    <html><head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <meta name="GENERATOR" content="Microsoft FrontPage 4.0">
    <meta name="ProgId" content="FrontPage.Editor.Document">
    <title></title>
    <link rel="stylesheet" type="text/css" href="/StyleLib/Default_Style_Sheet.css">
    </head><body onload="//window.alert('添加成功,请返回确认浏览!');//window.location.href='/System/Project_Design/List.jsp';">
    <%@ include file="/TemplateLib/Head.jsp"%>
    <%@ include file="/TemplateLib/Tail.jsp"%>
    <%@ include file="/DataIni/DataClose.jsp"%>
    </body></html>
    2. 应用程序中应用ActiveX
    等待完善
    1.目前程序不支持Office2003,因为不支持Unicode[目前发布版为ANSI]
    2.
      

  6.   

    欢迎交流心得.MSN:[email protected]
      

  7.   

    找一些Office开发的例子看看
    使用OleView看看Office组件提供的接口函数,呵呵
      

  8.   

    sinall() ( ) 信誉:97  2004-12-01 08:36:00  得分: 0  
       office 啊
    www.xjtushare.com找找
    在这个网站上输入office 没找到对应的资料,谢谢
    ----------------------------------
    pepsi1980(这只老鼠不会游泳) ( ) 信誉:97  2004-12-01 09:29:00  得分: 0  
     
     
       呵呵,电子签章嘛,我也在搞,多交流!
    [email protected]
    已发邮件,谢谢
    -----------------
     gjd111686(数字金刚) ( ) 信誉:146  ActiveX WebOffice Version 1.0.0.2
    不知这个控件是其他公司的,还是自己开发的,功能较全面
    对以下交流
    1. 在浏览器中针对Word等处理动作[在线打开,编辑,保存](ms 提供了一个 sample 应该可以稍加修改,即可完成)
    2. 复合文档数据存储在企业数据库中(IStream 和 ADO 的 IStream对象对应,我的第一想法)
    3. 支持图件组态操作(如果是office,直接用vba可直接操作图件)
    4. 修改留痕及版本控制(请教各位的)
    谢谢 数字金刚
    ------------------------------------对 电子签章,大家有没有更具体的意见,我粗略看了一下 goldgrid 提供的控件
    那个章,是一个 ax窗口透明控件难点是怎么保证其他人修改后,可直接标记出来,看了ms的文档,做法是用证书签名方式,这部分能直接用程序实现吗。
      
     
      

  9.   

    Word本身有流痕的功能,如果将手写图片放入后改动即可看到是否修改过.证书签名用程序来实现没有做过,应该可以的.利用Microsoft CryptoAPI就可以自己在会话中验证数字签名.
      

  10.   

    看是否有用http://www.vckbase.com/document/viewdoc/?id=975
      

  11.   

    用证书签名很简单,关键是要把证书发到各个终端(就是使用者的计算机)上面去就行了,证书签名用PKCS#7,CryptoAPI对这个实现得很好,签名以后可以脱离证书进行验证(其实是证书已经包含在签名里面了).不要按照上面URL的例子去做,直接用密钥的话及不方便又不实际,而且不具备移动性.