摘要:編輯器是Web應用中常見的一個功能,但普通的在線編輯功能有限。因此,本文提出采用客戶端編輯器自動調用Microsoft Word軟件,利用Word強大的文字處理功能,解決編輯器中特殊字符處理、圖文混排等難題,并以試題庫管理系統(tǒng)中試題錄入為例,介紹了基于Word的客戶端編輯的技術實現(xiàn)。
關鍵詞:編輯器;Word;客戶端編輯器
1 引言
網絡應用中,編輯器是一個非常重要的功能。大家最常見的就是在線編輯器,它能實現(xiàn)簡單的文本錄入與編排。對于字符特殊、編排要求高的應用,如基于web的大型的公文流轉系統(tǒng)、試題庫管理系統(tǒng)等,常見的在線編輯器難以完成任務,往往采用客戶端編輯器來實現(xiàn),但開發(fā)一套獨立的客戶端編輯器,功能往往有限,而Microsoft Word是目前最好的編輯工具,因此我們提出用Microsoft Word作為編輯器。但在IE中,Word不可能直接應用,需要一個載體來調用Word軟件。本文以題庫管理系統(tǒng)中試題的錄入、編輯及試卷的輸出為例分析基于Word的客戶端編輯器的實現(xiàn)。
2客戶端編輯器的結構[1][2]
由于題庫系統(tǒng)最終需要編輯包含數(shù)學公式等特殊符號的試題并存入題庫,并且試題還需要組合成試卷,并輸出word文檔,這些功能在普通的IE下用\"在線編輯器\"是無法實現(xiàn)的,因此需開發(fā)客戶端編輯器,用戶安裝客戶端編輯器后才能實現(xiàn)試題編輯/存儲、批量導入以及將試卷輸出為word文檔等功能。
客戶端編輯器在結構上主要包括三個部分,如下圖所示。一部分是實現(xiàn)客戶端編輯器所需的各項功能的Theoleditor;另一部分是IE瀏覽器的BHO,用來使IE瀏覽器在訪問服務器,進行編輯試題、批量導入和生成word試卷等功能時啟動Theoleditor;最后一部分位于服務器端,用來接受Theoleditor上傳的各種文件和信息。
3客戶端編輯器的實現(xiàn)[3][4][5]
客戶端編輯器(Theoleditor)實現(xiàn)的關鍵問題包括Theoleditor與BHO的通訊;Theoleditor中的word操作;Theoleditor與服務器的通訊及系統(tǒng)安全性。
3.1 客戶端編輯器與BHO的通訊
客戶端編輯器需要在IE訪問特定網址的時候啟動,而BHO和Theoleditor需要進行必要的通訊,如BHO需要知道Theoleditor的正確位置,Theoleditor需要知道IE瀏覽器訪問的服務器地址、端口等信息,需要知道調用的是錄入試題、批量導入還是輸出試卷等。這里BHO獲得Theoleditor.exe的路徑,可考慮安裝客戶端編輯器時將這部分的信息寫入windows注冊表中即可。同樣,Theoleditor所需的各種基本信息也可由BHO對IE地址信息解析,并寫入注冊表,再由Theoleditor運行后讀取。
用于實現(xiàn)讀取配置信息的類為CConfigInfo.java。該類將BHO寫入注冊表的信息讀取出來供其他部分的代碼使用。配置信息存放在注冊表的HKEY_LOCAL_MACHINE\\\\Software\\\\ThetiEditor下。該類中的CConfigInfo::CConfigInfo() 構造函數(shù),負責讀取注冊表的HKEY_LOCAL_MACHINE\\\\Software\\\\ThetiEditor下的所有值的名稱和值的數(shù)據(jù),并分別存入對應的字符串數(shù)組names 和values中。代碼實現(xiàn)如下:
CConfigInfo::CConfigInfo()
{
m_LoadOK=FALSE;
HKEY hKEY;//注冊表的鍵
LPCTSTR data_Set=\"Software\\\\ThetiEditor\";
DWORD type=REG_SZ,size=1024;
//打開注冊表
long ret0=(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set,0,KEY_READ,hKEY));
if(ret0!=ERROR_SUCCESS)
{
AfxMessageBox(\"錯誤:無法打開有關的hKEY\");
return;
}
unsigned long valuenamemaxlen,valuemaxlen,valuecount;//鍵值長度/數(shù)量
::RegQueryInfoKey(hKEY,NULL,NULL,NULL,NULL,NULL,NULL,valuecount,valuenamemaxlen,valuemaxlen,NULL,NULL);//查詢注冊表下鍵值的數(shù)量/長度
unsigned int i;
for(i=0;i char name[1024]; char value[1024]; type=REG_SZ; size=1024; if(::RegEnumValue(hKEY,i,name,size,0,type,NULL,NULL)!=ERROR_NO_MORE_ITEMS){ type=REG_SZ; size=1024; ::RegQueryValueEx(hKEY,name,0,type,(BYTE*)value,size); } CString strname,strvalue; strname.Format(\"%s\",name);//格式化鍵名 strvalue.Format(\"%s\",value);//格式化鍵值 names.Add(strname); values.Add(strvalue); } ::RegCloseKey(hKEY); m_LoadOK=TRUE; } 3.2 客戶端編輯器中的word操作 Theoleditor需要實現(xiàn)word文檔的打開、另存、文檔的拷貝、粘貼、向表格中插入數(shù)據(jù)、設定頁邊距、行距等功能。由于微軟的Office提供了Automation接口,Theoleditor可通過該接口調用word,實現(xiàn)各種所需的功能。具體的實現(xiàn)可首先通過word錄制宏,然后分析宏的結構,調用對應VC中的Word包裝類的功能。 用于實現(xiàn)word操作的類為WordOperator.java。以編輯試題為例,用到的主要方法有打開當前word文檔、將word文檔另存為html文件、保存當前word文檔、退出word等。 3.3 客戶端編輯器與服務器的通訊及系統(tǒng)安全性 Theoleditor和服務器之間需要通過通訊知道所編輯的是哪一個文檔,需要上傳文檔到服務器或從服務器下載文檔。另一方面,服務器上文檔的id不能通過明碼傳輸至客戶端,否則用戶將有可能通過分析該信息獲取服務器上的其他文件。這里采用服務器提供票據(jù)給BHO,BHO將票據(jù)傳遞給Theoleditor,然后Theoleditor通過該票據(jù)與服務器通訊,以上傳和下載對應的文檔,并保證系統(tǒng)的安全。票據(jù)信息主要包括兩部分,前面一部分是通過系統(tǒng)時間產生的隨機字符串,后一部分則是系統(tǒng)時間的毫秒數(shù)。 Theoleditor與服務器的通訊主要用到文件傳輸類CfileTransfer.java,包括上傳和下載文件。上傳文件的方法為CFileTransfer::uploadFile(CString serverip,CString uri,int port,CString filepath,CString type),包括服務器地址、通用資源標志符、本地文件保存的路徑以及文件的類型;下載文件的方法為CFileTransfer::downloadFile(CString url, CString filepath,CString fullfilename),包括下載指定url的文件,并將文件存儲在filepath下,文件名通過fullfilename傳遞回去。 4 結束語 IE是目前網絡中最廣泛的一種應用,Microsoft Word則在當前是占有巨大優(yōu)勢的文字處理器,而基于Word的客戶端編輯器可以較好地將二者銜接,在普通IE下實現(xiàn)Word的自動調用,充分發(fā)揮其強大的文字處理功能。 參考文獻 [1]管恩京,陳靜.試題試卷庫系統(tǒng)的設計與實現(xiàn).第十屆全球華人計算機教育應用會議論文集. 北京:清華大學出版社,2006 [2]管恩京.大學學科試題庫及其管理系統(tǒng)的研究與設計[碩士學位論文].北京:清華大學,2007. [3]位元文化.精通視窗程序設計.西安:世界圖書出版西安公司,2000.5 [4]步行者工作室.Visual C++ 6.0高手速成.北京:兵器工業(yè)總公司,1999.6 [5]吳師通.Visual Basic 實用程序百例.北京:清華大學出版社,2000.5