使用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

目录
相关文章
|
4月前
|
传感器 监控 安全
eFuse电子保险丝
热保险丝作为一种基本的电路保护器件,已经成功使用了150多年。热保险丝有效可靠、易用,具有各种不同的数值和版本,能够满足不同的设计目标。然而,对于寻求以极快的速度切断电流的设计人员来说,热保险丝不可避免的缺点就是其自复位能力,以及在相对较低的电流下的工作能力。对于这些设计人员来说,电子保险丝(通常用eFuse或者e-Fuse表示)是一种很好的解决方案,有时还可以取代热保险丝,但通常是对热保险丝功能的补充。 eFuse基于一个简单概念,即通过测量已知电阻器上的电压来检测电流,然后在电流超过设计限值时,通过场效应晶体管(FET)切断电流。eFuse具有热保险丝无法实现特性、灵活性和功能。 本文
eFuse电子保险丝
|
6月前
|
传感器 监控 安全
eFuse电子保险丝,需要了解的技术干货来啦
电子保险丝(eFuse)作为热保险丝的升级版,提供更快的反应速度(微秒至纳秒级)、低电流操作、可复位功能、反向电流和过压保护等优势。它们常用于需要快速保护的场景,如热插拔、汽车应用、PLC和电池管理。eFuse可以选择锁定或自动重启模式,根据应用需求调整。虽然可以使用分立组件构建基本的eFuse,但完整的IC解决方案更紧凑、稳定且功能丰富,通常包含多种保护特性,并已通过安全认证,适用于USB终端、笔记本电脑、服务器、可穿戴设备等多种应用。
192 4
|
存储 前端开发 JavaScript
完整电子病历源码
这是一套SaaS模式Java语言开发的云HIS系统的子系统云电子病历,本系统采用前后端分离模式开发和部署,支持电子病历四级,纯源码,支持二次开发。
756 1
完整电子病历源码
|
开发框架 Rust 前端开发
金牛座与电子#137
金牛座与电子#137
110 0
|
API 区块链
深交所发文鼓励电子签约!IPO支持电子签章
5月4日,深交所发布《关于支持实体经济若干措施的通知》(以下简称《通知》),支持企业采用电子签章办理业务。3月27日,上交所也表明文件信息披露因疫情影响无法及时提供实体签章的,可以暂以电子签章等代替,或者提交相关说明。
201 0
深交所发文鼓励电子签约!IPO支持电子签章
|
BI 流计算
“电子“ ”“”哪里有
“电子“ ”“”哪里有此外,为了帮助大家更加深入了解EMR StarRocks,我们推出了EMR StarRocks 白皮书,供各位小伙伴学习参考,免费下载! 白皮书下载:https://developer.aliyun.com/ebook/7585 内容一览表: ? StarRocks 新?代极速全场景 MPP 数据仓库 ? StarRocks 简介 ? StarRocks 架构 ? StarRocks 特性 ? StarRocks ?态与?具 ? 数据迁移 ? 数据摄? ? 湖仓?体 ? StarRocks X Flink ?态 ? StarRocks 场景解决?案 ? 固定报表业务 ?
|
传感器
可随身携带的电子乐队
可随身携带的电子乐队
可随身携带的电子乐队
|
存储 监控 安全
财税行业 | 电子发票
本文介绍了财税行业 | 电子发票的方案概述,方案价值及优势以及最佳实践。
财税行业 | 电子发票