摘要:随着資訊化的發展電子簽章已經越來越多的被用到很多oa系統中,今天就來看一下如何使用iweboffice來實作電子簽章功能。
内容:
1.iweboffice2003的基本原理
2.使用iweboffice2003實作電子簽章
在開始今天的主題之前先簡單的說一下iweboffice的原理。iweboffice控件由兩部分組成:一個是用于內建在頁面上的iweboffice2003.ocx檔案,另一個是運作在背景伺服器上的imsgserver2000.dll檔案。前者就是大家所熟知的activex插件,當然要使用它在用戶端必須安裝此插件,後者是用于配合前者的請求進行通信,事實上控件工作的原來正是前背景通信和處理的過程。iweboffice2003.ocx內建在頁面上,通過js腳本調用,使用者文檔的編輯以及傳遞消息到伺服器;imsgserver2000.dll在伺服器端運作,用于解析iweboffice2003.ocx控件發過來的資訊包,以及将伺服器上處理的結果回報給用戶端iweboffice2003.ocx。
首先來看前端的代碼,可以說同其他activex幾乎完全一樣。classid是固定的,是控件的注冊id,這也是所有com元件必須擁有的;codebase由兩部分組成#version之前的是控件的下載下傳位址,後面是控件版本号,這兩者當然務必要寫正确,否則會造成控件不能正常下載下傳、顯示和使用。
前端頁面代碼:
<code><</code><code>object</code> <code>id="cweboffice" width="100%" height="100%" classid="clsid:23739a7e-5741-4d1c-88d5-d50b18f7c347" codebase=" iweboffice2003.ocx#version=6,0,0,4 " ></</code><code>object</code><code>></code>
如果classid和version沒有設定錯的話運作會顯示控件(前提是用戶端安裝了iweboffice插件),當然此時還不能打開文檔,因為前端還沒有js調用。為了友善調用,這裡将js操作部分加以封裝(注意封裝部分用到了ext面向對象):
<code>/*</code>
<code> </code><code>author:kenshincui</code>
<code> </code><code>date:2011.11.16</code>
<code> </code><code>description:weboffice operate class.</code>
<code>*/</code>
<code>ext.useshims=</code><code>true</code><code>;</code>
<code>ext.namespace(</code><code>"cmj.web.extextend"</code><code>);</code>
<code>cmj.web.extextend.weboffice=ext.extend(ext.util.observable,{</code>
<code> </code><code>constructor:</code><code>function</code><code>(config){</code>
<code>// this.addevents("beforeopen");</code>
<code>// this.addevents("open");</code>
<code>// this.addevents("beforeprint");</code>
<code>// this.addevents("print");</code>
<code> </code><code>this</code><code>.listeners=config.listeners;</code>
<code> </code><code>cmj.web.extextend.weboffice.superclass.constructor.call(</code><code>this</code><code>,config);</code>
<code> </code><code>this</code><code>.objectid=config.objectid;</code><code>//用戶端對象id</code>
<code> </code><code>this</code><code>.weburl=config.weburl;</code><code>//weboffice 的服務器端操作url</code>
<code> </code><code>this</code><code>.filename=config.filename;</code><code>//檔案名稱(不包含完整路徑并且字尾可有可無,如果沒有字尾的話則必須配置filetype屬性)</code>
<code> </code><code>if</code><code>(config.filetype!=void 0){</code>
<code> </code><code>this</code><code>.filetype=config.filetype;</code>
<code> </code><code>}</code><code>else</code><code>{</code>
<code> </code><code>this</code><code>.filetype=</code><code>""</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>this</code><code>.weboffice=ext.getdom(</code><code>this</code><code>.objectid);</code>
<code> </code><code>},</code>
<code> </code><code>getobject:</code><code>function</code><code>(){</code>
<code> </code><code>return</code> <code>this</code><code>.weboffice;</code>
<code> </code><code>load:</code><code>function</code><code>(){</code>
<code> </code><code>weboffice=</code><code>this</code><code>.weboffice;</code>
<code> </code><code>try</code><code>{</code>
<code> </code><code>weboffice.weburl=</code><code>this</code><code>.weburl;</code>
<code> </code><code>weboffice.recordid=</code><code>"cid"</code><code>;</code>
<code> </code><code>weboffice.template=</code><code>""</code><code>;</code>
<code> </code><code>weboffice.filename=</code><code>this</code><code>.filename;</code>
<code> </code><code>weboffice.filetype=</code><code>this</code><code>.filetype;</code>
<code> </code><code>weboffice.edittype=</code><code>"1"</code><code>;</code>
<code> </code><code>weboffice.username=</code><code>"system"</code><code>;</code>
<code> </code><code>weboffice.webopen(); </code><code>//打開該文檔 </code>
<code> </code><code>window.status=weboffice.status;</code>
<code> </code><code>}</code><code>catch</code><code>(e){</code>
<code> </code><code>ext.msg.alert(</code><code>"系統提示"</code><code>,</code><code>"打開文檔過程中發生錯誤,錯誤資訊:"</code><code>+e.message);</code>
<code> </code><code>showmenu:</code><code>function</code><code>(bool){</code>
<code> </code><code>this</code><code>.weboffice.showmenu=bool?</code><code>"1"</code><code>:</code><code>"0"</code><code>;</code>
<code> </code><code>ext.msg.alert(</code><code>"系統提示"</code><code>,</code><code>"設定菜單顯示狀态時發生錯誤,錯誤資訊:"</code><code>+e.message);</code>
<code> </code><code>addmenus:</code><code>function</code><code>(menuarray){</code>
<code> </code><code>try</code>
<code> </code><code>{</code>
<code> </code><code>var</code> <code>menu=ext.getdom(</code><code>'menueventscript'</code><code>);</code>
<code> </code><code>for</code><code>(</code><code>var</code> <code>i=1;i<=menuarray.length;++i){</code>
<code> </code><code>if</code><code>(menuarray[i-1]==</code><code>"save"</code><code>){</code>
<code> </code><code>this</code><code>.weboffice.appendmenu(i,</code><code>"儲存"</code><code>);</code>
<code> </code><code>menu.text+=</code><code>"if(index=="</code><code>+i+</code><code>"){ext.getdom('cweboffice').websave();}"</code><code>; </code>
<code> </code><code>}</code><code>else</code> <code>if</code><code>(menuarray[i-1]==</code><code>"saveas"</code><code>){</code>
<code> </code><code>this</code><code>.weboffice.appendmenu(i,</code><code>"另存為"</code><code>);</code>
<code> </code><code>menu.text+=</code><code>"if(index=="</code><code>+i+</code><code>"){ext.getdom('cweboffice').websavelocal();}"</code><code>; </code>
<code> </code><code>}</code><code>else</code> <code>if</code><code>(menuarray[i-1]==</code><code>"print"</code><code>){</code>
<code> </code><code>this</code><code>.weboffice.appendmenu(i,</code><code>"列印"</code><code>);</code>
<code> </code><code>menu.text+=</code><code>"if(index=="</code><code>+i+</code><code>"){ext.getdom('cweboffice').webopenprint();}"</code><code>; </code>
<code> </code><code>}</code><code>else</code> <code>if</code><code>(menuarray[i-1]==</code><code>"signature"</code><code>){</code>
<code> </code><code>this</code><code>.weboffice.appendmenu(i,</code><code>"電子簽章"</code><code>);</code>
<code> </code><code>menu.text+=</code><code>"if(index=="</code><code>+i+</code><code>"){ext.getdom('cweboffice').webopensignature();}"</code><code>; </code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code> </code><code>ext.msg.alert(</code><code>"系統提示"</code><code>,</code><code>"建立菜單過程中發生錯誤,錯誤資訊:"</code><code>+e.message);</code>
<code> </code><code>save:</code><code>function</code><code>(){</code><code>//儲存到伺服器</code>
<code> </code><code>this</code><code>.weboffice.websave();</code>
<code> </code><code>ext.msg.alert(</code><code>"系統提示"</code><code>,</code><code>"文檔儲存時發生錯誤,錯誤資訊:"</code><code>+e.message);</code>
<code> </code><code>saveas:</code><code>function</code><code>(){</code><code>//另存到用戶端</code>
<code> </code><code>this</code><code>.weboffice.websavelocal();</code>
<code> </code><code>ext.msg.alert(</code><code>"系統提示"</code><code>,</code><code>"文檔另存時發生錯誤,錯誤資訊:"</code><code>+e.message);</code>
<code> </code><code>print:</code><code>function</code><code>(){</code>
<code> </code><code>this</code><code>.weboffice.webopenprint();</code>
<code> </code><code>ext.msg.alert(</code><code>"系統提示"</code><code>,</code><code>"文檔列印時發生錯誤,錯誤資訊:"</code><code>+e.message);</code>
<code> </code><code>signature:</code><code>function</code><code>(type){</code><code>//打開電子簽章操作視窗</code>
<code> </code><code>if</code><code>(arguments.length>0){</code>
<code> </code><code>this</code><code>.weboffice.webopensignature(type);</code>
<code> </code><code>}</code><code>else</code><code>{</code>
<code> </code><code>this</code><code>.weboffice.webopensignature();</code>
<code> </code><code>ext.msg.alert(</code><code>"系統提示"</code><code>,</code><code>"打開電子簽章視窗時發生錯誤,錯誤資訊:"</code><code>+e.message);</code>
<code> </code><code>}</code>
<code> </code>
<code>});</code>
這裡繼承了ext的observable類友善對于事件管理(這裡由于隻是簡單的示範是以事件部分注釋掉了,需要的話可以加上)。首先在構造函數部分取得weboffice對象,getobject()方法使用者向外部公開此對象。文檔加載在load()方法中,從代碼可以看出打開一個文檔隻需要設定weburl(背景http接口)、filename(檔案名)和filetype(檔案類型)屬性,然後調用webopen()方法。值得一提的是addmenus()方法,這個方法用于建立菜單,但是注意菜單的建立是通過動态建構js動态建立的。正常使用菜單的方法是頁面添加如下腳本(這裡用到了控件的"onmenuclick"事件):
<code><script language=</code><code>"javascript"</code> <code>for</code><code>=weboffice event=</code><code>"onmenuclick(vindex,vcaption)"</code><code>></code>
<code>alert(</code><code>'編号:'</code><code>+vindex+</code><code>'\n\r'</code><code>+</code><code>'條目:'</code><code>+vcaption+</code><code>'\n\r'</code><code>+</code><code>'請根據這些資訊編寫菜單具體功能'</code><code>);</code>
<code> </code><code>if</code> <code>(vindex==10){ …};</code>
<code>if</code> <code>(vindex==11){ …};</code>
<code> </code><code>…</code>
<code></script></code>
然後通過調用weboffice的appendmenu()方法進行添加:
<code>webform.weboffice.appendmenu(</code><code>"10"</code><code>,</code><code>"測試菜單一"</code><code>);</code>
<code>webform.weboffice.appendmenu(</code><code>"11"</code><code>,</code><code>"測試菜單二"</code><code>);</code>
<code>webform.weboffice.appendmenu(</code><code>"12"</code><code>,</code><code>"-"</code><code>);</code>
<code>webform.weboffice.appendmenu(</code><code>"13"</code><code>,</code><code>"測試菜單四"</code><code>);</code>
<code>webform.weboffice.appendmenu(</code><code>"14"</code><code>,</code><code>"測試菜單五"</code><code>);</code>
<code>//其中:“-”表示分割線,增加的順序是在現有按鈕的最前面。</code>
<code>webform.weboffice.appendmenu(</code><code>"主菜單"</code><code>,</code><code>""</code><code>);</code><code>//添加主菜單:</code>
<code>webform.weboffice.appendmenu(</code><code>"15"</code><code>,</code><code>"測試菜單七(&c)"</code><code>);</code>
<code>webform.weboffice.appendmenu(</code><code>"16"</code><code>,</code><code>"測試菜單八(&d)"</code><code>);</code>
在weboffice類中這部分代碼及判斷邏輯由js動态建構,實作菜單的可定制化。
其他方法都比較簡單,這裡不再贅餘。有了這個weboffice.js類之後隻需要簡單調用即可:
<code>ext.onready(</code><code>function</code><code>(){</code>
<code> </code><code>var</code> <code>menus=[</code><code>"save"</code><code>,</code><code>"saveas"</code><code>,</code><code>"print"</code><code>,</code><code>"signature"</code><code>];</code>
<code> </code><code>weboffice.addmenus(menus);</code>
<code> </code><code>weboffice.load();</code>
前端代碼完成了,但是伺服器端如何配合前端處理呢,下面的伺服器端處理類officeserver:
<code>using</code> <code>system;</code>
<code>using</code> <code>system.data;</code>
<code>using</code> <code>system.configuration;</code>
<code>using</code> <code>system.collections;</code>
<code>using</code> <code>system.web;</code>
<code>using</code> <code>system.web.security;</code>
<code>using</code> <code>system.web.ui;</code>
<code>using</code> <code>system.web.ui.webcontrols;</code>
<code>using</code> <code>system.web.ui.webcontrols.webparts;</code>
<code>using</code> <code>system.web.ui.htmlcontrols;</code>
<code>using</code> <code>system.io;</code>
<code>using</code> <code>system.text;</code>
<code>using</code> <code>dbstep;</code>
<code>namespace</code> <code>digitalsignature.weboffice</code>
<code>{</code>
<code> </code><code>public</code> <code>partial</code> <code>class</code> <code>officeserver : system.web.ui.page</code>
<code> </code><code>{</code>
<code> </code><code>private</code> <code>imsgserver2000 msgserver =</code><code>null</code><code>;</code><code>//伺服器端weboffice控件</code>
<code> </code><code>private</code> <code>const</code> <code>string</code> <code>_filepath =</code><code>@"document\"</code><code>;</code>
<code> </code><code>private</code> <code>const</code> <code>string</code> <code>_signaturefilepath =</code><code>@"signature\"</code><code>;</code>
<code> </code><code>private</code> <code>string</code> <code>mmarklist =</code><code>"kenshincui"</code><code>;</code>
<code> </code><code>private</code> <code>byte</code><code>[] mfilebody =</code><code>null</code><code>;</code><code>//簽章資訊</code>
<code> </code><code>private</code> <code>string</code> <code>moption;</code>
<code> </code><code>private</code> <code>string</code> <code>mrecordid;</code>
<code> </code><code>private</code> <code>string</code> <code>mtemplate;</code>
<code> </code><code>private</code> <code>string</code> <code>mfilename;</code>
<code> </code><code>private</code> <code>string</code> <code>mfiletype;</code>
<code> </code><code>private</code> <code>string</code> <code>mhtmlname;</code>
<code> </code><code>private</code> <code>string</code> <code>mdirectory;</code>
<code> </code><code>private</code> <code>string</code> <code>mlabelname;</code>
<code> </code><code>private</code> <code>string</code> <code>mimagename;</code>
<code> </code><code>private</code> <code>string</code> <code>mcommand;</code>
<code> </code><code>protected</code> <code>void</code> <code>page_load(</code><code>object</code> <code>sender, eventargs e)</code>
<code> </code><code>string</code> <code>mfilepath;</code>
<code> </code><code>string</code> <code>templatefilepath;</code>
<code> </code><code>msgserver =</code><code>new</code> <code>imsgserver2000();</code>
<code> </code><code>string</code> <code>currentpath =</code><code>"."</code><code>;</code>
<code> </code><code>msgserver.msgvariant(request.binaryread(request.contentlength));</code>
<code> </code><code>mfilepath = configurationmanager.appsettings[</code><code>"tempfile"</code><code>]; </code><code>//取得文檔的存放路徑</code>
<code> </code><code>templatefilepath = configurationmanager.appsettings[</code><code>"template"</code><code>];</code><code>//取得存放模版檔案的路徑</code>
<code> </code><code>if</code> <code>(mfilepath +</code><code>""</code> <code>==</code><code>""</code><code>)</code>
<code> </code><code>{</code>
<code> </code><code>mfilepath = server.mappath(</code><code>"/"</code><code>) +_filepath;</code>
<code> </code><code>currentpath = mfilepath;</code>
<code> </code><code>string</code> <code>n = msgserver.getmsgbyname(</code><code>"dbstep"</code><code>);</code>
<code> </code><code>if</code> <code>(n.equals(</code><code>"dbstep"</code><code>))</code>
<code> </code><code>moption = msgserver.getmsgbyname(</code><code>"option"</code><code>);</code>
<code> </code><code>if</code> <code>(moption.equals(</code><code>"loadfile"</code><code>)) </code><code>//請求調用文檔</code>
<code> </code><code>{</code>
<code> </code><code>mrecordid = msgserver.getmsgbyname(</code><code>"recordid"</code><code>); </code><code>//取得文檔編号</code>
<code> </code><code>mfilename = msgserver.getmsgbyname(</code><code>"filename"</code><code>); </code><code>//取得文檔名稱</code>
<code> </code><code>mfiletype = msgserver.getmsgbyname(</code><code>"filetype"</code><code>); </code><code>//取得文檔類型</code>
<code> </code><code>mfilepath = mfilepath + mfilename; </code><code>//取得文檔完整路徑和名稱</code>
<code> </code><code>if</code> <code>(!path.hasextension(mfilepath))</code>
<code> </code><code>{</code>
<code> </code><code>mfilepath += mfiletype;</code>
<code> </code><code>}</code>
<code> </code><code>msgserver.msgtextclear();</code>
<code> </code><code>if</code> <code>(msgserver.msgfileload(mfilepath)) </code><code>//調入文檔</code>
<code> </code><code>msgserver.setmsgbyname(</code><code>"status"</code><code>,</code><code>"打開成功!"</code><code>); </code><code>//設定狀态資訊</code>
<code> </code><code>msgserver.msgerror(</code><code>""</code><code>); </code><code>//清除錯誤資訊</code>
<code> </code><code>else</code>
<code> </code><code>msgserver.msgerror(</code><code>"打開失敗!"</code><code>); </code><code>//設定錯誤資訊</code>
<code> </code><code>else</code> <code>if</code> <code>(moption.equals(</code><code>"savefile"</code><code>)) </code><code>//請求儲存文檔</code>
<code> </code><code>if</code> <code>(msgserver.msgfilesave(mfilepath)) </code><code>//儲存文檔内容</code>
<code> </code><code>msgserver.setmsgbyname(</code><code>"status"</code><code>,</code><code>"儲存成功!"</code><code>); </code><code>//設定狀态資訊</code>
<code> </code><code>msgserver.msgerror(</code><code>"儲存失敗!"</code> <code>+ mfilename); </code><code>//設定錯誤資訊</code>
<code> </code><code>msgserver.msgfileclear();</code>
<code> </code><code>else</code> <code>if</code> <code>(moption.equals(</code><code>"loadtemplate"</code><code>)) </code><code>//請求調用模闆文檔</code>
<code> </code><code>mtemplate = msgserver.getmsgbyname(</code><code>"template"</code><code>); </code><code>//取得文檔編号</code>
<code> </code><code>mfilepath = currentpath;</code>
<code> </code><code>mcommand = msgserver.getmsgbyname(</code><code>"command"</code><code>);</code>
<code> </code><code>if</code> <code>(mcommand.equals(</code><code>"insertfile"</code><code>))</code>
<code> </code><code>msgserver.msgtextclear();</code>
<code> </code><code>if</code> <code>(msgserver.msgfileload(mfilepath + mtemplate)) </code><code>//調入模闆文檔</code>
<code> </code><code>{</code>
<code> </code><code>msgserver.setmsgbyname(</code><code>"status"</code><code>,</code><code>"打開模闆成功!"</code><code>); </code><code>//設定狀态資訊</code>
<code> </code><code>msgserver.msgerror(</code><code>""</code><code>); </code><code>//清除錯誤資訊</code>
<code> </code><code>}</code>
<code> </code><code>else</code>
<code> </code><code>msgserver.msgerror(</code><code>"打開模闆失敗!"</code><code>); </code><code>//設定錯誤資訊</code>
<code> </code><code>mfilepath = templatefilepath + mtemplate + mfiletype; </code><code>//取得文檔完整路徑和名稱</code>
<code> </code><code>file.setattributes(mfilepath, fileattributes.normal);</code>
<code> </code><code>if</code> <code>(msgserver.msgfileload(mfilepath)) </code><code>//調入模闆文檔</code>
<code> </code><code>file.setattributes(mfilepath, fileattributes.readonly | fileattributes.archive | fileattributes.compressed);</code>
<code> </code><code>else</code> <code>if</code> <code>(moption.equals(</code><code>"savetemplate"</code><code>)) </code><code>//請求儲存模闆文檔</code>
<code> </code><code>mfilepath = templatefilepath + mtemplate + mfiletype; </code><code>//取得文檔完整路徑和名稱</code>
<code> </code><code>file.setattributes(mfilepath, fileattributes.normal);</code>
<code> </code><code>if</code> <code>(msgserver.msgfilesave(mfilepath)) </code><code>//調入模闆文檔</code>
<code> </code><code>msgserver.setmsgbyname(</code><code>"status"</code><code>,</code><code>"儲存模闆成功!"</code><code>); </code><code>//設定狀态資訊</code>
<code> </code><code>msgserver.msgerror(</code><code>"儲存模闆失敗!"</code><code>); </code><code>//設定錯誤資訊</code>
<code> </code><code>file.setattributes(mfilepath, fileattributes.readonly | fileattributes.archive | fileattributes.compressed);</code>
<code> </code><code>else</code> <code>if</code> <code>(moption.equals(</code><code>"updatefile"</code><code>)) </code><code>//請求儲存文檔</code>
<code> </code><code>msgserver.setmsgbyname(</code><code>"status"</code><code>,</code><code>"儲存成功!"</code><code>); </code><code>//設定狀态資訊</code>
<code> </code><code>msgserver.msgerror(</code><code>"儲存失敗!"</code><code>); </code><code>//設定錯誤資訊</code>
<code> </code><code>else</code> <code>if</code> <code>(moption.equals(</code><code>"insertfile"</code><code>)) </code><code>//請求調用正文文檔</code>
<code> </code><code>msgserver.setmsgbyname(</code><code>"status"</code><code>,</code><code>"插入檔案成功!"</code><code>); </code><code>//設定狀态資訊</code>
<code> </code><code>msgserver.msgerror(</code><code>"插入檔案失敗!"</code><code>); </code><code>//設定錯誤資訊</code>
<code> </code><code>else</code> <code>if</code> <code>(moption.equals(</code><code>"insertimage"</code><code>)) </code><code>//請求調用正文文檔</code>
<code> </code><code>mlabelname = msgserver.getmsgbyname(</code><code>"lablename"</code><code>); </code><code>//标簽名</code>
<code> </code><code>mimagename = msgserver.getmsgbyname(</code><code>"imagename"</code><code>); </code><code>//圖檔名</code>
<code> </code><code>mfilepath = mfilepath + mimagename; </code><code>//圖檔在伺服器的完整路徑</code>
<code> </code><code>mfiletype = mimagename.substring(mimagename.length - 4, 4).tolower(); </code><code>//取得檔案的類型</code>
<code> </code><code>if</code> <code>(msgserver.msgfileload(mfilepath)) </code><code>//調入圖檔</code>
<code> </code><code>msgserver.setmsgbyname(</code><code>"imagetype"</code><code>, mfiletype); </code><code>//指定圖檔的類型</code>
<code> </code><code>msgserver.setmsgbyname(</code><code>"position"</code><code>, mlabelname); </code><code>//設定插入的位置[書簽對象名]</code>
<code> </code><code>msgserver.setmsgbyname(</code><code>"status"</code><code>,</code><code>"插入圖檔成功!"</code><code>); </code><code>//設定狀态資訊</code>
<code> </code><code>msgserver.msgerror(</code><code>"插入圖檔失敗!"</code><code>); </code><code>//設定錯誤資訊</code>
<code> </code><code>else</code> <code>if</code> <code>(moption.equals(</code><code>"saveashtml"</code><code>))</code>
<code> </code><code>mhtmlname = msgserver.getmsgbyname(</code><code>"htmlname"</code><code>); </code><code>//取得标簽文檔内容</code>
<code> </code><code>mdirectory = msgserver.getmsgbyname(</code><code>"directory"</code><code>); </code><code>//取得标簽文檔内容</code>
<code> </code><code>if</code> <code>(mdirectory.equals(</code><code>""</code><code>))</code>
<code> </code><code>mfilepath = mfilepath +</code><code>"\\html"</code><code>;</code>
<code> </code><code>mfilepath = mfilepath +</code><code>"\\html\\"</code> <code>+ mdirectory;</code>
<code> </code><code>msgserver.makedirectory(mfilepath);</code>
<code> </code><code>if</code> <code>(msgserver.msgfilesave(mfilepath +</code><code>"\\"</code> <code>+ mhtmlname))</code>
<code> </code><code>string</code> <code>txt = msgserver.msgtextbody();</code>
<code> </code><code>byte</code><code>[] bitebody = getfilebody(mfilepath +</code><code>"\\"</code> <code>+ mhtmlname);</code>
<code> </code><code>encoding encode = encoding.getencoding(</code><code>"gb2312"</code><code>);</code>
<code> </code><code>string</code> <code>html = encode.getstring(bitebody);</code>
<code> </code><code>msgserver.msgerror(</code><code>""</code><code>); </code><code>//清除錯誤資訊</code>
<code> </code><code>msgserver.setmsgbyname(</code><code>"status"</code><code>,</code><code>"儲存成功"</code><code>); </code><code>//設定狀态資訊</code>
<code> </code><code>msgserver.msgerror(</code><code>"儲存失敗"</code> <code>+ mfilepath +</code><code>"\\"</code> <code>+ mhtmlname); </code><code>//設定錯誤資訊</code>
<code> </code><code>else</code> <code>if</code> <code>(moption.equals(</code><code>"saveimage"</code><code>))</code>
<code> </code><code>mfilepath = mfilepath +</code><code>"\\htmlimage"</code><code>;</code>
<code> </code><code>mfilepath = mfilepath +</code><code>"\\htmlimage\\"</code> <code>+ mdirectory;</code>
<code> </code><code>msgserver.msgerror(</code><code>"儲存失敗"</code><code>); </code><code>//設定錯誤資訊</code>
<code> </code><code>else</code> <code>if</code> <code>(moption.equals(</code><code>"loadmarklist"</code><code>))</code><code>//擷取電子印章清單</code>
<code> </code><code>if</code> <code>(loadmarklist())</code>
<code> </code><code>{ </code><code>//獲得清單資訊mmarklist</code>
<code> </code><code>msgserver.setmsgbyname(</code><code>"marklist"</code><code>, mmarklist); </code><code>//顯示簽章清單(多個之間用換行符\r分割)</code>
<code> </code><code>msgserver.msgerror(</code><code>""</code><code>); </code><code>//清除錯誤資訊</code>
<code> </code><code>msgserver.msgerror(</code><code>"建立印章清單失敗!"</code><code>); </code><code>//設定錯誤資訊</code>
<code> </code><code>else</code> <code>if</code> <code>(moption.equals(</code><code>"loadmarkimage"</code><code>))</code><code>//打開印章檔案</code>
<code> </code><code>string</code> <code>mmarkname = msgserver.getmsgbyname(</code><code>"imagename"</code><code>); </code><code>//取得簽名名稱</code>
<code> </code><code>string</code> <code>musername = msgserver.getmsgbyname(</code><code>"username"</code><code>); </code><code>//取得使用者名稱</code>
<code> </code><code>string</code> <code>mpassword = msgserver.getmsgbyname(</code><code>"password"</code><code>); </code><code>//取得使用者密碼</code>
<code> </code><code>msgserver.msgtextclear(); </code><code>//清除文本資訊</code>
<code> </code><code>if</code> <code>(loadmarkimage(mmarkname, mpassword))</code>
<code> </code><code>//調入簽名資訊mfilebody</code>
<code> </code><code>//msgserver.setmsgbyname("imagetype", mfiletype); //設定簽名類型</code>
<code> </code><code>msgserver.setmsgbyname(</code><code>"imagetype"</code><code>,</code><code>".jpg"</code><code>); </code><code>//設定簽名類型</code>
<code> </code><code>msgserver.msgfilebody(mfilebody); </code><code>//将簽名資訊打包</code>
<code> </code><code>msgserver.setmsgbyname(</code><code>"position"</code><code>,</code><code>"manager"</code><code>); </code><code>//設定插入位置</code>
<code> </code><code>msgserver.setmsgbyname(</code><code>"status"</code><code>,</code><code>"打開成功!"</code><code>); </code><code>//設定狀态資訊</code>
<code> </code><code>msgserver.msgerror(</code><code>"簽名或密碼錯誤!"</code><code>); </code><code>//設定錯誤資訊</code>
<code> </code><code>else</code> <code>if</code> <code>(moption.equals(</code><code>"savesignature"</code><code>))</code><code>//儲存簽章資訊</code>
<code> </code><code>//mrecordid = msgserver.getmsgbyname("recordid"); //取得文檔編号</code>
<code> </code><code>//mfilename = msgserver.getmsgbyname("filename"); //取得檔案名稱</code>
<code> </code><code>//mmarkname = msgserver.getmsgbyname("markname"); //取得簽名名稱</code>
<code> </code><code>//musername = msgserver.getmsgbyname("username"); //取得使用者名稱</code>
<code> </code><code>//mdatetime = msgserver.getmsgbyname("datetime"); //取得簽名時間</code>
<code> </code><code>//mhostname = request.getremoteaddr(); //取得使用者ip</code>
<code> </code><code>//mmarkguid = msgserver.getmsgbyname("markguid"); //取得唯一編号</code>
<code> </code><code>//msgserver.msgtextclear(); //清除文本資訊</code>
<code> </code><code>//if (savesignature())</code>
<code> </code><code>//{ //儲存簽章資訊進資料庫</code>
<code> </code><code>// msgserver.setmsgbyname("status", "儲存印章成功!"); //設定狀态資訊</code>
<code> </code><code>// msgserver.msgerror(""); //清除錯誤資訊</code>
<code> </code><code>//}</code>
<code> </code><code>//else</code>
<code> </code><code>//{</code>
<code> </code><code>// msgserver.msgerror("儲存印章失敗!"); //設定錯誤資訊</code>
<code> </code><code>else</code>
<code> </code><code>msgserver.msgerror(</code><code>"error:packet message"</code><code>);</code>
<code> </code><code>msgserver.msgtextclear();</code>
<code> </code><code>msgserver.msgfileclear();</code>
<code> </code>
<code> </code><code>response.binarywrite(msgserver.msgvariant());</code>
<code> </code><code>response.end();</code>
<code> </code><code>private</code> <code>bool</code> <code>loadmarkimage(</code><code>string</code> <code>mmarkname,</code><code>object</code> <code>mpassword)</code>
<code> </code><code>if</code> <code>(signature.hasright(session[</code><code>"username"</code><code>]+</code><code>""</code><code>,mpassword.tostring()))</code>
<code> </code><code>string</code> <code>picpath = server.mappath(</code><code>"/"</code><code>) + _signaturefilepath + mmarkname +</code><code>".jpg"</code><code>;</code>
<code> </code><code>mfilebody = file.readallbytes(picpath);</code>
<code> </code><code>return</code> <code>true</code><code>;</code>
<code> </code><code>return</code> <code>false</code><code>;</code>
<code> </code><code>private</code> <code>bool</code> <code>loadmarklist()</code>
<code> </code><code>string</code> <code>tmarklist = signature.getmasklist(); </code><code>//印章清單</code>
<code> </code><code>if</code> <code>(tmarklist +</code><code>""</code> <code>!=</code><code>string</code><code>.empty)</code>
<code> </code><code>mmarklist = tmarklist;</code>
<code> </code><code>private</code> <code>byte</code><code>[] getfilebody(</code><code>string</code> <code>strfullfilename)</code>
<code> </code><code>byte</code><code>[] file =</code><code>new</code> <code>byte</code><code>[0];</code>
<code> </code><code>fileinfo finfo =</code><code>new</code> <code>fileinfo(strfullfilename);</code>
<code> </code><code>if</code> <code>(finfo.exists ==</code><code>true</code><code>)</code>
<code> </code><code>if</code> <code>((finfo.attributes & fileattributes.readonly) == fileattributes.readonly)</code>
<code> </code><code>file.setattributes(strfullfilename, fileattributes.archive);</code>
<code> </code><code>file =</code><code>new</code> <code>byte</code><code>[finfo.length];</code>
<code> </code><code>filestream fs =</code><code>new</code> <code>filestream(strfullfilename, filemode.open);</code>
<code> </code><code>fs.read(file, 0, (</code><code>int</code><code>)finfo.length);</code>
<code> </code><code>fs.close();</code>
<code> </code><code>return</code> <code>file;</code>
<code>}</code>
伺服器端主要通過imsgserver2000對象進行同前端的互動,前端執行某些操作時(注意是某些操作,并非所有操作都同伺服器端互動,具體見iweboffice白皮書)會向後端發送一個消息,伺服器端通過imsgserver2000對象的getmsgbyname()方法可以接收參數并根據不同參數配合前端做出相應的處理。例如加載文檔時,目前端js調用webopen()方法時就會向伺服器端傳遞一個名為"option"的參數,通過這個參數可以判斷要執行的操作類型,例如此時它的值等于"loadfile",伺服器端就可以知道是要打開一個文檔,當然此時也就知道它還會傳遞一些和打開文檔相關的參數(例如filename、filetype)通過這些參數,伺服器端建構一個完整的檔案路徑,然後調用msgfileload()方法加載此文檔,這時用戶端就會打開此文檔。當然,其他還有很多類似的操作,但是原理都是一樣的,包括今天要說的電子簽章。下面先看一下文檔加載的後的截圖:
在iweboffice中一個電子簽章操作包括三個互動過程,分别是:加載簽章清單(loadmarklist)、加載簽章檔案(loadmarkimage)、儲存簽章資訊(savesignature)。
loadmarklist是加載簽章清單的過程,在這個過程中伺服器端需要通過imsgserver2000對象的setmsgbyname()方法給用戶端傳遞一個清單字元串(多個簽章中間用換行符分割)。
loadmarkimage是加載簽章檔案的過程,有了簽章名稱用戶端就可以選擇相應的簽章,但是選擇了簽章名稱之後需要加載對應的簽章檔案(事實上是一個圖檔),加載簽章檔案的過程就發生這個階段。在這個過程中伺服器端的任務就是根據簽章名稱加載對應的檔案,然後使用imsgserver2000對象的msgfilebody()方法将檔案的位元組流傳回給用戶端。注意這個過程中用戶端需要輸入密碼,是以簽章的權限驗證部分可以在此進行處理。
savesignature是儲存簽章資訊的過程,對于簽章操作後的資訊可以在此時進行儲存(例如文檔編号、檔案名稱、簽章名稱、簽章日期等可以在此時記錄到資料庫),在本例中由于沒有使用資料庫是以就不對簽章資訊進行儲存了。
這三個過程處理好之後,用戶端使用時隻需要調用weboffice對象的webopensignature()方法即可調出電子簽章管理界面,下面是界面視窗:
通過上面的視窗可以看出,在iweboffice中電子簽章的不僅包括印章還包括簽名、批注。從簽章清單中選擇一個簽章,然後輸入密碼,點"蓋章",此時就會從伺服器端加載對應的簽章檔案:
點選确定就可以添加到文檔中:
在看兩張手寫簽名效果:
當然添加過簽章之後需要對文檔進行儲存,不過注意文檔儲存到用戶端還是伺服器端,在本例中的"儲存"是将文檔在伺服器端進行儲存,"另存為"即儲存到用戶端。