• 使用iWebOffice实现电子签章


    摘要:随着信息化的发展电子签章已经越来越多的被用到很多OA系统中,今天就来看一下如何使用iWebOffice来实现电子签章功能。

    内容:

    1.iWebOffice2003的基本原理

    2.使用iWebOffice2003实现电子签章

    一、iWebOffice2003的基本原理

    在开始今天的主题之前先简单的说一下iWebOffice的原理。iWebOffice控件由两部分组成:一个是用于集成在页面上的iWebOffice2003.ocx文件,另一个是运行在后台服务器上的iMsgServer2000.dll文件。前者就是大家所熟知的ActiveX插件,当然要使用它在客户端必须安装此插件,后者是用于配合前者的请求进行通信,事实上控件工作的原来正是前后台通信和处理的过程。iWebOffice2003.ocx集成在页面上,通过js脚本调用,用户文档的编辑以及传递消息到服务器;iMsgServer2000.dll在服务器端运行,用于解析iWebOffice2003.ocx控件发过来的信息包,以及将服务器上处理的结果反馈给客户端iWebOffice2003.ocx

    iWebOfficePrinciple

    首先来看前端的代码,可以说同其他ActiveX几乎完全一样。classid是固定的,是控件的注册id,这也是所有com组件必须拥有的;codebase由两部分组成#version之前的是控件的下载地址,后面是控件版本号,这两者当然务必要写正确,否则会造成控件不能正常下载、显示和使用。

    前端页面代码:

    <OBJECT id="CWebOffice" width="100%" height="100%" classid="clsid:23739A7E-5741-4D1C-88D5-D50B18F7C347" codebase=" iWebOffice2003.ocx#version=6,0,0,4 " ></OBJECT>

    如果classid和version没有设置错的话运行会显示控件(前提是客户端安装了iWebOffice插件),当然此时还不能打开文档,因为前端还没有js调用。为了方便调用,这里将js操作部分加以封装(注意封装部分用到了Ext面向对象):

    /*
        Author:KenshinCui
        Date:2011.11.16
        Description:weboffice operate class.
    */
    Ext.useShims=true;
    Ext.namespace("Cmj.Web.ExtExtend");
    Cmj.Web.ExtExtend.WebOffice=Ext.extend(Ext.util.Observable,{
        constructor:function(config){
    //        this.addEvents("beforeopen");
    //        this.addEvents("open");
    //        this.addEvents("beforeprint");
    //        this.addEvents("print");
    //        this.addEvents("beforeopen");
    //        this.addEvents("open");
    //        this.addEvents("beforeopen");
    //        this.addEvents("open");
            this.listeners=config.listeners;
            Cmj.Web.ExtExtend.WebOffice.superclass.constructor.call(this,config);
    
            this.objectID=config.objectID;//客户端对象id
            this.webUrl=config.webUrl;//weboffice 的服務器端操作url
            this.fileName=config.fileName;//文件名称(不包含完整路径并且后缀可有可无,如果没有后缀的话则必须配置fileType属性)
            if(config.fileType!=void 0){
                this.fileType=config.fileType;
            }else{
                this.fileType="";
            }
            this.webOffice=Ext.getDom(this.objectID);
        },
        getObject:function(){
            return this.webOffice;
        },
        load:function(){
            WebOffice=this.webOffice;
            try{
                WebOffice.WebUrl=this.webUrl;
                WebOffice.RecordID="cid";
                WebOffice.Template="";
                WebOffice.FileName=this.fileName;
                WebOffice.FileType=this.fileType;
                WebOffice.EditType="1";
                WebOffice.UserName="SYSTEM";
    
                WebOffice.WebOpen();  	//打开该文档		
                window.status=WebOffice.Status;
            }catch(e){
                Ext.Msg.alert("系统提示","打开文档过程中发生错误,错误信息:"+e.message);
    	    }
        },
        showMenu:function(bool){
            try{
                this.webOffice.ShowMenu=bool?"1":"0";
            }catch(e){
                Ext.Msg.alert("系统提示","设置菜单显示状态时发生错误,错误信息:"+e.message);
            }
        },
        addMenus:function(menuArray){
            try
            {
                var menu=Ext.getDom('menuEventScript');
                for(var i=1;i<=menuArray.length;++i){
                    if(menuArray[i-1]=="save"){
                        this.webOffice.AppendMenu(i,"保存");
                        menu.text+="if(Index=="+i+"){Ext.getDom('CWebOffice').WebSave();}";    
                    }else if(menuArray[i-1]=="saveAs"){
                        this.webOffice.AppendMenu(i,"另存为");
                        menu.text+="if(Index=="+i+"){Ext.getDom('CWebOffice').WebSaveLocal();}";    
                    }else if(menuArray[i-1]=="print"){
                        this.webOffice.AppendMenu(i,"打印");
                        menu.text+="if(Index=="+i+"){Ext.getDom('CWebOffice').WebOpenPrint();}";    
                    }else if(menuArray[i-1]=="signature"){
                        this.webOffice.AppendMenu(i,"电子签章");
                        menu.text+="if(Index=="+i+"){Ext.getDom('CWebOffice').WebOpenSignature();}";    
                    }
                }
            }catch(e){
                Ext.Msg.alert("系统提示","创建菜单过程中发生错误,错误信息:"+e.message);
            }
        },
        save:function(){//保存到服务器
            try{
                this.webOffice.WebSave();
            }catch(e){
                Ext.Msg.alert("系统提示","文档保存时发生错误,错误信息:"+e.message);
            }
        },
        saveAs:function(){//另存到客户端
            try{
                this.webOffice.WebSaveLocal();
            }catch(e){
                Ext.Msg.alert("系统提示","文档另存时发生错误,错误信息:"+e.message);
            }
        },
        print:function(){
            try{
                this.webOffice.WebOpenPrint();
            }catch(e){
                Ext.Msg.alert("系统提示","文档打印时发生错误,错误信息:"+e.message);
            }
        },
        signature:function(type){//打开电子签章操作窗口
            try{
                if(arguments.length>0){
                    this.webOffice.WebOpenSignature(type);
                }else{
                    this.webOffice.WebOpenSignature();
                }
            }catch(e){
                Ext.Msg.alert("系统提示","打开电子签章窗口时发生错误,错误信息:"+e.message);
            }
        }
        
    });

    这里继承了Ext的Observable类方便对于事件管理(这里由于只是简单的演示因此事件部分注释掉了,需要的话可以加上)。首先在构造函数部分取得webOffice对象,getObject()方法用户向外部公开此对象。文档加载在load()方法中,从代码可以看出打开一个文档只需要设置WebUrl(后台http接口)、FileName(文件名)和Filetype(文件类型)属性,然后调用WebOpen()方法。值得一提的是addMenus()方法,这个方法用于创建菜单,但是注意菜单的创建是通过动态构建js动态创建的。正常使用菜单的方法是页面添加如下脚本(这里用到了控件的"OnMenuClick"事件):

    <script language="javascript" for=WebOffice event="OnMenuClick(vIndex,vCaption)">
    alert('编号:'+vIndex+'\n\r'+'条目:'+vCaption+'\n\r'+'请根据这些信息编写菜单具体功能');
        if (vIndex==10){ …};
    if (vIndex==11){ …};
        …
    </script>

    然后通过调用WebOffice的AppendMenu()方法进行添加:

    webform.WebOffice.AppendMenu("10","测试菜单一");
    webform.WebOffice.AppendMenu("11","测试菜单二");
    webform.WebOffice.AppendMenu("12","-");
    webform.WebOffice.AppendMenu("13","测试菜单四");
    webform.WebOffice.AppendMenu("14","测试菜单五");
    //其中:“-”表示分割线,增加的顺序是在现有按钮的最前面。
    webform.WebOffice.AppendMenu("主菜单","");	//添加主菜单:
    webform.WebOffice.AppendMenu("15","测试菜单七(&C)");
    webform.WebOffice.AppendMenu("16","测试菜单八(&D)");

    在WebOffice类中这部分代码及判断逻辑由js动态构建,实现菜单的可定制化。

    其他方法都比较简单,这里不再赘余。有了这个WebOffice.js类之后只需要简单调用即可:

            Ext.onReady(function(){
                var menus=["save","saveAs","print","signature"];
                var webOffice=new Cmj.Web.ExtExtend.WebOffice({objectID:'CWebOffice',webUrl:'HTTP://<%=host %>/WebOffice/OfficeServer.aspx',fileName:'<%=fileName %>',fileType:'<%= fileType%>'});
                webOffice.addMenus(menus);
                webOffice.load();
            });

    前端代码完成了,但是服务器端如何配合前端处理呢,下面的服务器端处理类OfficeServer:

    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.IO;
    using System.Text;
    using DBstep;
    
    namespace DigitalSignature.WebOffice
    {
        public partial class OfficeServer : System.Web.UI.Page
        {
            private iMsgServer2000 msgServer = null;//服务器端weboffice控件
            private const string _FilePath = @"Document\";
            private const string _signatureFilePath = @"Signature\";
            private string mMarkList = "KenshinCui";
            private byte[] mFileBody = null;//签章信息
            private string mOption;
            private string mRecordID;
            private string mTemplate;
            private string mFileName;
            private string mFileType;
    
            private string mHtmlName;
            private string mDirectory;
            private string mLabelName;
            private string mImageName;
            private string mCommand;
            protected void Page_Load(object sender, EventArgs e)
            {
                string mFilePath;
                string TemplateFilePath;
    
                msgServer = new iMsgServer2000();
                string currentPath = ".";
    
                msgServer.MsgVariant(Request.BinaryRead(Request.ContentLength));
    
                mFilePath = ConfigurationManager.AppSettings["TempFile"];   //取得文档的存放路径
                TemplateFilePath = ConfigurationManager.AppSettings["Template"]; //取得存放模版文件的路径
    
                if (mFilePath + "" == "")
                {
                    mFilePath = Server.MapPath("/") +_FilePath;
                }
    
                currentPath = mFilePath;
    
                string n = msgServer.GetMsgByName("DBSTEP");
                if (n.Equals("DBSTEP"))
                {
                    mOption = msgServer.GetMsgByName("OPTION");
    
                    if (mOption.Equals("LOADFILE"))						//请求调用文档
                    {
                        mRecordID = msgServer.GetMsgByName("RECORDID");		//取得文档编号
                        mFileName = msgServer.GetMsgByName("FILENAME");		//取得文档名称
                        mFileType = msgServer.GetMsgByName("FILETYPE");		//取得文档类型
                        mFilePath = mFilePath + mFileName;   //取得文档完整路径和名称
                        if (!Path.HasExtension(mFilePath))
                        {
                            mFilePath += mFileType;
                        }
                        msgServer.MsgTextClear();
                        if (msgServer.MsgFileLoad(mFilePath))	//调入文档
                        {
                            msgServer.SetMsgByName("STATUS", "打开成功!");	//设置状态信息
                            msgServer.MsgError("");		                //清除错误信息
                        }
                        else
                        {
                            msgServer.MsgError("打开失败!");		//设置错误信息
                        }
                    }
    
                    else if (mOption.Equals("SAVEFILE"))					//请求保存文档
                    {
                        mRecordID = msgServer.GetMsgByName("RECORDID");		//取得文档编号
                        mFileName = msgServer.GetMsgByName("FILENAME");		//取得文档名称
                        mFileType = msgServer.GetMsgByName("FILETYPE");		//取得文档类型
                        mFilePath = mFilePath + mFileName;   //取得文档完整路径和名称
                        if (!Path.HasExtension(mFilePath))
                        {
                            mFilePath += mFileType;
                        }
                        msgServer.MsgTextClear();
                        if (msgServer.MsgFileSave(mFilePath))				//保存文档内容
                        {
    
                            msgServer.SetMsgByName("STATUS", "保存成功!");	//设置状态信息
                            msgServer.MsgError("");						//清除错误信息
                        }
                        else
                        {
                            msgServer.MsgError("保存失败!" + mFileName);		//设置错误信息
                        }
                        msgServer.MsgFileClear();
                    }
    
                    else if (mOption.Equals("LOADTEMPLATE"))				//请求调用模板文档
                    {
                        mTemplate = msgServer.GetMsgByName("TEMPLATE");		//取得文档编号
                        mFileType = msgServer.GetMsgByName("FILETYPE");		//取得文档类型
                        mFilePath = currentPath;
    
                        mCommand = msgServer.GetMsgByName("COMMAND");
                        if (mCommand.Equals("INSERTFILE"))
                        {
                            msgServer.MsgTextClear();
                            if (msgServer.MsgFileLoad(mFilePath + mTemplate))	//调入模板文档
                            {
                                msgServer.SetMsgByName("STATUS", "打开模板成功!");		//设置状态信息
                                msgServer.MsgError("");		                //清除错误信息
                            }
                            else
                            {
                                msgServer.MsgError("打开模板失败!");		//设置错误信息
                            }
                        }
                        else
                        {
                            mFilePath = TemplateFilePath + mTemplate + mFileType;   //取得文档完整路径和名称
    
                            File.SetAttributes(mFilePath, FileAttributes.Normal);
    
                            msgServer.MsgTextClear();
                            if (msgServer.MsgFileLoad(mFilePath))			//调入模板文档
                            {
                                msgServer.SetMsgByName("STATUS", "打开模板成功!");		//设置状态信息
                                msgServer.MsgError("");		                //清除错误信息
                            }
                            else
                            {
                                msgServer.MsgError("打开模板失败!");		//设置错误信息
                            }
                            File.SetAttributes(mFilePath, FileAttributes.ReadOnly | FileAttributes.Archive | FileAttributes.Compressed);
                        }
    
                    }
    
                    else if (mOption.Equals("SAVETEMPLATE"))				//请求保存模板文档
                    {
                        mTemplate = msgServer.GetMsgByName("TEMPLATE");		//取得文档编号
                        mFileType = msgServer.GetMsgByName("FILETYPE");		//取得文档类型
                        mFilePath = TemplateFilePath + mTemplate + mFileType;   //取得文档完整路径和名称
    
                        File.SetAttributes(mFilePath, FileAttributes.Normal);
    
                        msgServer.MsgTextClear();
                        if (msgServer.MsgFileSave(mFilePath))			//调入模板文档
                        {
                            msgServer.SetMsgByName("STATUS", "保存模板成功!");		//设置状态信息
                            msgServer.MsgError("");		                //清除错误信息
                        }
                        else
                        {
                            msgServer.MsgError("保存模板失败!");		//设置错误信息
                        }
                        File.SetAttributes(mFilePath, FileAttributes.ReadOnly | FileAttributes.Archive | FileAttributes.Compressed);
                    }
    
                    else if (mOption.Equals("UPDATEFILE"))							//请求保存文档
                    {
                        mRecordID = msgServer.GetMsgByName("RECORDID");		//取得文档编号
                        mFileName = msgServer.GetMsgByName("FILENAME");		//取得文档名称
                        mFileType = msgServer.GetMsgByName("FILETYPE");		//取得文档类型
                        mFilePath = mFilePath + mFileName;   //取得文档完整路径和名称
                        msgServer.MsgTextClear();
                        if (msgServer.MsgFileSave(mFilePath))				//保存文档内容
                        {
                            msgServer.SetMsgByName("STATUS", "保存成功!");	    //设置状态信息
                            msgServer.MsgError("");						//清除错误信息
                        }
                        else
                        {
                            msgServer.MsgError("保存失败!");		//设置错误信息
                        }
                        msgServer.MsgFileClear();
                    }
    
                    else if (mOption.Equals("INSERTFILE"))						//请求调用正文文档
                    {
                        mRecordID = msgServer.GetMsgByName("RECORDID");		//取得文档编号
                        mFileName = msgServer.GetMsgByName("FILENAME");		//取得文档名称
                        mFileType = msgServer.GetMsgByName("FILETYPE");		//取得文档类型
                        mFilePath = mFilePath + mFileName;   //取得文档完整路径和名称
                        msgServer.MsgTextClear();
                        if (msgServer.MsgFileLoad(mFilePath))	//调入文档
                        {
                            msgServer.SetMsgByName("STATUS", "插入文件成功!");	//设置状态信息
                            msgServer.MsgError("");		                //清除错误信息
                        }
                        else
                        {
                            msgServer.MsgError("插入文件失败!");		//设置错误信息
                        }
                    }
    
                    else if (mOption.Equals("INSERTIMAGE"))         //请求调用正文文档
                    {
                        mFilePath = currentPath;
                        mRecordID = msgServer.GetMsgByName("RECORDID");		//取得文档编号
                        mLabelName = msgServer.GetMsgByName("LABLENAME");          //标签名
                        mImageName = msgServer.GetMsgByName("IMAGENAME");          //图片名
                        mFilePath = mFilePath + mImageName;        //图片在服务器的完整路径
                        mFileType = mImageName.Substring(mImageName.Length - 4, 4).ToLower();  //取得文件的类型
                        msgServer.MsgTextClear();
                        if (msgServer.MsgFileLoad(mFilePath))			//调入图片
                        {
                            msgServer.SetMsgByName("IMAGETYPE", mFileType);		//指定图片的类型 
                            msgServer.SetMsgByName("POSITION", mLabelName);		//设置插入的位置[书签对象名] 
                            msgServer.SetMsgByName("STATUS", "插入图片成功!");      //设置状态信息
                            msgServer.MsgError("");		                //清除错误信息
                        }
                        else
                        {
                            msgServer.MsgError("插入图片失败!");			//设置错误信息
                        }
                    }
    
                    else if (mOption.Equals("SAVEASHTML"))
                    {
                        mFilePath = currentPath;
                        mHtmlName = msgServer.GetMsgByName("HTMLNAME");		//取得标签文档内容
                        mDirectory = msgServer.GetMsgByName("DIRECTORY");	         //取得标签文档内容
                        msgServer.MsgTextClear();
                        if (mDirectory.Equals(""))
                        {
                            mFilePath = mFilePath + "\\HTML";
                        }
                        else
                        {
                            mFilePath = mFilePath + "\\HTML\\" + mDirectory;
                        }
                        msgServer.MakeDirectory(mFilePath);
                        if (msgServer.MsgFileSave(mFilePath + "\\" + mHtmlName))
                        {
    
                            string txt = msgServer.MsgTextBody();
    
                            byte[] biteBody = GetFileBody(mFilePath + "\\" + mHtmlName);
                            Encoding encode = Encoding.GetEncoding("gb2312");
    
                            string html = encode.GetString(biteBody);
    
                            msgServer.MsgError("");                               //清除错误信息
                            msgServer.SetMsgByName("STATUS", "保存成功");          //设置状态信息
                        }
                        else
                        {
                            msgServer.MsgError("保存失败" + mFilePath + "\\" + mHtmlName);                       //设置错误信息
                        }
                        msgServer.MsgFileClear();
                    }
    
                    else if (mOption.Equals("SAVEIMAGE"))
                    {
                        mFilePath = currentPath;
                        mHtmlName = msgServer.GetMsgByName("HTMLNAME");		//取得标签文档内容
                        mDirectory = msgServer.GetMsgByName("DIRECTORY");	         //取得标签文档内容
                        msgServer.MsgTextClear();
                        if (mDirectory.Equals(""))
                        {
                            mFilePath = mFilePath + "\\HTMLIMAGE";
                        }
                        else
                        {
                            mFilePath = mFilePath + "\\HTMLIMAGE\\" + mDirectory;
                        }
                        msgServer.MakeDirectory(mFilePath);
                        if (msgServer.MsgFileSave(mFilePath + "\\" + mHtmlName))
                        {
    
                            msgServer.MsgError("");                               //清除错误信息
                            msgServer.SetMsgByName("STATUS", "保存成功");          //设置状态信息
                        }
                        else
                        {
                            msgServer.MsgError("保存失败");                       //设置错误信息
                        }
                        msgServer.MsgFileClear();
                    }
                    else if (mOption.Equals("LOADMARKLIST"))//获取电子印章列表
                    {
                        if (LoadMarkList())
                        {									//获得列表信息mMarkList
                            msgServer.SetMsgByName("MARKLIST", mMarkList);				//显示签章列表(多个之间用换行符\r分割)
                            msgServer.MsgError("");								//清除错误信息
                        }
                        else
                        {
                            msgServer.MsgError("创建印章列表失败!");					//设置错误信息
                        }
    
                    }
                    else if (mOption.Equals("LOADMARKIMAGE"))//打开印章文件
                    {
                        string mMarkName = msgServer.GetMsgByName("IMAGENAME");				//取得签名名称
                        string mUserName = msgServer.GetMsgByName("USERNAME");				//取得用户名称
                        string mPassword = msgServer.GetMsgByName("PASSWORD");				//取得用户密码
                        msgServer.MsgTextClear();								//清除文本信息
                        if (LoadMarkImage(mMarkName, mPassword))
                        {
                            //调入签名信息mFileBody
                            //msgServer.SetMsgByName("IMAGETYPE", mFileType);			//设置签名类型
                            msgServer.SetMsgByName("IMAGETYPE", ".jpg");			//设置签名类型
                            msgServer.MsgFileBody(mFileBody);						//将签名信息打包
                            msgServer.SetMsgByName("POSITION", "Manager");			//设置插入位置
                            msgServer.SetMsgByName("STATUS", "打开成功!");				//设置状态信息
                            msgServer.MsgError("");								//清除错误信息
                        }
                        else
                        {
                            msgServer.MsgError("签名或密码错误!");					//设置错误信息
                        }
    
                    }
                    else if (mOption.Equals("SAVESIGNATURE"))//保存签章信息
                    {
                        //mRecordID = msgServer.GetMsgByName("RECORDID");				//取得文档编号
                        //mFileName = msgServer.GetMsgByName("FILENAME");				//取得文件名称
                        //mMarkName = msgServer.GetMsgByName("MARKNAME");				//取得签名名称
                        //mUserName = msgServer.GetMsgByName("USERNAME");				//取得用户名称
                        //mDateTime = msgServer.GetMsgByName("DATETIME");				//取得签名时间
                        //mHostName = Request.getRemoteAddr();						//取得用户IP
                        //mMarkGuid = msgServer.GetMsgByName("MARKGUID");				//取得唯一编号
                        //msgServer.MsgTextClear();								//清除文本信息
                        //if (SaveSignature())
                        //{									//保存签章信息进数据库
                        //    msgServer.SetMsgByName("STATUS", "保存印章成功!");			//设置状态信息
                        //    msgServer.MsgError("");								//清除错误信息
                        //}
                        //else
                        //{
                        //    msgServer.MsgError("保存印章失败!");						//设置错误信息
                        //}
    
                    }
                }
                else
                {
                    msgServer.MsgError("Error:packet message");
                    msgServer.MsgTextClear();
                    msgServer.MsgFileClear();
                }
                
                Response.BinaryWrite(msgServer.MsgVariant());
    
                Response.End();
            }
    
            private bool LoadMarkImage(string mMarkName, object mPassword)
            {
                if (Signature.HasRight(Session["userName"]+"",mPassword.ToString()))
                {
                    string picPath = Server.MapPath("/") + _signatureFilePath + mMarkName + ".jpg";
                    mFileBody = File.ReadAllBytes(picPath);
                    return true;
                }
                else
                {
                    return false;
                }
            }
    
            private bool LoadMarkList()
            {
                string tMarkList = Signature.GetMaskList();   //印章列表
                if (tMarkList + "" != string.Empty)
                {
                    mMarkList = tMarkList;
                    return true;
                }
                else
                {
                    return false;
                }
            }
    
            private byte[] GetFileBody(string strFullFileName)
            {
                byte[] file = new byte[0];
                FileInfo fInfo = new FileInfo(strFullFileName);
                if (fInfo.Exists == true)
                {
                    if ((fInfo.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
                    {
                        File.SetAttributes(strFullFileName, FileAttributes.Archive);
                    }
                }
                file = new byte[fInfo.Length];
                FileStream fs = new FileStream(strFullFileName, FileMode.Open);
                fs.Read(file, 0, (int)fInfo.Length);
    
                fs.Close();
    
                return file;
            }
        }
    }

    服务器端主要通过iMsgServer2000对象进行同前端的交互,前端执行某些操作时(注意是某些操作,并非所有操作都同服务器端交互,具体见iWebOffice白皮书)会向后端发送一个消息,服务器端通过iMsgServer2000对象的GetMsgByName()方法可以接收参数并根据不同参数配合前端做出相应的处理。例如加载文档时,当前端js调用WebOpen()方法时就会向服务器端传递一个名为"OPTION"的参数,通过这个参数可以判断要执行的操作类型,例如此时它的值等于"LOADFILE",服务器端就可以知道是要打开一个文档,当然此时也就知道它还会传递一些和打开文档相关的参数(例如FILENAME、FILETYPE)通过这些参数,服务器端构建一个完整的文件路径,然后调用MsgFileLoad()方法加载此文档,这时客户端就会打开此文档。当然,其他还有很多类似的操作,但是原理都是一样的,包括今天要说的电子签章。下面先看一下文档加载的后的截图:

     loadDocument

    二、使用iWebOffice2003实现电子签章

    在iWebOffice中一个电子签章操作包括三个交互过程,分别是:加载签章列表(LOADMARKLIST)、加载签章文件(LOADMARKIMAGE)、保存签章信息(SAVESIGNATURE

    LOADMARKLIST是加载签章列表的过程,在这个过程中服务器端需要通过iMsgServer2000对象的SetMsgByName()方法给客户端传递一个列表字符串(多个签章中间用换行符分割)。

    LOADMARKIMAGE是加载签章文件的过程,有了签章名称客户端就可以选择相应的签章,但是选择了签章名称之后需要加载对应的签章文件(事实上是一个图片),加载签章文件的过程就发生这个阶段。在这个过程中服务器端的任务就是根据签章名称加载对应的文件,然后使用iMsgServer2000对象的MsgFileBody()方法将文件的字节流返回给客户端。注意这个过程中客户端需要输入密码,因此签章的权限验证部分可以在此进行处理。

    SAVESIGNATURE是保存签章信息的过程,对于签章操作后的信息可以在此时进行保存(例如文档编号、文件名称、签章名称、签章日期等可以在此时记录到数据库),在本例中由于没有使用数据库因此就不对签章信息进行保存了。

    这三个过程处理好之后,客户端使用时只需要调用WebOffice对象的WebOpenSignature()方法即可调出电子签章管理界面,下面是界面窗口:

     signatureWindow

    通过上面的窗口可以看出,在iWebOffice中电子签章的不仅包括印章还包括签名、批注。从签章列表中选择一个签章,然后输入密码,点"盖章",此时就会从服务器端加载对应的签章文件:

     signatureWindowLoadFile

    点击确定就可以添加到文档中:

     documentSignature

    在看两张手写签名效果:

     signatureWindowHandwriting

    documentHandWritingSignature

    当然添加过签章之后需要对文档进行保存,不过注意文档保存到客户端还是服务器端,在本例中的"保存"是将文档在服务器端进行保存,"另存为"即保存到客户端。

    好了,今天就到这里,附上源代码下载(由于iWebOffice是一款商业付费软件,因此源代码中不提供相关控件):download

    知识共享许可协议 作品采用知识共享署名 2.5 中国大陆许可协议进行许可,欢迎转载,演绎或用于商业目的。但转载请注明来自崔江涛(KenshinCui),并包含相关链接。
  • 相关阅读:
    解读express框架
    mongodb学习
    Express框架
    如何添加第三方路由进度条?
    商品删除、添加login和register组件
    商品编辑实操(上文三种方法验证)
    实现添加商品页面,并且构建路由
    与json-server对接,为组件提供CRUD API功能
    json-server学习
    jQuery核心
  • 原文地址:https://www.cnblogs.com/kenshincui/p/2267497.html
Copyright © 2020-2023  润新知