使用iWebOffice实现电子签章

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

内容:

1.iWebOffice2003的基本原理

2.使用iWebOffice2003实现电子签章

一、iWebOffice2003的基本原理

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

首先来看前端的代码,可以说同其他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()方法加载此文档,这时客户端就会打开此文档。当然,其他还有很多类似的操作,但是原理都是一样的,包括今天要说的电子签章。下面先看一下文档加载的后的截图:

 

二、使用iWebOffice2003实现电子签章

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

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

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

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

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

 

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

 

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

 

在看两张手写签名效果:

 

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

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

时间: 2024-09-14 20:18:54

使用iWebOffice实现电子签章的相关文章

武汉硚口区政府公文条码及电子签章方案

一.背景 武汉市硚口区政府(简:硚口区)信息化建设在整个武汉市区级单位中一直处于领先的位置,信息化应用早.范围广.硚口区在2004年初成功应用金格电子签章系统,主要应用于公文传输系统,通过电子签章系统保护各个单位电子公文内容安全交换,也同时解决传统签章难的问题.硚口区电子签章系统经过三年成功应用到今,由于信息化快速发展,各种外部环境(硬件和软件)无断升级,如电子公文交换系统.WINDOWS操作系统.OFFICE办公系统.第三方应用系统的升级,目前硚口区公文文档格式由原来的Office 2003变

某市党委电子签章应用案例

一.项目介绍 乌鲁木齐市受地理位置限制,以前党委下发一份公文,最快也要一两天的时间,而且采用传统的盖章模式,一个公务员要打印出文件然后找各级领导盖章签字,所有流程完了后,然后拿文件去复印下发,这样使用的时间将大大延长,如果公文比较急,就很容易出现问题.为了解决这一问题,乌鲁木齐市党委积极推进政府电子政务建设,同时也是适应改革开放和现代化建设对政府工作管理创新的要求,是增强政府工作科学性.协调性和民主性,转变政府职能,全面提高依法行政能力的重要手段,是实现社会公众资源共享.提高社会资源利用效率,加

金格科技国资委系统电子签章系统方案

随着办公自动化中对文档的安全性.真实性的要求不断的提高,特别是针对手写签名.电子印章需求更加严格,要求在Word/Excel文档上签名.盖章,需要实现 多人会签.签章可验证.可认证.防抵赖等功能.江西金格网络科技公司根据实际情况,自行研制开发了iSignature 手写签名电子印章系统软件(简称:iSignature电子签章系统).该系统采用信息加密和数据压缩处理技术,可靠性好,扩展性强,适用于政府.企业在公文处理中的应用. 手写签名电子印章软件由签章钥匙盘和软件构成,签章钥匙盘自带CPU.快速

聊城市政府电子签章系统成功案例

聊城市地处山东西部,在经济地位上也许并不如胶东地区,但是政府信息化建设中却一直处于山东的前列.为了规范未来的政府电子政务建设,市政府出台了<关于印发聊城市国民经济和社会信息化"十一五"发展规划的通知>,对未来的电子政务建设有个明确的建议. 聊城市政府在积极推进"数字聊城"电子政务工程建设中,关注到现阶段的电子政务建设主要是实现了电子政务运行的通道.公文传递的方法,公文最后能不能在电子政务系统中运行还缺乏一个重要的电子签章系统来保障文档的合法安全,来确定文

word-关于电子签章的一个问题,

问题描述 关于电子签章的一个问题, 有哪位大神做过网页电子签章啊,谁能告诉我一下思路啊,或者提供一下工具也行,实在不知道,也可以提供一下如何让网页中的表单转化为Word文档 解决方案 可以考虑一下使用NTKO.

金格电子签章解决方案广铁集团应用案例

广铁集团的计算机应用始于70年代初期,1979年计算中心成立后,计算机应用逐步走上正轨.1983年,在铁路系统率先实现18点统计计算机化,大大提高了工作效率和统计数据的准确性,以后又开展了多项计算机应用,使计算机技术不断渗透到工作的各个领域.经过20余年的发展,广铁集团的计算机应用实现了从无到有.从小到大.从单机应用到向网络化.集成化发展,基本实现了车站.分局.路局.铁道部四级联网,信息的采集.传输.综合处理实现了计算机化,信息化框架已基本形成.经过近几年的发展,广铁集团已经有一套比较完整的围绕

求购电子签章软件源代码!

问题描述 现有一项目用到,求购源代码QQ2202386要求能够多word文档签章!!

求购电子签章软件源码

问题描述 主要是office和PDF盖章.联系方式:donglmail@sohu.com 解决方案 本帖最后由 dowin2000 于 2009-08-11 12:58:01 编辑

模拟电子签章盖章效果的jQuery插件源码_jquery

客户提了个需求,需要在已审核的文档上加盖公章,网上找了找没有现成的,自己动手丰衣足食 老规矩,上图看效果:          可以内嵌在各种容器中,已包装成jQuery插件,调用方便.点击"盖章"按钮添加一个新章,可以自由拖动位置,点击确定后保存并触发回调函数方便处理保存,有需要的下载试试. [javascript] 复制代码 代码如下: /*    desc:jQuery模拟盖章    author:hyf    date:2012-11-08*/ ;$.fn.zSign = fun